Commit af5402ad authored by Dries's avatar Dries

- Patch #88287 by asimmonds, dww et al: installer doesn't support modules...

- Patch #88287 by asimmonds, dww et al: installer doesn't support modules outside root/modules directory.  Critical bugfix.
parent 8ab113e7
...@@ -1753,6 +1753,69 @@ function drupal_cron_cleanup() { ...@@ -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/<domain> 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 * Renders HTML given a structured array tree. Recursively iterates over each
* of the array elements, generating HTML code. This function is usually * of the array elements, generating HTML code. This function is usually
......
...@@ -259,6 +259,7 @@ function drupal_get_install_files($module_list = array()) { ...@@ -259,6 +259,7 @@ function drupal_get_install_files($module_list = array()) {
*/ */
function drupal_verify_profile($profile, $locale) { function drupal_verify_profile($profile, $locale) {
include_once './includes/file.inc'; include_once './includes/file.inc';
include_once './includes/common.inc';
$profile_file = "./profiles/$profile/$profile.profile"; $profile_file = "./profiles/$profile/$profile.profile";
...@@ -272,17 +273,22 @@ function drupal_verify_profile($profile, $locale) { ...@@ -272,17 +273,22 @@ function drupal_verify_profile($profile, $locale) {
$function = $profile .'_profile_modules'; $function = $profile .'_profile_modules';
$module_list = array_merge(array('system'), $function(), ($locale ? array('locale') : array())); $module_list = array_merge(array('system'), $function(), ($locale ? array('locale') : array()));
// Verify that all required modules exist. // Get a list of modules that exist in Drupal's assorted subdirectories.
$modules_present = TRUE; $present_modules = array();
foreach ($module_list as $module) { foreach(drupal_system_listing('\.module$', 'modules', 'name', 0) as $present_module) {
$module_path = dirname(drupal_get_filename('module', $module, NULL, FALSE)); $present_modules[] = $present_module->name;
if (!$module_path) { }
// 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 <em>modules</em> subdirectory.', array('%module' => $module)), 'error'); drupal_set_message(st('The %module module is required but was not found. Please move it into the <em>modules</em> subdirectory.', array('%module' => $module)), 'error');
$modules_present = FALSE;
} }
} }
else {
return $modules_present ? $module_list : NULL; return $module_list;
}
} }
/** /**
......
...@@ -95,7 +95,7 @@ function module_list($refresh = FALSE, $bootstrap = TRUE, $sort = FALSE, $fixed_ ...@@ -95,7 +95,7 @@ function module_list($refresh = FALSE, $bootstrap = TRUE, $sort = FALSE, $fixed_
*/ */
function module_rebuild_cache() { function module_rebuild_cache() {
// Get current list of modules // 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. // Extract current files from database.
system_get_files_database($files, 'module'); system_get_files_database($files, 'module');
......
...@@ -869,11 +869,13 @@ function system_get_files_database(&$files, $type) { ...@@ -869,11 +869,13 @@ function system_get_files_database(&$files, $type) {
* Collect data about all currently available themes * Collect data about all currently available themes
*/ */
function system_theme_data() { function system_theme_data() {
include_once './includes/install.inc';
// Find themes // Find themes
$themes = system_listing('\.theme$', 'themes'); $themes = drupal_system_listing('\.theme$', 'themes');
// Find theme engines // Find theme engines
$engines = system_listing('\.engine$', 'themes/engines'); $engines = drupal_system_listing('\.engine$', 'themes/engines');
// can't iterate over array itself as it uses a copy of the array items // can't iterate over array itself as it uses a copy of the array items
foreach (array_keys($themes) as $key) { foreach (array_keys($themes) as $key) {
...@@ -996,60 +998,6 @@ function system_default_region($theme) { ...@@ -996,60 +998,6 @@ function system_default_region($theme) {
return $regions[0]; return $regions[0];
} }
/**
* 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 system_listing($mask, $directory, $key = 'name', $min_depth = 1) {
$config = conf_path();
$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/<domain> 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;
}
/** /**
* Assign an initial, default set of blocks for a theme. * Assign an initial, default set of blocks for a theme.
* *
......
...@@ -14,7 +14,7 @@ function phptemplate_init($template) { ...@@ -14,7 +14,7 @@ function phptemplate_init($template) {
} }
function phptemplate_templates($directory = 'themes') { function phptemplate_templates($directory = 'themes') {
return system_listing('^page\.tpl\.php$', $directory, 'filename'); return drupal_system_listing('^page\.tpl\.php$', $directory, 'filename');
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment