diff --git a/core/includes/install.inc b/core/includes/install.inc index 391750f..38721fe 100644 --- a/core/includes/install.inc +++ b/core/includes/install.inc @@ -1119,6 +1119,7 @@ function install_profile_info($profile, $langcode = 'en') { $cache = &drupal_static(__FUNCTION__, array()); if (!isset($cache[$profile])) { + include_once DRUPAL_ROOT . '/core/includes/module.inc'; // Set defaults for module info. $defaults = array( 'dependencies' => array(), @@ -1131,11 +1132,13 @@ function install_profile_info($profile, $langcode = 'en') { $profile_file = drupal_get_path('profile', $profile) . "/$profile.info.yml"; $info = drupal_parse_info_file($profile_file); $info += $defaults; + if ($langcode != 'en' && !empty($langcode) && !in_array('locale', $info['dependencies'])) { + $info['dependencies'][] = 'locale'; + } $info['dependencies'] = array_unique(array_merge( drupal_required_modules(), - $info['dependencies'], - ($langcode != 'en' && !empty($langcode) ? array('locale') : array())) - ); + module_order_by_dependencies($info['dependencies']) + )); // drupal_required_modules() includes the current profile as a dependency. // Since a module can't depend on itself we remove that element of the array. diff --git a/core/includes/module.inc b/core/includes/module.inc index 85c0240..ff64745 100644 --- a/core/includes/module.inc +++ b/core/includes/module.inc @@ -245,40 +245,11 @@ function module_load_include($type, $module, $name = NULL) { */ function module_enable($module_list, $enable_dependencies = TRUE) { if ($enable_dependencies) { - // Get all module data so we can find dependencies and sort. - $module_data = system_rebuild_module_data(); - // Create an associative array with weights as values. - $module_list = array_flip(array_values($module_list)); - - while (list($module) = each($module_list)) { - if (!isset($module_data[$module])) { - // This module is not found in the filesystem, abort. - return FALSE; - } - if ($module_data[$module]->status) { - // Skip already enabled modules. - unset($module_list[$module]); - continue; - } - $module_list[$module] = $module_data[$module]->sort; - - // Add dependencies to the list, with a placeholder weight. - // The new modules will be processed as the while loop continues. - foreach (array_keys($module_data[$module]->requires) as $dependency) { - if (!isset($module_list[$dependency])) { - $module_list[$dependency] = 0; - } - } - } - - if (!$module_list) { - // Nothing to do. All modules already enabled. - return TRUE; + $module_list = module_order_by_dependencies($module_list, FALSE); + // At least one module is not found in the filesystem, abort. + if (array_diff($module_list, array_keys(system_rebuild_module_data()))) { + return FALSE; } - - // Sort the module list by pre-calculated weights. - arsort($module_list); - $module_list = array_keys($module_list); } // Required for module installation checks. @@ -780,3 +751,61 @@ function module_config_sort($data) { array_multisort($sort, SORT_STRING, $data); return $data; } + + /** + * Given a list of modules, resorts and adds depedencies. + * + * @param $module_list + * An array of module names. + * @param $include_enabled + * Include enabled modules. + * + * @return + * An array of modules with their depedencies, in install order. + */ +function module_order_by_dependencies($module_list, $include_enabled = TRUE) { + global $install_state; + if (!empty($install_state)) { + $module_data = _system_rebuild_module_data(); + foreach (array_keys($module_data) as $module) { + $module_data[$module]->status = 0; + } + $module_data = drupal_container()->get('module_handler')->buildModuleDependencies(_system_rebuild_module_data()); + } + else { + $module_data = system_rebuild_module_data(); + } + // Create an associative array with weights as values. + $module_list = array_flip(array_values($module_list)); + $required_modules = array(); + + while (list($module) = each($module_list)) { + if (!isset($module_data[$module])) { + // This module is not found in the filesystem. + continue; + } + if (!$include_enabled && $module_data[$module]->status) { + // Skip already enabled modules. + unset($module_list[$module]); + continue; + } + if (!empty($module_data[$module]->info['required'])) { + $required_modules[$module] = $module; + } + $module_list[$module] = $module_data[$module]->sort; + + // Add dependencies to the list, with a placeholder weight. + // The new modules will be processed as the while loop continues. + foreach (array_keys($module_data[$module]->requires) as $dependency) { + if (!isset($module_list[$dependency])) { + $module_list[$dependency] = 0; + } + } + } + arsort($module_list); + // Put the required modules first as everything depends on them. + if ($required_modules) { + $module_list = $required_modules + $module_list; + } + return array_keys($module_list); +}