From c76655c98bc19acd2a7a023d23bb23564f5fa777 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Wed, 24 Nov 2010 16:47:44 +0000
Subject: [PATCH] - Patch #794936 by c960657, amateescu:
 system_rebuild_module_data() called twice on admin/build/modules.

---
 includes/module.inc                  |  1 +
 modules/simpletest/tests/module.test |  2 ++
 modules/system/system.module         | 19 +++++++++++++------
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/includes/module.inc b/includes/module.inc
index a65a4326b725..a97df7146b53 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -193,6 +193,7 @@ function system_list($type) {
  */
 function system_list_reset() {
   drupal_static_reset('system_list');
+  drupal_static_reset('system_rebuild_module_data');
   drupal_static_reset('list_themes');
   cache_clear_all('bootstrap_modules', 'cache_bootstrap');
   cache_clear_all('system_list', 'cache_bootstrap');
diff --git a/modules/simpletest/tests/module.test b/modules/simpletest/tests/module.test
index e8da1a2de3e5..d3e3dbf1b754 100644
--- a/modules/simpletest/tests/module.test
+++ b/modules/simpletest/tests/module.test
@@ -127,6 +127,7 @@ class ModuleUnitTest extends DrupalWebTestCase {
     // First, create a fake missing dependency. Forum depends on poll, which
     // depends on a made-up module, foo. Nothing should be installed.
     variable_set('dependency_test', 'missing dependency');
+    drupal_static_reset('system_rebuild_module_data');
     $result = module_enable(array('forum'));
     $this->assertFalse($result, t('module_enable() returns FALSE if dependencies are missing.'));
     $this->assertFalse(module_exists('forum'), t('module_enable() aborts if dependencies are missing.'));
@@ -134,6 +135,7 @@ class ModuleUnitTest extends DrupalWebTestCase {
     // Now, fix the missing dependency. Forum module depends on poll, but poll
     // depends on the PHP module. module_enable() should work.
     variable_set('dependency_test', 'dependency');
+    drupal_static_reset('system_rebuild_module_data');
     $result = module_enable(array('forum'));
     $this->assertTrue($result, t('module_enable() returns the correct value.'));
     // Verify that the fake dependency chain was installed.
diff --git a/modules/system/system.module b/modules/system/system.module
index 98df4868bd7c..13aa1c06cda0 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2361,12 +2361,19 @@ function _system_rebuild_module_data() {
  *   Array of all available modules and their data.
  */
 function system_rebuild_module_data() {
-  $modules = _system_rebuild_module_data();
-  ksort($modules);
-  system_get_files_database($modules, 'module');
-  system_update_files_database($modules, 'module');
-  $modules = _module_build_dependencies($modules);
-  return $modules;
+  $modules_cache = &drupal_static(__FUNCTION__);
+  // Only rebuild once per request. $modules and $modules_cache cannot be
+  // combined into one variable, because the $modules_cache variable is reset by
+  // reference from system_list_reset() during the rebuild.
+  if (!isset($modules_cache)) {
+    $modules = _system_rebuild_module_data();
+    ksort($modules);
+    system_get_files_database($modules, 'module');
+    system_update_files_database($modules, 'module');
+    $modules = _module_build_dependencies($modules);
+    $modules_cache = $modules;
+  }
+  return $modules_cache;
 }
 
 /**
-- 
GitLab