From 4dafb3953cabb0911286e6d683b495f6e1c43238 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Sun, 28 Jun 2009 03:56:43 +0000
Subject: [PATCH] #482346 by Berdir: Move module installation logic to
 module_enable() to prevent errors upon enabling modules.

---
 includes/install.inc        |  6 +-----
 includes/module.inc         | 13 ++++++++++++-
 modules/node/node.admin.inc |  8 ++++++++
 modules/system/system.test  |  1 +
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/includes/install.inc b/includes/install.inc
index b618594c8adf..450f7cd55612 100644
--- a/includes/install.inc
+++ b/includes/install.inc
@@ -516,11 +516,7 @@ function drupal_install_modules($module_list = array(), $disable_modules_install
   } while ($moved);
   asort($module_list);
   $module_list = array_keys($module_list);
-  $modules_installed = array_filter($module_list, '_drupal_install_module');
-  if (!$disable_modules_installed_hook && !empty($modules_installed)) {
-    module_invoke_all('modules_installed', $modules_installed);
-  }
-  module_enable($module_list);
+  module_enable($module_list, $disable_modules_installed_hook);
 }
 
 /**
diff --git a/includes/module.inc b/includes/module.inc
index a8a878cb6b75..ce8470962204 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -177,9 +177,15 @@ function module_load_all_includes($type, $name = NULL) {
  *
  * @param $module_list
  *   An array of module names.
+ * @param $disable_modules_installed_hook
+ *   Normally just testing wants to set this to TRUE.
  */
-function module_enable($module_list) {
+function module_enable($module_list, $disable_modules_installed_hook = FALSE) {
   $invoke_modules = array();
+  
+  // Try to install the enabled modules and collect which were installed.
+  // $module_list is not changed and already installed modules are ignored.
+  $modules_installed = array_filter($module_list, '_drupal_install_module');
   foreach ($module_list as $module) {
     $existing = db_query("SELECT status FROM {system} WHERE type = :type AND name = :name", array(
       ':type' => 'module',
@@ -203,6 +209,11 @@ function module_enable($module_list) {
     module_list(TRUE);
     // Force to regenerate the stored list of hook implementations.
     registry_rebuild();
+
+    // If any modules were newly installed, execute the hook for them.
+    if (!$disable_modules_installed_hook && !empty($modules_installed)) {
+      module_invoke_all('modules_installed', $modules_installed);
+    }
   }
 
   foreach ($invoke_modules as $module) {
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc
index dbddaea1e8b8..62f49382b7b0 100644
--- a/modules/node/node.admin.inc
+++ b/modules/node/node.admin.inc
@@ -634,3 +634,11 @@ function node_multiple_delete_confirm_submit($form, &$form_state) {
   $form_state['redirect'] = 'admin/content/node';
   return;
 }
+
+/**
+ * Implement hook_modules_installed()
+ */
+function node_modules_installed($modules) {
+  // Clear node type cache for node permissions.
+  node_type_clear();
+}
\ No newline at end of file
diff --git a/modules/system/system.test b/modules/system/system.test
index 17694ca98b78..b62a6c74b7b9 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -113,6 +113,7 @@ class EnableDisableTestCase extends ModuleTestCase {
     // Install (and enable) aggregator module.
     $edit = array();
     $edit['modules[Core][aggregator][enable]'] = 'aggregator';
+    $edit['modules[Core][forum][enable]'] = 'forum';
     $this->drupalPost('admin/build/modules', $edit, t('Save configuration'));
     $this->assertText(t('The configuration options have been saved.'), t('Modules status has been updated.'));
 
-- 
GitLab