diff --git a/src/ConfigRewriter.php b/src/ConfigRewriter.php index d34caee..16b8d53 100644 --- a/src/ConfigRewriter.php +++ b/src/ConfigRewriter.php @@ -102,43 +102,65 @@ class ConfigRewriter implements ConfigRewriterInterface { if (file_exists($rewrite_dir) && $files = $this->fileScanDirectory($rewrite_dir, '/^.*\.yml$/i', ['recurse' => FALSE])) { foreach ($files as $file) { // Parse the rewrites and retrieve the original config. - $rewrite = Yaml::parse(file_get_contents($rewrite_dir . DIRECTORY_SEPARATOR . $file->name . '.yml')); + $rewrite_data = Yaml::parse(file_get_contents($rewrite_dir . DIRECTORY_SEPARATOR . $file->name . '.yml')); if ($langcode) { /** @var \Drupal\language\Config\LanguageConfigOverride $original_config */ $config = $this->languageConfigFactoryOverride->getOverride($langcode, $file->name); $original_data = $config->get(); - $rewrite = $this->rewriteConfig($original_data, $rewrite); } else { $config = $this->configFactory->getEditable($file->name); $original_data = $config->getRawData(); - $rewrite = $this->rewriteConfig($original_data, $rewrite); } - // Unset 'config_rewrite' key before saving rewritten values. - if (isset($rewrite['config_rewrite'])) { - unset($rewrite['config_rewrite']); + // Set the config changes based on new data from parsed rewrites. + if (!empty($original_data) && ($rewrite_data != $original_data)) { + $rewrite = $this->rewriteConfig($original_data, $rewrite_data); } - - // Retain the original 'uuid' and '_core' keys if it's not explicitly - // asked to rewrite them. - if (isset($rewrite['config_rewrite_uuids'])) { - unset($rewrite['config_rewrite_uuids']); + elseif($rewrite_data == $original_data) { + $this->logger->notice('@config has no changes to write.', ['@config' => $file->name]); } - else { - foreach (['_core', 'uuid'] as $key) { - if (isset($original_data[$key])) { - $rewrite[$key] = $original_data[$key]; + elseif(empty($original_data)) { + $this->logger->notice('@config does not exist to rewrite.', ['@config' => $file->name]); + } + + // Save the rewritten configuration data (or don't). + if (isset($rewrite)) { + // Unset 'config_rewrite' key before saving rewritten values. + if (isset($rewrite['config_rewrite'])) { + unset($rewrite['config_rewrite']); + } + + // Retain the original 'uuid' and '_core' keys if it's not explicitly + // asked to rewrite them. + if (isset($rewrite['config_rewrite_uuids'])) { + unset($rewrite['config_rewrite_uuids']); + } + else { + foreach (['_core', 'uuid'] as $key) { + if (isset($original_data[$key])) { + $rewrite[$key] = $original_data[$key]; + } } } - } - // Save the rewritten configuration data. - $result = $config->setData($rewrite)->save() ? 'rewritten' : 'not rewritten'; + // Attempt to save the configuration rewrite. + $result = $config->setData($rewrite)->save() ? 'rewritten' : 'not rewritten'; + + // Log a message indicating whether the config rewrite was saved or not. + $log = $langcode ? '@config (@langcode) @result by @module' : '@config @result by @module'; + $this->logger->notice($log, [ + '@config' => $file->name, + '@result' => $result, + '@module' => $extension->getName() + ]); - // Log a message indicating whether the config was rewritten or not. - $log = $langcode ? '@config (@langcode) @result by @module' : '@config @result by @module'; - $this->logger->notice($log, ['@config' => $file->name, '@result' => $result, '@module' => $extension->getName()]); + // Do not retain previous rewrites in the next iteration of our loop. + unset($rewrite); + } + else { + $this->logger->notice('@config was not rewritten', ['@config' => $file->name]); + } } } } diff --git a/tests/modules/config_rewrite_test_rewrite/config/rewrite/user.role.test5.yml b/tests/modules/config_rewrite_test_rewrite/config/rewrite/user.role.test5.yml new file mode 100644 index 0000000..c96c41f --- /dev/null +++ b/tests/modules/config_rewrite_test_rewrite/config/rewrite/user.role.test5.yml @@ -0,0 +1,9 @@ +langcode: en +status: true +dependencies: { } +id: test5 +label: "Test 5 'replaces' nothing and should not import!" +weight: 0 +is_admin: false +permissions: + - 'change own username' diff --git a/tests/src/Kernel/ConfigRewriteTest.php b/tests/src/Kernel/ConfigRewriteTest.php index 7144f8f..350857f 100644 --- a/tests/src/Kernel/ConfigRewriteTest.php +++ b/tests/src/Kernel/ConfigRewriteTest.php @@ -133,6 +133,10 @@ class ConfigRewriteTest extends KernelTestBase { ]; $user_role = $this->languageConfigFactoryOverride->getOverride('fr', 'user.role.test4')->get(); $this->assertEquals($user_role['label'], $expected_rewritten_data['label']); + + // Test for non-existing config being accidentally written by a "rewrite." + $this->assertFalse($this->activeConfigStorage->read('user.role.test5')); + } }