? .cvsignore
? .project
? .settings
? install.log
? install_log.php
? test.php
? sites/default/files
? sites/default/private
? sites/default/settings.php
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.1228
diff -u -p -r1.1228 common.inc
--- includes/common.inc	26 Sep 2010 23:31:35 -0000	1.1228
+++ includes/common.inc	27 Sep 2010 22:35:26 -0000
@@ -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');
Index: includes/install.core.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.core.inc,v
retrieving revision 1.34
diff -u -p -r1.34 install.core.inc
--- includes/install.core.inc	24 Sep 2010 21:36:22 -0000	1.34
+++ includes/install.core.inc	27 Sep 2010 22:35:27 -0000
@@ -1403,6 +1403,7 @@ function install_profile_modules(&$insta
     '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;
 }
@@ -1565,6 +1566,15 @@ function _install_module_batch($module, 
 }
 
 /**
+ * '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) {
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.198
diff -u -p -r1.198 module.inc
--- includes/module.inc	3 Sep 2010 19:49:55 -0000	1.198
+++ includes/module.inc	27 Sep 2010 22:35:27 -0000
@@ -67,7 +67,7 @@ function module_list($refresh = FALSE, $
     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');
       }
@@ -179,6 +179,7 @@ function system_list($type) {
  */
 function system_list_reset() {
   drupal_static_reset('system_list');
+  drupal_static_reset('system_region_list');
   drupal_static_reset('list_themes');
   cache_clear_all('bootstrap_modules', 'cache_bootstrap');
   cache_clear_all('system_list', 'cache_bootstrap');
@@ -391,7 +392,6 @@ function module_enable($module_list, $en
         ->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 +498,6 @@ function module_disable($module_list, $d
 
   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,
Index: includes/update.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/update.inc,v
retrieving revision 1.69
diff -u -p -r1.69 update.inc
--- includes/update.inc	25 Sep 2010 18:10:53 -0000	1.69
+++ includes/update.inc	27 Sep 2010 22:35:27 -0000
@@ -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);
   }
 
Index: modules/simpletest/tests/module_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/module_test.module,v
retrieving revision 1.6
diff -u -p -r1.6 module_test.module
--- modules/simpletest/tests/module_test.module	22 Apr 2010 18:56:31 -0000	1.6
+++ modules/simpletest/tests/module_test.module	27 Sep 2010 22:35:27 -0000
@@ -36,6 +36,9 @@ function module_test_system_info_alter(&
       $info['dependencies'][] = 'php';
     }
   }
+  if ($file->name == 'seven' && $type == 'theme') {
+    $info['regions']['test_region'] = t('Test region');
+  }
 }
 
 /**
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.309
diff -u -p -r1.309 system.admin.inc
--- modules/system/system.admin.inc	24 Sep 2010 21:36:22 -0000	1.309
+++ modules/system/system.admin.inc	27 Sep 2010 22:35:27 -0000
@@ -1224,6 +1224,7 @@ function system_modules_submit($form, &$
     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;
@@ -1239,37 +1240,27 @@ function system_modules_submit($form, &$
   $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();
 }
 
 /**
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.509
diff -u -p -r1.509 system.install
--- modules/system/system.install	25 Sep 2010 18:10:53 -0000	1.509
+++ modules/system/system.install	27 Sep 2010 22:35:28 -0000
@@ -2249,7 +2249,7 @@ 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'));
+  // Moved to update_fix_d7_requirements().
 }
 
 /**
Index: modules/system/system.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.test,v
retrieving revision 1.143
diff -u -p -r1.143 system.test
--- modules/system/system.test	24 Sep 2010 00:37:44 -0000	1.143
+++ modules/system/system.test	27 Sep 2010 22:35:28 -0000
@@ -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().'));
+  }
+
+  /**
+   * Support function. 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 {
