From af5402ad2abd530a192115a2760cf00fe0d151f3 Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Mon, 23 Oct 2006 06:45:17 +0000 Subject: - Patch #88287 by asimmonds, dww et al: installer doesn't support modules outside root/modules directory. Critical bugfix. --- includes/common.inc | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ includes/install.inc | 22 +++++++++++------- includes/module.inc | 2 +- 3 files changed, 78 insertions(+), 9 deletions(-) (limited to 'includes') diff --git a/includes/common.inc b/includes/common.inc index 9104a78f9..b0b184ee4 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -1753,6 +1753,69 @@ function drupal_cron_cleanup() { } } +/** + * Returns an array of files objects of the given type from the site-wide + * directory (i.e. modules/), the all-sites directory (i.e. + * sites/all/modules/), the profiles directory, and site-specific directory + * (i.e. sites/somesite/modules/). The returned array will be keyed using the + * key specified (name, basename, filename). Using name or basename will cause + * site-specific files to be prioritized over similar files in the default + * directories. That is, if a file with the same name appears in both the + * site-wide directory and site-specific directory, only the site-specific + * version will be included. + * + * @param $mask + * The regular expression of the files to find. + * @param $directory + * The subdirectory name in which the files are found. For example, + * 'modules' will search in both modules/ and + * sites/somesite/modules/. + * @param $key + * The key to be passed to file_scan_directory(). + * @param $min_depth + * Minimum depth of directories to return files from. + * + * @return + * An array of file objects of the specified type. + */ +function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) { + global $profile; + $config = conf_path(); + + // When this function is called during Drupal's initial installation process, + // the name of the profile that's about to be installed is stored in the global + // $profile variable. At all other times, the standard Drupal systems variable + // table contains the name of the current profile, and we can call variable_get() + // to determine what one is active. + if (!isset($profile)) { + $profile = variable_get('install_profile', 'default'); + } + $searchdir = array($directory); + $files = array(); + + // Always search sites/all/* as well as the global directories + $searchdir[] = 'sites/all'; + + // The 'profiles' directory contains pristine collections of modules and + // themes as organized by a distribution. It is pristine in the same way + // that /modules is pristine for core; users should avoid changing anything + // there in favor of sites/all or sites/ directories. + if (file_exists("profiles/$profile/$directory")) { + $searchdir[] = "profiles/$profile/$directory"; + } + + if (file_exists("$config/$directory")) { + $searchdir[] = "$config/$directory"; + } + + // Get current list of items + foreach ($searchdir as $dir) { + $files = array_merge($files, file_scan_directory($dir, $mask, array('.', '..', 'CVS'), 0, TRUE, $key, $min_depth)); + } + + return $files; +} + /** * Renders HTML given a structured array tree. Recursively iterates over each * of the array elements, generating HTML code. This function is usually diff --git a/includes/install.inc b/includes/install.inc index 2aa93767e..4c7ed74d2 100644 --- a/includes/install.inc +++ b/includes/install.inc @@ -259,6 +259,7 @@ function drupal_get_install_files($module_list = array()) { */ function drupal_verify_profile($profile, $locale) { include_once './includes/file.inc'; + include_once './includes/common.inc'; $profile_file = "./profiles/$profile/$profile.profile"; @@ -272,17 +273,22 @@ function drupal_verify_profile($profile, $locale) { $function = $profile .'_profile_modules'; $module_list = array_merge(array('system'), $function(), ($locale ? array('locale') : array())); - // Verify that all required modules exist. - $modules_present = TRUE; - foreach ($module_list as $module) { - $module_path = dirname(drupal_get_filename('module', $module, NULL, FALSE)); - if (!$module_path) { + // Get a list of modules that exist in Drupal's assorted subdirectories. + $present_modules = array(); + foreach(drupal_system_listing('\.module$', 'modules', 'name', 0) as $present_module) { + $present_modules[] = $present_module->name; + } + + // Verify that all of the profile's required modules are present. + $missing_modules = array_diff($module_list, $present_modules); + if (count($missing_modules)) { + foreach($missing_modules as $module) { drupal_set_message(st('The %module module is required but was not found. Please move it into the modules subdirectory.', array('%module' => $module)), 'error'); - $modules_present = FALSE; } } - - return $modules_present ? $module_list : NULL; + else { + return $module_list; + } } /** diff --git a/includes/module.inc b/includes/module.inc index 3a5b2b666..6bbeb2a41 100644 --- a/includes/module.inc +++ b/includes/module.inc @@ -95,7 +95,7 @@ function module_list($refresh = FALSE, $bootstrap = TRUE, $sort = FALSE, $fixed_ */ function module_rebuild_cache() { // Get current list of modules - $files = system_listing('\.module$', 'modules', 'name', 0); + $files = drupal_system_listing('\.module$', 'modules', 'name', 0); // Extract current files from database. system_get_files_database($files, 'module'); -- cgit v1.2.3