diff --git a/core/includes/config.inc b/core/includes/config.inc index 5e07c54..afc6a31 100644 --- a/core/includes/config.inc +++ b/core/includes/config.inc @@ -152,8 +152,64 @@ function config_import() { // or site builders attempt to do it without coordinating. return FALSE; } - $success = TRUE; + + // LOLWUT we don't check if these files are in create or delete. + // Check for any module enable or disable changes. + $source_enabled_modules = $source_storage->read('system.module'); + $target_enabled_modules = $target_storage->read('system.module'); + $module_changes = array(); + if (($system_module_key = array_search('system.module', $config_changes['change'])) !== FALSE) { + // Get the list of modules to enable. + $module_changes['enable'] = array_diff_key($source_enabled_modules['enabled'], $target_enabled_modules['enabled']); + $module_changes['disable'] = array_diff_key($target_enabled_modules['enabled'], $source_enabled_modules['enabled']); + // Unset 'system.module' from $config_changes['change'], because + // module_enable() / module_disable() will take care of writing + // out the changd configuration file. + unset($config_changes['change'][$system_module_key]); + } + + if (($system_module_disabled_key = array_search('system.module.disabled', $config_changes['change'])) !== FALSE) { + // Check to see if we have modules that appear in the source + // 'system.module.disabled' that don't exist in target 'system.module'. + // In this case, we need to enable then immediately disable the module. + // Or maybe just blow up. LOLWUT cool huh? + $modules_to_enable_then_disable = array_keys(array_diff_key($source_storage->read('system.module.disabled'), $target_enabled_modules['enabled'])); + if (!empty($modules_to_enable_then_disable)) { + module_enable($modules_to_enable_then_disable, FALSE); + module_disable($modules_to_enable_then_disable, FALSE); + } + unset($config_changes['change'][$system_module_disabled_key]); + } + + if (!empty($module_changes['enable'])) { + module_enable(array_keys($module_changes['enable']), FALSE); + // LOLWUT we have to set the module weight ourselves. + foreach ($module_changes['enable'] as $module => $weight) { + module_set_weight($module, $weight); + } + } + + if (!empty($module_changes['disable'])) { + $modules_to_disable = array_keys($module_changes['disable']); + module_disable($modules_to_disable, FALSE); + + // Check to see if there are modules that we just disabled that aren't in + // 'system.module.disabled'. In that case, we need to pass them through + // module_uninstall(). + $modules_to_uninstall = array_diff($modules_to_disable, $source_storage->read('system.module.disabled')); + if (!empty($modules_to_uninstall)) { + module_uninstall($modules_to_uninstall, FALSE); + } + } + + // Because we unset some keys in $config_changes, check if we need to just + // bail at this point. + if (empty($config_changes['create']) && empty($config_changes['change']) && empty($config_changes['delete'])) { + lock()->release(__FUNCTION__); + return $success; + } + try { $remaining_changes = config_import_invoke_owner($config_changes, $source_storage, $target_storage); config_sync_changes($remaining_changes, $source_storage, $target_storage); diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php index b659ace..2de71ee 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php @@ -37,6 +37,81 @@ function setUp() { } /** + * Tests enabling a module via a config import. + */ + function testNewEnabledModuleImport() { + config_export(); + + $enabled_modules = config('system.module')->get(); + $enabled_modules['enabled']['config_test_module_import'] = '5'; + $this->container->get('config.storage.staging') + ->write('system.module', $enabled_modules); + + config_import(); + + $config = config('system.module'); + $this->assertEqual('5', $config->get('enabled.config_test_module_import'), "The config_test_module_import was enabled, and weight set to 5."); + } + + /** + * Tests disabling a module via a config import. + */ + function testDisabledModuleImport() { + config_export(); + module_enable(array('config_test_module_import')); + $enabled_modules = config('system.module')->get(); + $this->assertEqual(TRUE, array_key_exists('config_test_module_import', $enabled_modules['enabled']), "The config_test_module_import is enabled."); + + $disabled_modules = config('system.module.disabled')->get(); + $disabled_modules['config_test_module_import'] = ''; + $this->container->get('config.storage.staging') + ->write('system.module.disabled', $disabled_modules); + + config_import(); + + $enabled_modules = config('system.module')->get(); + $this->assertEqual(FALSE, array_key_exists('config_test_module_import', $enabled_modules['enabled']), "The config_test_module_import was disabled."); + } + + /** + * Tests uninstalling a module via a config import. + */ + function testUninstalledModuleImport() { + config_export(); + module_enable(array('config_test_module_import')); + $enabled_modules = config('system.module')->get(); + $this->assertEqual(TRUE, array_key_exists('config_test_module_import', $enabled_modules['enabled']), "The config_test_module_import is enabled."); + + config_import(); + + $enabled_modules = config('system.module')->get(); + $this->assertEqual(FALSE, array_key_exists('config_test_module_import', $enabled_modules['enabled']), "The config_test_module_import was uninstalled."); + $disabled_modules = config('system.module')->get(); + $this->assertEqual(FALSE, array_key_exists('config_test_module_import', $disabled_modules), "The config_test_module_import was uninstalled."); + } + + /** + * Tests enabling then disabling a module via a config import. + */ + function testModuleInDisabledListModuleImportLolWut() { + $enabled_modules = config('system.module')->get(); + $disabled_modules = config('system.module.disabled')->get(); + $this->assertEqual(FALSE, array_key_exists('config_test_module_import', $enabled_modules['enabled']), "The config_test_module_import is not enabled."); + $this->assertEqual(FALSE, array_key_exists('config_test_module_import', $disabled_modules), "The config_test_module_import is not disabled."); + config_export(); + + $disabled_modules = config('system.module.disabled')->get(); + $disabled_modules['config_test_module_import'] = ''; + $this->container->get('config.storage.staging') + ->write('system.module.disabled', $disabled_modules); + + config_import(); + + $disabled_modules = config('system.module.disabled')->get(); + $this->assertEqual(TRUE, array_key_exists('config_test_module_import', $disabled_modules), "The config_test_module_import was enabled then disabled."); + } + + /** * Tests omission of module APIs for bare configuration operations. */ function testNoImport() { diff --git a/core/modules/config/tests/config_test/config/config_test.system.module.yml b/core/modules/config/tests/config_test/config/config_test.system.module.yml new file mode 100644 index 0000000..91e1875 --- /dev/null +++ b/core/modules/config/tests/config_test/config/config_test.system.module.yml @@ -0,0 +1,2 @@ +enabled: + config_test_module_import: '5' diff --git a/core/modules/config/tests/config_test_module_import/config_test_module_import.info b/core/modules/config/tests/config_test_module_import/config_test_module_import.info new file mode 100644 index 0000000..32e224f --- /dev/null +++ b/core/modules/config/tests/config_test_module_import/config_test_module_import.info @@ -0,0 +1,5 @@ +name = Configuration module import test module +package = Core +version = VERSION +core = 8.x +hidden = TRUE diff --git a/core/modules/config/tests/config_test_module_import/config_test_module_import.module b/core/modules/config/tests/config_test_module_import/config_test_module_import.module new file mode 100644 index 0000000..e12bb0b --- /dev/null +++ b/core/modules/config/tests/config_test_module_import/config_test_module_import.module @@ -0,0 +1,7 @@ +