Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.128
diff -u -F^f -r1.128 bootstrap.inc
--- includes/bootstrap.inc	7 Sep 2006 07:11:15 -0000	1.128
+++ includes/bootstrap.inc	9 Oct 2006 17:27:30 -0000
@@ -237,6 +237,63 @@ function drupal_get_filename($type, $nam
 }
 
 /**
+ * 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, $profile = NULL) {
+  $config = conf_path();
+  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;
+}
+
+
+/**
  * Load the persistent variable table.
  *
  * The variable table is composed of values that have been saved in the table
Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.22
diff -u -F^f -r1.22 install.inc
--- includes/install.inc	7 Sep 2006 08:23:54 -0000	1.22
+++ includes/install.inc	9 Oct 2006 17:27:31 -0000
@@ -271,18 +271,22 @@ function drupal_verify_profile($profile,
   // Get a list of modules required by this profile.
   $function = $profile .'_profile_modules';
   $module_list = array_merge(array('system'), $function(), ($locale ? array('locale') : array()));
+  $present_modules = array();
+  foreach(drupal_system_listing('\.module$', 'modules', 'name', 0, $profile) as $present_module) {
+    $present_modules[] = $present_module->name;
+  }
 
   // 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) {
+  $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');
-      $modules_present = FALSE;
     }
   }
+  else {
+    return $module_list;
+  }
 
-  return $modules_present ? $module_list : NULL;
 }
 
 /**
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.87
diff -u -F^f -r1.87 module.inc
--- includes/module.inc	5 Oct 2006 15:47:55 -0000	1.87
+++ includes/module.inc	9 Oct 2006 17:27:31 -0000
@@ -95,7 +95,7 @@ function module_list($refresh = FALSE, $
  */
 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');
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.377
diff -u -F^f -r1.377 system.module
--- modules/system/system.module	9 Oct 2006 07:26:19 -0000	1.377
+++ modules/system/system.module	9 Oct 2006 17:27:33 -0000
@@ -870,10 +870,10 @@ function system_get_files_database(&$fil
  */
 function system_theme_data() {
   // Find themes
-  $themes = system_listing('\.theme$', 'themes');
+  $themes = drupal_system_listing('\.theme$', 'themes');
 
   // 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
   foreach (array_keys($themes) as $key) {
@@ -997,60 +997,6 @@ function system_default_region($theme) {
 }
 
 /**
- * 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.
  *
  * This function is called the first time a new theme is enabled. The new theme
