diff --git a/core/includes/update.inc b/core/includes/update.inc index a9d8449..40cae92 100644 --- a/core/includes/update.inc +++ b/core/includes/update.inc @@ -101,6 +101,9 @@ function update_prepare_d8_bootstrap() { ), ); if ($has_required_schema) { + // Rebuild module list. + update_system_rebuild_module_data(); + // Update the environment for the language bootstrap if needed. update_prepare_d8_language(); } @@ -777,5 +780,101 @@ function update_retrieve_dependencies() { */ /** + * Rebuild, save, and return data about all currently available modules. + * + * @return + * Array of all available modules and their data. + * + * @see system_rebuild_module_data() + */ +function update_system_rebuild_module_data() { + $modules = _update_system_rebuild_module_data(); + ksort($modules); + system_get_files_database($modules, 'module'); + system_update_files_database($modules, 'module'); + return _module_build_dependencies($modules); +} + +/** + * Helper function to scan and collect module .info data. + * + * @return + * An associative array of module information. + * + * @see _system_rebuild_module_data() + */ +function _update_system_rebuild_module_data() { + // Find modules + $modules = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules', 'name', 0); + + // Include the install profile in modules that are loaded. + $profile = drupal_get_profile(); + $modules[$profile] = new stdClass(); + $modules[$profile]->name = $profile; + $modules[$profile]->uri = 'profiles/' . $profile . '/' . $profile . '.profile'; + $modules[$profile]->filename = $profile . '.profile'; + + // Install profile hooks are always executed last. + $modules[$profile]->weight = 1000; + + // Set defaults for module info. + $defaults = array( + 'dependencies' => array(), + 'description' => '', + 'package' => 'Other', + 'version' => NULL, + 'php' => DRUPAL_MINIMUM_PHP, + 'files' => array(), + 'bootstrap' => 0, + ); + + // Read info files for each module. + foreach ($modules as $key => $module) { + // The module system uses the key 'filename' instead of 'uri' so copy the + // value so it will be used by the modules system. + $modules[$key]->filename = $module->uri; + + // Look for the info file. + $module->info = drupal_parse_info_file(dirname($module->uri) . '/' . $module->name . '.info'); + + // Skip modules that don't provide info. + if (empty($module->info)) { + unset($modules[$key]); + continue; + } + + // Merge in defaults and save. + $modules[$key]->info = $module->info + $defaults; + + // Prefix stylesheets and scripts with module path. + $path = dirname($module->uri); + if (isset($module->info['stylesheets'])) { + $module->info['stylesheets'] = _system_info_add_path($module->info['stylesheets'], $path); + } + if (isset($module->info['scripts'])) { + $module->info['scripts'] = _system_info_add_path($module->info['scripts'], $path); + } + + // 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; + } + } + + if (isset($modules[$profile])) { + // The install profile is required, if it's a valid module. + $modules[$profile]->info['required'] = TRUE; + // Add a default distribution name if the profile did not provide one. This + // matches the default value used in install_profile_info(). + if (!isset($modules[$profile]->info['distribution_name'])) { + $modules[$profile]->info['distribution_name'] = 'Drupal'; + } + } + + return $modules; +} + +/** * @} End of "defgroup update-api-7.x-to-8.x" */ diff --git a/core/update.php b/core/update.php index d1a0940..36f7a44 100644 --- a/core/update.php +++ b/core/update.php @@ -359,6 +359,8 @@ require_once DRUPAL_ROOT . '/core/includes/update.inc'; require_once DRUPAL_ROOT . '/core/includes/common.inc'; require_once DRUPAL_ROOT . '/core/includes/file.inc'; require_once DRUPAL_ROOT . '/core/includes/unicode.inc'; +require_once DRUPAL_ROOT . '/core/includes/module.inc'; +require_once DRUPAL_ROOT . '/core/modules/system/system.module'; update_prepare_d8_bootstrap(); // Determine if the current user has access to run update.php.