diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-01 18:37:23 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-01 18:37:23 +0000 |
commit | bf751d9a94dca1b48f30a061aa09049c977fbda1 (patch) | |
tree | 511a51fe8ae9f7675e5ea148ada52cc74e9f0d15 | |
parent | 0223bf1dc25a77671618733ee7e76fba958013d8 (diff) | |
download | brdo-bf751d9a94dca1b48f30a061aa09049c977fbda1.tar.gz brdo-bf751d9a94dca1b48f30a061aa09049c977fbda1.tar.bz2 |
#651086 follow-up by carols8f: Fix cache clearing is an ineffective mess.
-rw-r--r-- | includes/common.inc | 3 | ||||
-rw-r--r-- | includes/install.core.inc | 13 | ||||
-rw-r--r-- | includes/module.inc | 4 | ||||
-rw-r--r-- | includes/update.inc | 3 | ||||
-rw-r--r-- | modules/simpletest/drupal_web_test_case.php | 3 | ||||
-rw-r--r-- | modules/simpletest/tests/module_test.module | 3 | ||||
-rw-r--r-- | modules/simpletest/tests/upgrade/upgrade.test | 3 | ||||
-rw-r--r-- | modules/system/system.admin.inc | 27 | ||||
-rw-r--r-- | modules/system/system.install | 7 | ||||
-rw-r--r-- | modules/system/system.module | 26 | ||||
-rw-r--r-- | modules/system/system.test | 67 |
11 files changed, 108 insertions, 51 deletions
diff --git a/includes/common.inc b/includes/common.inc index 0c3851411..8fda660e9 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -6544,6 +6544,9 @@ function drupal_flush_all_caches() { menu_rebuild(); node_types_rebuild(); + // Synchronize to catch any actions that were added or removed. + actions_synchronize(); + // Don't clear cache_form - in-progress form submissions may break. // Ordered so clearing the page cache will always be the last action. $core = array('cache', 'cache_filter', 'cache_bootstrap', 'cache_page'); diff --git a/includes/install.core.inc b/includes/install.core.inc index 60ab8e60f..9cbfd059c 100644 --- a/includes/install.core.inc +++ b/includes/install.core.inc @@ -1403,6 +1403,7 @@ function install_profile_modules(&$install_state) { 'operations' => $operations, 'title' => st('Installing @drupal', array('@drupal' => drupal_install_profile_distribution_name())), 'error_message' => st('The installation has encountered an error.'), + 'finished' => '_install_profile_modules_finished', ); return $batch; } @@ -1527,9 +1528,6 @@ function install_finished(&$install_state) { // registered by the install profile are registered correctly. drupal_flush_all_caches(); - // Register actions declared by any modules. - actions_synchronize(); - // Remember the profile which was used. variable_set('install_profile', drupal_get_profile()); @@ -1565,6 +1563,15 @@ function _install_module_batch($module, $module_name, &$context) { } /** + * 'Finished' callback for module installation batch. + */ +function _install_profile_modules_finished($success, $results, $operations) { + // Flush all caches to complete the module installation process. Subsequent + // installation tasks will now have full access to the profile's modules. + drupal_flush_all_caches(); +} + +/** * Checks installation requirements and reports any errors. */ function install_check_requirements($install_state) { diff --git a/includes/module.inc b/includes/module.inc index f932b7f49..71b6a5551 100644 --- a/includes/module.inc +++ b/includes/module.inc @@ -67,7 +67,7 @@ function module_list($refresh = FALSE, $bootstrap = FALSE, $sort = FALSE, $fixed else { // As this is the $refresh case, make sure that system_list() returns // fresh data. - drupal_static_reset('system_list'); + system_list_reset(); if ($bootstrap) { $list = system_list('bootstrap'); } @@ -391,7 +391,6 @@ function module_enable($module_list, $enable_dependencies = TRUE) { ->condition('name', $module) ->execute(); // Refresh the module list to include it. - system_list_reset(); module_list(TRUE); module_implements('', FALSE, TRUE); _system_update_bootstrap_status(); @@ -498,7 +497,6 @@ function module_disable($module_list, $disable_dependents = TRUE) { if (!empty($invoke_modules)) { // Refresh the module list to exclude the disabled modules. - system_list_reset(); module_list(TRUE); module_implements('', FALSE, TRUE); // Invoke hook_modules_disabled before disabling modules, diff --git a/includes/update.inc b/includes/update.inc index ff7fc696c..51504a811 100644 --- a/includes/update.inc +++ b/includes/update.inc @@ -637,6 +637,9 @@ function update_fix_d7_requirements() { db_change_field('languages', 'javascript', 'javascript', array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => '')); } + // Rename action description to label. + db_change_field('actions', 'description', 'label', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '0')); + variable_set('update_d7_requirements', TRUE); } diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php index d75f761d6..a8692464b 100644 --- a/modules/simpletest/drupal_web_test_case.php +++ b/modules/simpletest/drupal_web_test_case.php @@ -1315,9 +1315,6 @@ class DrupalWebTestCase extends DrupalTestCase { drupal_static_reset(); drupal_flush_all_caches(); - // Register actions declared by any modules. - actions_synchronize(); - // Reload global $conf array and permissions. $this->refreshVariables(); $this->checkPermissions(array(), TRUE); diff --git a/modules/simpletest/tests/module_test.module b/modules/simpletest/tests/module_test.module index 82df306e7..facac7cfa 100644 --- a/modules/simpletest/tests/module_test.module +++ b/modules/simpletest/tests/module_test.module @@ -36,6 +36,9 @@ function module_test_system_info_alter(&$info, $file, $type) { $info['dependencies'][] = 'php'; } } + if ($file->name == 'seven' && $type == 'theme') { + $info['regions']['test_region'] = t('Test region'); + } } /** diff --git a/modules/simpletest/tests/upgrade/upgrade.test b/modules/simpletest/tests/upgrade/upgrade.test index 481f7b90a..3d463c95f 100644 --- a/modules/simpletest/tests/upgrade/upgrade.test +++ b/modules/simpletest/tests/upgrade/upgrade.test @@ -283,9 +283,6 @@ abstract class UpgradePathTestCase extends DrupalWebTestCase { drupal_static_reset(); drupal_flush_all_caches(); - // Register actions declared by any modules. - actions_synchronize(); - // Reload global $conf array and permissions. $this->refreshVariables(); $this->checkPermissions(array(), TRUE); diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc index cafe079bd..868bd4315 100644 --- a/modules/system/system.admin.inc +++ b/modules/system/system.admin.inc @@ -1168,6 +1168,7 @@ function system_modules_submit($form, &$form_state) { if ($module['enabled']) { if (drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) { $actions['install'][] = $name; + $actions['enable'][] = $name; } elseif (!module_exists($name)) { $actions['enable'][] = $name; @@ -1183,37 +1184,27 @@ function system_modules_submit($form, &$form_state) { $pre_install_list = module_list(); unset($form_state['storage']); + // Reverse the 'enable' list, to order dependencies before dependents. + rsort($actions['enable']); + // Installs, enables, and disables modules. - module_enable($actions['enable']); - module_disable($actions['disable']); - module_enable($actions['install']); + module_enable($actions['enable'], FALSE); + module_disable($actions['disable'], FALSE); - // Gets module list after install process, displays message if there are changes. + // Gets module list after install process, flushes caches and displays a + // message if there are changes. $post_install_list = module_list(TRUE); if ($pre_install_list != $post_install_list) { + drupal_flush_all_caches(); drupal_set_message(t('The configuration options have been saved.')); } - // Clear all caches. - registry_rebuild(); - system_rebuild_theme_data(); - drupal_theme_rebuild(); - node_types_rebuild(); - menu_rebuild(); - cache_clear_all('schema', 'cache'); - entity_info_cache_clear(); - drupal_clear_css_cache(); - drupal_clear_js_cache(); - $form_state['redirect'] = 'admin/modules'; // Notify locale module about module changes, so translations can be // imported. This might start a batch, and only return to the redirect // path after that. module_invoke('locale', 'system_update', $actions['install']); - - // Synchronize to catch any actions that were added or removed. - actions_synchronize(); } /** diff --git a/modules/system/system.install b/modules/system/system.install index fc6ff52a9..4caeaa94e 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -2246,13 +2246,6 @@ function system_update_7036() { } /** - * Rename action description to label. - */ -function system_update_7037() { - db_change_field('actions', 'description', 'label', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '0')); -} - -/** * Upgrade the {url_alias} table and create a cache bin for path aliases. */ function system_update_7042() { diff --git a/modules/system/system.module b/modules/system/system.module index ce555c927..815383bcb 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -2601,23 +2601,21 @@ function system_find_base_themes($themes, $key, $used_keys = array()) { * An array of regions in the form $region['name'] = 'description'. */ function system_region_list($theme_key, $show = REGIONS_ALL) { - $list = &drupal_static(__FUNCTION__, array()); + $themes = list_themes(); + if (!isset($themes[$theme_key])) { + return array(); + } - if (empty($list[$theme_key][$show])) { - $themes = list_themes(); - if (!isset($themes[$theme_key])) { - $list[$theme_key][$show] = array(); - return $list[$theme_key][$show]; - } - $info = $themes[$theme_key]->info; - // If requested, suppress hidden regions. See block_admin_display_form(). - foreach ($info['regions'] as $name => $label) { - if ($show == REGIONS_ALL || !isset($info['regions_hidden']) || !in_array($name, $info['regions_hidden'])) { - $list[$theme_key][$show][$name] = $label; - } + $list = array(); + $info = $themes[$theme_key]->info; + // If requested, suppress hidden regions. See block_admin_display_form(). + foreach ($info['regions'] as $name => $label) { + if ($show == REGIONS_ALL || !isset($info['regions_hidden']) || !in_array($name, $info['regions_hidden'])) { + $list[$name] = $label; } } - return $list[$theme_key][$show]; + + return $list; } /** diff --git a/modules/system/system.test b/modules/system/system.test index 3946199ec..44768352d 100644 --- a/modules/system/system.test +++ b/modules/system/system.test @@ -1667,6 +1667,73 @@ array_space[a b] = Value'; } /** + * Tests the effectiveness of hook_system_info_alter(). + */ +class SystemInfoAlterTestCase extends DrupalWebTestCase { + public static function getInfo() { + return array( + 'name' => 'System info alter', + 'description' => 'Tests the effectiveness of hook_system_info_alter().', + 'group' => 'System', + ); + } + + /** + * Tests that {system}.info is rebuilt after a module that implements + * hook_system_info_alter() is enabled. Also tests if core *_list() functions + * return freshly altered info. + */ + function testSystemInfoAlter() { + // Enable our test module. Flush all caches, which we assert is the only + // thing necessary to use the rebuilt {system}.info. + module_enable(array('module_test'), FALSE); + drupal_flush_all_caches(); + $this->assertTrue(module_exists('module_test'), t('Test module is enabled.')); + + $info = $this->getSystemInfo('seven', 'theme'); + $this->assertTrue(isset($info['regions']['test_region']), t('Altered theme info was added to {system}.info.')); + $seven_regions = system_region_list('seven'); + $this->assertTrue(isset($seven_regions['test_region']), t('Altered theme info was returned by system_region_list().')); + $system_list_themes = system_list('theme'); + $info = $system_list_themes['seven']->info; + $this->assertTrue(isset($info['regions']['test_region']), t('Altered theme info was returned by system_list().')); + $list_themes = list_themes(); + $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), t('Altered theme info was returned by list_themes().')); + + // Disable the module and verify that {system}.info is rebuilt without it. + module_disable(array('module_test'), FALSE); + drupal_flush_all_caches(); + $this->assertFalse(module_exists('module_test'), t('Test module is disabled.')); + + $info = $this->getSystemInfo('seven', 'theme'); + $this->assertFalse(isset($info['regions']['test_region']), t('Altered theme info was removed from {system}.info.')); + $seven_regions = system_region_list('seven'); + $this->assertFalse(isset($seven_regions['test_region']), t('Altered theme info was not returned by system_region_list().')); + $system_list_themes = system_list('theme'); + $info = $system_list_themes['seven']->info; + $this->assertFalse(isset($info['regions']['test_region']), t('Altered theme info was not returned by system_list().')); + $list_themes = list_themes(); + $this->assertFalse(isset($list_themes['seven']->info['regions']['test_region']), t('Altered theme info was not returned by list_themes().')); + } + + /** + * Returns the info array as it is stored in {system}. + * + * @param $name + * The name of the record in {system}. + * @param $type + * The type of record in {system}. + * + * @return + * Array of info, or FALSE if the record is not found. + */ + function getSystemInfo($name, $type) { + $raw_info = db_query("SELECT info FROM {system} WHERE name = :name AND type = :type", array(':name' => $name, ':type' => $type))->fetchField(); + return $raw_info ? unserialize($raw_info) : FALSE; + } +} + +/** * Tests for the update system functionality. */ class UpdateScriptFunctionalTest extends DrupalWebTestCase { |