From ce19c671106df767202972d22736db3582f6423b Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Mon, 21 Jun 2010 02:27:47 +0000
Subject: [PATCH] #293223 follow-up by David_Rothstein: Roll back 'Hide
 required core modules'. This was removing useful information to both new and
 experienced site builders, as well as hiding critical 'help' links.

---
 includes/install.inc                            | 14 ++++++++++++--
 modules/field/field.info                        |  2 +-
 .../field_sql_storage/field_sql_storage.info    |  2 +-
 modules/field/modules/list/list.info            |  2 +-
 modules/field/modules/number/number.info        |  2 +-
 modules/field/modules/options/options.info      |  2 +-
 modules/field/modules/text/text.info            |  2 +-
 modules/system/system.admin.inc                 | 12 +++++++++++-
 modules/system/system.module                    |  6 ++++++
 modules/system/system.test                      | 17 +++++++++++++----
 10 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/includes/install.inc b/includes/install.inc
index c5083eb0a24b..9d159a7fd76a 100644
--- a/includes/install.inc
+++ b/includes/install.inc
@@ -187,8 +187,18 @@ function drupal_set_installed_schema_version($module, $version) {
  * @see install_profile_info()
  */
 function drupal_install_profile_distribution_name() {
-  global $install_state;
-  return $install_state['profile_info']['distribution_name'];
+  // During installation, the profile information is stored in the global
+  // installation state (it might not be saved anywhere yet).
+  if (drupal_installation_attempted()) {
+    global $install_state;
+    return $install_state['profile_info']['distribution_name'];
+  }
+  // At all other times, we load the profile via standard methods.
+  else {
+    $profile = drupal_get_profile();
+    $info = install_profile_info($profile);
+    return $info['distribution_name'];
+  }
 }
 
 /**
diff --git a/modules/field/field.info b/modules/field/field.info
index 97ce7d7d8283..60c429778df0 100644
--- a/modules/field/field.info
+++ b/modules/field/field.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = Field
 description = Field API to add fields to entities like nodes and users.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[] = field.module
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.info b/modules/field/modules/field_sql_storage/field_sql_storage.info
index 5587fbe32c1c..32c09afdccd5 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.info
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = Field SQL storage
 description = Stores field data in an SQL database.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[] = field_sql_storage.module
diff --git a/modules/field/modules/list/list.info b/modules/field/modules/list/list.info
index bf4bb8182007..3033bf894274 100644
--- a/modules/field/modules/list/list.info
+++ b/modules/field/modules/list/list.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = List
 description = Defines list field types. Use with Options to create selection lists.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[]=list.module
diff --git a/modules/field/modules/number/number.info b/modules/field/modules/number/number.info
index 314506807026..b1fd79878651 100644
--- a/modules/field/modules/number/number.info
+++ b/modules/field/modules/number/number.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = Number
 description = Defines numeric field types.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[]=number.module
diff --git a/modules/field/modules/options/options.info b/modules/field/modules/options/options.info
index 289ef48f8fe6..48b654ecb8c6 100644
--- a/modules/field/modules/options/options.info
+++ b/modules/field/modules/options/options.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = Options
 description = Defines selection, check box and radio button widgets for text and numeric fields.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[]=options.module
diff --git a/modules/field/modules/text/text.info b/modules/field/modules/text/text.info
index 9d3156624e6a..07ae87b52945 100644
--- a/modules/field/modules/text/text.info
+++ b/modules/field/modules/text/text.info
@@ -1,7 +1,7 @@
 ; $Id$
 name = Text
 description = Defines simple text field types.
-package = Core - fields
+package = Core
 version = VERSION
 core = 7.x
 files[] = text.module
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index 32490fee2319..152d2982c6e7 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -828,7 +828,7 @@ function system_modules($form, $form_state = array()) {
   // Remove hidden modules from display list.
   $visible_files = $files;
   foreach ($visible_files as $filename => $file) {
-    if (!empty($file->info['hidden']) || !empty($file->info['required'])) {
+    if (!empty($file->info['hidden'])) {
       unset($visible_files[$filename]);
     }
   }
@@ -849,10 +849,19 @@ function system_modules($form, $form_state = array()) {
   // Used when checking if module implements a help page.
   $help_arg = module_exists('help') ? drupal_help_arg() : FALSE;
 
+  // Used when displaying modules that are required by the install profile.
+  require_once DRUPAL_ROOT . '/includes/install.inc';
+  $distribution_name = check_plain(drupal_install_profile_distribution_name());
+
   // Iterate through each of the modules.
   foreach ($visible_files as $filename => $module) {
     $extra = array();
     $extra['enabled'] = (bool) $module->status;
+    if (!empty($module->info['required'] )) {
+      $extra['disabled'] = TRUE;
+      $extra['required_by'][] = $distribution_name;
+    }
+
     // If this module requires other modules, add them to the array.
     foreach ($module->requires as $requires => $v) {
       if (!isset($files[$requires])) {
@@ -929,6 +938,7 @@ function system_modules($form, $form_state = array()) {
     }
     $form['modules'][$module->info['package']][$filename] = _system_modules_build_row($module->info, $extra);
   }
+
   // Add basic information to the fieldsets.
   foreach (element_children($form['modules']) as $package) {
     $form['modules'][$package] += array(
diff --git a/modules/system/system.module b/modules/system/system.module
index 338d6ab8cecf..d8ad21f16c98 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2263,6 +2263,12 @@ function _system_rebuild_module_data() {
     // Merge in defaults and save.
     $modules[$key]->info = $module->info + $defaults;
 
+    // Install profiles are hidden by default, unless explicitly specified
+    // otherwise in the .info file.
+    if ($key == $profile && !isset($modules[$key]->info['hidden'])) {
+      $modules[$key]->info['hidden'] = TRUE;
+    }
+
     // Invoke hook_system_info_alter() to give installed modules a chance to
     // modify the data in the .info files if necessary.
     $type = 'module';
diff --git a/modules/system/system.test b/modules/system/system.test
index c3aced0176ff..f1a4407a7de5 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -364,11 +364,20 @@ class ModuleRequiredTestCase extends ModuleTestCase {
    * Assert that core required modules cannot be disabled.
    */
   function testDisableRequired() {
-    $required_modules = drupal_required_modules();
+    $module_info = system_get_info('module');
     $this->drupalGet('admin/modules');
-    foreach ($required_modules as $module) {
-      // Check to make sure the checkbox for required module is not found.
-      $this->assertNoFieldByName('modules[Core][' . $module . '][enable]');
+    foreach ($module_info as $module => $info) {
+      // Check to make sure the checkbox for each required module is disabled
+      // and checked (or absent from the page if the module is also hidden).
+      if (!empty($info['required'])) {
+        $field_name = "modules[{$info['package']}][$module][enable]";
+        if (empty($info['hidden'])) {
+          $this->assertFieldByXPath("//input[@name='$field_name' and @disabled='disabled' and @checked='checked']", '', t('Field @name was disabled and checked.', array('@name' => $field_name)));
+        }
+        else {
+          $this->assertNoFieldByName($field_name);
+        }
+      }
     }
   }
 }
-- 
GitLab