? 689400.patch
? log
? includes/table.inc
Index: commands/core/drupal/environment_5.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/drupal/environment_5.inc,v
retrieving revision 1.1
diff -u -r1.1 environment_5.inc
--- commands/core/drupal/environment_5.inc	20 Jan 2010 16:30:17 -0000	1.1
+++ commands/core/drupal/environment_5.inc	22 Jan 2010 17:32:59 -0000
@@ -2,37 +2,148 @@
 // $Id: environment_5.inc,v 1.1 2010/01/20 16:30:17 weitzman Exp $
 /**
  * @file
- *   Helper functions for /includes/environment.php.
+ *   Specific functions for a drupal 5 environment.
  *   drush_include_engine() magically includes either this file
- *   or environment_7.php depending on which version of drupal drush
+ *   or environment_X.inc depending on which version of drupal drush
  *   is called from.
  */
 
 /**
- * Get module information for all modules, including disabled. Used by updatedb,
- * among others.
+ * Get complete information for all available modules.
  *
  * @return
- *   An array containing module info for all installed modules.
+ *   An array containing module info for all available modules.
  */
-function _drush_get_modules() {
+function drush_get_modules() {
   $modules = module_rebuild_cache();
   // In Drupal 5, system_modules() returns NULL for the dependency list of the module if there are no dependencies.
   // We will override this to be an empty array instead to be compatible to Drupal 6 and 7
   foreach ($modules as $module) {
     if (empty($module->info['dependencies'])) {
-       $module->info['dependencies'] = array();
+      $module->info['dependencies'] = array();
+    }
+    if (empty($module->info['dependents'])) {
+      $module->info['dependents'] = array();
     }
   }
   return $modules;
 }
 
 /**
- * Get theme information for all installed themes.
+ * Get complete information for all available themes.
  *
  * @return
- *   An array containing theme info for all installed themes.
+ *   An array containing theme info for all available themes.
  */
-function _drush_get_themes() {
+function drush_get_themes() {
   return _system_theme_data();
 }
+
+/**
+ * Return dependencies and its status for modules.
+ *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
+ * @return
+ *   Array with dependencies and status for $modules
+ */
+function drush_check_module_dependencies($modules, $module_info) {
+  $status = array();
+  foreach ($modules as $key => $module) {
+    $dependencies = $module_info[$module]->info['dependencies'];
+    $unmet_dependencies = array_diff($dependencies, array_keys($module_info));
+    if (!empty($unmet_dependencies)) {
+      $status[$key]['error'] = array(
+          'code' => 'DRUSH_PM_ENABLE_DEPENDENCY_NOT_FOUND',
+          'message' => dt('Module !module cannot be enabled because it depends on the following modules which could not be found: !unmet_dependencies', array('!module' => $module, '!unmet_dependencies' => implode(',', $unmet_dependencies))) 
+      );
+    }
+    else {
+      $status[$key]['dependencies'] = $dependencies;
+    }
+  }
+
+  return $status;
+}
+
+/**
+ * Return dependents of modules.
+ *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
+ * @return
+ *   Array with dependents for each one of $modules
+ */
+function drush_module_dependents($modules, $module_info) {
+  $dependents = array();
+  foreach ($modules as $module) {
+    $dependents = array_merge($dependents, $module_info[$module]->info['dependents']);
+  }
+
+  return array_unique($dependents);
+}
+
+/**
+ * Enable a list of modules. It is assumed the list contains all the dependencies not already enabled.
+ * 
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_enable($modules) {
+  // In Drupal 5, drupal_install_modules() only installs new modules,
+  // and does not enable previously installed and disabled modules.
+  $install_modules = array();
+  $enable_modules = array();
+
+  foreach ($modules as $module) {
+    if (drupal_get_installed_schema_version($module) == SCHEMA_UNINSTALLED) {
+      $install_modules[] = $module;
+    }
+    else {
+      $enable_modules[] = $module;
+    }
+  }
+  drupal_install_modules($install_modules);
+  module_enable($enable_modules);
+}
+
+/**
+ * Disable a list of modules. It is assumed the list contains all dependents not already disabled.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_disable($modules) {
+  module_disable($modules);
+}
+
+/**
+ * Uninstall a list of modules.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_uninstall($modules) {
+  require_once drush_get_context('DRUSH_DRUPAL_ROOT') . '/includes/install.inc';
+  foreach ($modules as $module) {
+    drupal_uninstall_module($module);
+  }
+}
+
+/**
+ * Submit the system modules form.
+ *
+ * The modules should already be fully enabled/disabled before calling this 
+ * function. Calling this function just makes sure any activities triggered by
+ * the form submit (such as admin_role) are completed.
+ */
+function drush_system_modules_form_submit($active_modules) {
+  require_once('./'. drupal_get_path('module', 'system') .'/system.module');
+  $form_state = array('values' => array('status' => $active_modules));
+  drupal_execute('system_modules', $form_state);
+}
+
Index: commands/core/drupal/environment_6.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/drupal/environment_6.inc,v
retrieving revision 1.1
diff -u -r1.1 environment_6.inc
--- commands/core/drupal/environment_6.inc	20 Jan 2010 15:57:15 -0000	1.1
+++ commands/core/drupal/environment_6.inc	22 Jan 2010 17:32:59 -0000
@@ -2,29 +2,123 @@
 // $Id: environment_6.inc,v 1.1 2010/01/20 15:57:15 weitzman Exp $
 /**
  * @file
- *   Helper functions for /includes/environment.php.
+ *   Specific functions for a drupal 5 environment.
  *   drush_include_engine() magically includes either this file
- *   or environment_7.php depending on which version of drupal drush
+ *   or environment_X.inc depending on which version of drupal drush
  *   is called from.
  */
 
 /**
- * Get module information for all modules, including disabled. Used by updatedb,
- * among others.
+ * Get complete information for all available modules.
  *
  * @return
  *   An array containing module info for all installed modules.
  */
-function _drush_get_modules() {
+function drush_get_modules() {
   return module_rebuild_cache();
 }
 
 /**
- * Get theme information for all installed themes.
+ * Get complete information for all available themes.
  *
  * @return
- *   An array containing theme info for all installed themes.
+ *   An array containing theme info for all available themes.
  */
-function _drush_get_themes() {
+function drush_get_themes() {
   return _system_theme_data();
-}
\ No newline at end of file
+}
+
+/**
+ * Return dependencies and its status for modules.
+ *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
+ * @return
+ *   Array with dependencies and status for $modules
+ */
+function drush_check_module_dependencies($modules, $module_info) {
+  $status = array();
+  foreach ($modules as $key => $module) {
+    $dependencies = $module_info[$module]->info['dependencies'];
+    $unmet_dependencies = array_diff($dependencies, array_keys($module_info));
+    if (!empty($unmet_dependencies)) {
+      $status[$key]['error'] = array(
+          'code' => 'DRUSH_PM_ENABLE_DEPENDENCY_NOT_FOUND',
+          'message' => dt('Module !module cannot be enabled because it depends on the following modules which could not be found: !unmet_dependencies', array('!module' => $module, '!unmet_dependencies' => implode(',', $unmet_dependencies))) 
+      );
+    }
+    else {
+      $status[$key]['dependencies'] = $dependencies;
+    }
+  }
+
+  return $status;
+}
+
+/**
+ * Return dependents of modules.
+ *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
+ * @return
+ *   Array with dependents for each one of $modules
+ */
+function drush_module_dependents($modules, $module_info) {
+  $dependents = array();
+  foreach ($modules as $module) {
+    $dependents = array_merge($dependents, $module_info[$module]->info['dependents']);
+  }
+
+  return array_unique($dependents);
+}
+
+/**
+ * Enable a list of modules. It is assumed the list contains all the dependencies not already enabled.
+ * 
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_enable($modules) {
+  module_enable($modules, FALSE);
+}
+
+/**
+ * Disable a list of modules. It is assumed the list contains all dependents not already disabled.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_disable($modules) {
+  module_disable($modules, FALSE);
+}
+
+/**
+ * Uninstall a list of modules.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_uninstall($modules) {
+  require_once drush_get_context('DRUSH_DRUPAL_ROOT') . '/includes/install.inc';
+  foreach ($modules as $module) {
+    drupal_uninstall_module($module);
+  }
+}
+
+/**
+ * Submit the system modules form.
+ *
+ * The modules should already be fully enabled/disabled before calling this 
+ * function. Calling this function just makes sure any activities triggered by
+ * the form submit (such as admin_role) are completed.
+ */
+function drush_system_modules_form_submit($active_modules) {
+  module_load_include('inc', 'system', 'system.admin'); 
+  $form_state = array('values' => array('status' => $active_modules));
+  drupal_execute('system_modules', $form_state);
+}
+
Index: commands/core/drupal/environment_7.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/drupal/environment_7.inc,v
retrieving revision 1.4
diff -u -r1.4 environment_7.inc
--- commands/core/drupal/environment_7.inc	18 Jan 2010 19:23:46 -0000	1.4
+++ commands/core/drupal/environment_7.inc	22 Jan 2010 17:32:59 -0000
@@ -2,40 +2,132 @@
 // $Id: environment_7.inc,v 1.4 2010/01/18 19:23:46 adrian Exp $
 /**
  * @file
- *   Helper functions for /includes/environment.php.
+ *   Specific functions for a drupal 5 environment.
  *   drush_include_engine() magically includes either this file
- *   or environment.php depending on which version of drupal drush
+ *   or environment_X.inc depending on which version of drupal drush
  *   is called from.
  */
 
 /**
- * Get module information for all installed modules.
+ * Get complete information for all available modules.
  *
  * @return
  *   An array containing module info for all installed modules.
  */
-function _drush_get_modules() {
-  $module_info = drupal_system_listing('/\.module$/', 'modules', 'name', 0);
-  system_get_files_database($module_info, 'module');
-  foreach ($module_info as $module_name => $module){
-    $info = drupal_parse_info_file(dirname($module->uri) .'/'. $module->name .'.info');
-    if (empty($info['hidden'])) {
-      $module_info[$module_name]->info = $info;
+function drush_get_modules() {
+  return system_rebuild_module_data();
+}
+
+/**
+ * Get complete information for all available themes.
+ *
+ * @return
+ *   An array containing theme info for all available themes.
+ */
+function drush_get_themes() {
+  return system_rebuild_theme_data();
+}
+
+/**
+ * Return dependencies and its status for modules.
+ *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
+ * @return
+ *   Array with dependencies and status for $modules
+ */
+function drush_check_module_dependencies($modules, $module_info) {
+  $status = array();
+  foreach ($modules as $key => $module) {
+    $dependencies = $module_info[$module]->requires;
+    $unmet_dependencies = array_diff(array_keys($dependencies), array_keys($module_info));
+    if (!empty($unmet_dependencies)) {
+      $status[$key]['error'] = array(
+          'code' => 'DRUSH_PM_ENABLE_DEPENDENCY_NOT_FOUND',
+          'message' => dt('Module !module cannot be enabled because it depends on the following modules which could not be found: !unmet_dependencies', array('!module' => $module, '!unmet_dependencies' => implode(',', $unmet_dependencies))) 
+      );
     }
     else {
-      // Hide this module by not returning it in the list.
-      unset($module_info[$module_name]);
+      // check for version incompatibility
+      foreach ($dependencies as $dependency_name => $v) {
+        $current_version = $module_info[$dependency_name]->info['version'];
+        $incompatibility = drupal_check_incompatibility($v, $current_version);
+        if (!is_null($incompatibility)) {
+          $status[$key]['error'] = array(
+            'code' => 'DRUSH_PM_ENABLE_DEPENDENCY_VERSION_MISMATCH',
+            'message' => dt('Module !module cannot be enabled because it depends on !dependency !required_version but !current_version is available', array('!module' => $module, '!dependency' => $dependency_name, '!required_version' => $incompatibility, '!current_version' => $current_version))
+          );
+        }
+      }
     }
+    $status[$key]['dependencies'] = array_keys($dependencies);
   }
-  return $module_info;
+
+  return $status;
 }
 
 /**
- * Get theme information for all installed themes.
+ * Return dependents of modules.
  *
+ * @param $modules
+ *   Array of module names
+ * @param $module_info
+ *   Drupal 'files' array for modules as returned by drush_get_modules().
  * @return
- *   An array containing theme info for all installed themes.
+ *   Array with dependents for each one of $modules
  */
-function _drush_get_themes() {
-  return system_rebuild_theme_data();
+function drush_module_dependents($modules, $module_info) {
+  $dependents = array();
+  foreach ($modules as $module) {
+    $dependents = array_merge($dependents, array_keys($module_info[$module]->required_by));
+  }
+
+  return array_unique($dependents);
 }
+
+/**
+ * Enable a list of modules. It is assumed the list contains all the dependencies not already enabled.
+ * 
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_enable($modules) {
+  module_enable($modules, FALSE);
+}
+
+/**
+ * Disable a list of modules. It is assumed the list contains all dependents not already disabled.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_disable($modules) {
+  module_disable($modules, FALSE);
+}
+
+/**
+ * Uninstall a list of modules.
+ *
+ * @param $modules
+ *   Array of module names
+ */
+function drush_module_uninstall($modules) {
+  require_once drush_get_context('DRUSH_DRUPAL_ROOT') . '/includes/install.inc';
+  drupal_uninstall_modules($modules);
+}
+
+/**
+ * Submit the system modules form.
+ *
+ * The modules should already be fully enabled/disabled before calling this 
+ * function. Calling this function just makes sure any activities triggered by
+ * the form submit (such as admin_role) are completed.
+ */
+function drush_system_modules_form_submit($active_modules) {
+  module_load_include('inc', 'system', 'system.admin'); 
+  $form_state = array('values' => array('status' => $active_modules));
+  drupal_form_submit('system_modules', $form_state);
+}
+
Index: commands/core/drupal/update_6.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/drupal/update_6.inc,v
retrieving revision 1.12
diff -u -r1.12 update_6.inc
--- commands/core/drupal/update_6.inc	18 Jan 2010 19:23:46 -0000	1.12
+++ commands/core/drupal/update_6.inc	22 Jan 2010 17:33:00 -0000
@@ -1,4 +1,4 @@
-<?php
+ <?php
 // $Id: update_6.inc,v 1.12 2010/01/18 19:23:46 adrian Exp $
 /**
  * @file
@@ -149,6 +149,7 @@
 
   // Store values of expensive functions for future use.
   if (empty($themes) || empty($modules)) {
+    drush_include_engine('drupal', 'environment');
     $themes = drush_get_themes();
     $modules = drush_get_modules();
   }
@@ -325,6 +326,7 @@
 
   // Rescan and repopulate the system table to ensure we have a full picture
   // of the platform.
+  drush_include_engine('drupal', 'environment');
   drush_get_themes();
   drush_get_modules();
 
Index: commands/core/drupal/update_7.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/drupal/update_7.inc,v
retrieving revision 1.17
diff -u -r1.17 update_7.inc
--- commands/core/drupal/update_7.inc	18 Jan 2010 19:23:46 -0000	1.17
+++ commands/core/drupal/update_7.inc	22 Jan 2010 17:33:00 -0000
@@ -200,6 +200,7 @@
 
   // Rescan and repopulate the system table to ensure we have a full picture
   // of the platform.
+  drush_include_engine('drupal', 'environment');
   drush_get_themes();
   drush_get_modules();
 
Index: commands/pm/pm.drush.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/pm/pm.drush.inc,v
retrieving revision 1.81
diff -u -r1.81 pm.drush.inc
--- commands/pm/pm.drush.inc	20 Jan 2010 15:47:58 -0000	1.81
+++ commands/pm/pm.drush.inc	22 Jan 2010 17:33:01 -0000
@@ -183,7 +183,9 @@
  *
  */
 function drush_pm_list() {
+  drush_include_engine('drupal', 'environment');
   $modules = drush_get_modules();
+
   $rows[] = array(dt('Name'), dt('Status'), dt('Description'));
   foreach ($modules as $module) {
     $enabled = dt('Disabled');
@@ -205,50 +207,72 @@
  */
 function drush_pm_enable() {
   $modules = func_get_args();
-  if (empty($modules)) {
-    return drush_log(dt('There were no modules that could be enabled.'), 'ok');
-  }
 
+  drush_include_engine('drupal', 'environment');
   $module_info = drush_get_modules();
-  $enabled = array_keys(array_filter($module_info, 'pm_is_enabled'));
-  $requested_modules = $modules;
 
-  pm_dependencies($modules, $enabled, $module_info);
-  drush_print(dt('The following modules will be enabled: !modules', array('!modules' => implode(', ', $modules))));
-  if(!drush_confirm(dt('Do you really want to continue?'))) {
-    drush_die('Aborting.');
+  // Discards modules which are unavailable or already enabled.
+  foreach ($modules as $key => $module) {
+    if (!isset($module_info[$module])) {
+      // The module is not available to be activated, ignore it.
+      unset($modules[$key]);
+      drush_set_error('DRUSH_PM_ENABLE_MODULE_NOT_FOUND', dt('Module !module was not found and will not be enabled.', array('!module' => $module)));
+    }
+    else if ($module_info[$module]->status) {
+      // We find the module in the list of modules already enabled, ignore it.
+      unset($modules[$key]);
+      drush_log(dt('!module is already enabled.', array('!module' => $module), 'ok'));
+    }
+  }
+
+  // Check dependencies.
+  $dependencies = drush_check_module_dependencies($modules, $module_info);
+  $all_dependencies = array();
+  foreach ($dependencies as $key => $info) {
+    if (isset($info['error'])) {
+      unset($modules[$key]);
+      drush_set_error($info['error']['code'], $info['error']['message']);
+    }
+    else {
+      $all_dependencies = array_merge($all_dependencies, $info['dependencies']);
+    }
   }
+  $all_dependencies = array_unique($all_dependencies);
+  $enabled = array_keys(array_filter($module_info, 'pm_is_enabled'));
+  $modules = array_unique(array_merge($modules, array_diff($all_dependencies, $enabled)));
 
-  // Make sure the install API is available.
+  // Discard modules which don't meet requirements.
   require_once drush_get_context('DRUSH_DRUPAL_ROOT') . '/includes/install.inc';
-  // We install/enable modules explicitly here, to pass dependency validation in form submit.
-  $install_modules = array();
-  $enable_modules = array();
-  foreach ($modules as $module) {
+  foreach ($modules as $key => $module) {
     // Check to see if the module can be installed/enabled (hook_requirements)
     // See @system_modules_submit
     if (!drupal_check_module($module)) {
-      continue;
+      unset($modules[$key]);
+      drush_set_error('DRUSH_PM_ENABLE_MODULE_UNMEET_REQUIREMENTS', dt('Module !module don\'t meet the requirements to be enabled.', array('!module' => $module)));
     }
+  }
 
-    // In Drupal 5, drupal_install_modules() only installs new modules,
-    // and does not enable previously installed and disabled modules.
-    if (drupal_get_installed_schema_version($module) == SCHEMA_UNINSTALLED) {
-      $install_modules[] = $module;
-    }
-    else {
-      $enable_modules[] = $module;
+  // Inform the user which modules will finally be enabled.
+  if (empty($modules)) {
+    return drush_log(dt('There were no modules that could be enabled.'), 'ok');
+  }
+  else {
+    drush_print(dt('The following modules will be enabled: !modules', array('!modules' => implode(', ', $modules))));
+    if(!drush_confirm(dt('Do you really want to continue?'))) {
+      drush_die('Aborting.');
     }
   }
-#  drupal_install_modules($install_modules);
-  module_enable($enable_modules);
+
+  // Enable the modules.
+  drush_module_enable($modules);
+
+  // Pass dependency validation in form submit.
   $current = drupal_map_assoc($enabled, 'pm_true');
-  // Add the list of processed modules from the active modules list.
-  $processed_modules = array_merge($install_modules, $enable_modules);
-  $active_modules = array_merge($current, drupal_map_assoc($processed_modules, 'pm_true'));
-  
-  pm_system_modules_form_submit($active_modules);
+  $processed = drupal_map_assoc($modules, 'pm_true');
+  $active_modules = array_merge($current, $processed);
+  drush_system_modules_form_submit($active_modules);
 
+  // Inform the user of final status.
   $module_info = drush_get_modules();
   foreach ($modules as $module_name) {
     if ($module_info[$module_name]->status) {
@@ -265,27 +289,51 @@
  */
 function drush_pm_disable() {
   $modules = func_get_args();
-  if (empty($modules)) {
-    return drush_log(dt('There were no modules that could be disabled.'), 'ok');
-  }
 
+  drush_include_engine('drupal', 'environment');
   $module_info = drush_get_modules();
   $enabled = array_keys(array_filter($module_info, 'pm_is_enabled'));
-  pm_reverse_dependencies($modules, $enabled, $module_info);
+  
+  // Discards modules which are unavailable or already enabled.
+  foreach ($modules as $key => $module) {
+    if (!isset($module_info[$module])) {
+      // The module is not available to be disabled, ignore it.
+      unset($modules[$key]);
+      drush_set_error('DRUSH_PM_ENABLE_MODULE_NOT_FOUND', dt('Module !module was not found and will not be disabled.', array('!module' => $module)));
+    }
+    else if (!$module_info[$module]->status) {
+      // We find the module in the list of modules already disabled, ignore it.
+      unset($modules[$key]);
+      drush_log(dt('!module is already disabled.', array('!module' => $module), 'ok'));
+    }
+  }
 
-  drush_print(dt('The following modules will be disabled: !modules', array('!modules' => implode(', ', $modules))));
-  if(!drush_confirm(dt('Do you really want to continue?'))) {
-    drush_die('Aborting.');
+  // Add enabled dependents to list of modules to disable.
+  $dependents = drush_module_dependents($modules, $module_info);
+  $dependents = array_unique($dependents);
+  $dependents = array_intersect($dependents, $enabled);
+  $modules = array_merge($modules, $dependents);
+
+  // Inform the user which modules will finally be disabled.
+  if (empty($modules)) {
+    return drush_log(dt('There were no modules that could be disabled.'), 'ok');
+  }
+  else {
+    drush_print(dt('The following modules will be disabled: !modules', array('!modules' => implode(', ', $modules))));
+    if(!drush_confirm(dt('Do you really want to continue?'))) {
+      drush_die('Aborting.');
+    }
   }
 
-  // We disable the modules explicitly here, to pass dependency validation in the form submit.
-  module_disable($modules);
-  // Remove the list of disabled modules from the active modules list.
+  // Disable the modules.
+  drush_module_disable($modules);
+  
+  // Pass dependency validation in form submit.
   $active_modules = array_diff($enabled, $modules);
   $active_modules = drupal_map_assoc($active_modules, 'pm_true');
+  drush_system_modules_form_submit($active_modules);
 
-  pm_system_modules_form_submit($active_modules);
-
+  // Inform the user of final status.
   $module_info = drush_get_modules();
   foreach ($modules as $module_name) {
     if (!$module_info[$module_name]->status) {
@@ -304,121 +352,45 @@
 function drush_pm_uninstall() {
   $modules = func_get_args();
 
-  drush_print(dt('The following modules will be uninstalled: !modules', array('!modules' => implode(', ', $modules))));
-  if(!drush_confirm(dt('Do you really want to continue?'))) {
-    drush_die('Aborting.');
-  }
-
-  // Make sure the install API is available.
-  require_once drush_get_context('DRUSH_DRUPAL_ROOT') . '/includes/install.inc';
-
-  $module_info = array();
-  foreach ($modules as $module) {
-    // Minimalist validation.
-    if (drush_drupal_major_version() >= 7) {
-      if ($valid = db_query("SELECT name FROM {system} WHERE name = :name AND type = 'module' AND status = 0 AND schema_version > :schema_version", array(':name' => $module, ':schema_version' => SCHEMA_UNINSTALLED))->fetchField()) {
-        drupal_uninstall_modules(array($module));
-      }
-    }
-    else {
-      if ($valid = db_result(db_query("SELECT name FROM {system} WHERE name='%s' AND type = 'module' AND status = 0 AND schema_version > %d", $module, SCHEMA_UNINSTALLED))) {
-        drupal_uninstall_module($module);
-      }
-    }
-    if ($valid) {
-      drush_log(dt('!module was successfully uninstalled.', array('!module' => $module)), 'ok');
-    }
-    else {
-      if (empty($module_info)) {
-        $module_info = drush_get_modules();
-      }
-      if (isset($module_info[$module]) && $module_info[$module]->status) {
-        drush_set_error('DRUSH_PM_UNINSTALL_ACTIVE_MODULE', dt('!module is not disabled. Use `disable` command before `uninstall`.', array('!module' => $module)));
-      }
-      else {
-        drush_log(dt('Module !module is either already uninstalled or does not exist.', array('!module' => $module)), 'warning');
-      }
-    }
-  }
-}
+  drush_include_engine('drupal', 'environment');
+  $module_info = drush_get_modules();
 
-/**
- * This calculates any modules that are the modules the user wants to enable
- * are depending on and enables them progressively so as to allow the
- * system dependency checking to proceed.
- **/
-function pm_dependencies(&$modules, $enabled, $module_info) {
-  $dependencies = array();
+  // Discards modules which are enabled, not found or already uninstalled.
   foreach ($modules as $key => $module) {
-    if (array_search($module, $enabled) !== FALSE) {
-      // We find the module in the list of modules already enabled, ignore it.
+    if (!isset($module_info[$module])) {
+      // The module does not exist in the system.
       unset($modules[$key]);
-      drush_log(dt('!module is already enabled.', array('!module' => $module_info[$module]->info['name'])), 'ok');
-    }
-    else if (isset($module_info[$module])) {
-      // This module is available, check for dependencies that are not already enabled.
-      $new_dependencies = array_diff($module_info[$module]->info['dependencies'], $enabled);
-      $unmet_dependencies = array_diff($new_dependencies, array_keys($module_info));
-      if (!empty($unmet_dependencies)) {
-        unset($modules[$key]);
-        $new_dependencies = array();
-        drush_set_error('DRUSH_PM_ENABLE_DEPENDENCY_NOT FOUND', dt('Module !module cannot be enabled because it depends on the following modules which could not be found: !unmet_dependencies', array('!module' => $module, '!unmet_dependencies' => implode(',', $unmet_dependencies))));
-      }
-      // Store a list of dependencies so we can tell the user what we are going to do.
-      // We can't update $modules, because that can cause dependencies to make the foreach loop forever.
-      $dependencies = array_merge($dependencies, $new_dependencies);
+      drush_set_error('DRUSH_PM_ENABLE_MODULE_NOT_FOUND', dt('Module !module was not found and will not be uninstalled.', array('!module' => $module)));
     }
-    else {
-      // The module is not available to be activated, ignore it.
+    else if ($module_info[$module]->status) {
+      // The module is enabled.
       unset($modules[$key]);
-      drush_set_error('DRUSH_PM_ENABLE_MODULE_NOT FOUND', dt('Module !module was not found and will not be enabled.', array('!module' => $module)));
+      drush_set_error('DRUSH_PM_UNINSTALL_ACTIVE_MODULE', dt('!module is not disabled. Use `pm-disable` command before `pm-uninstall`.', array('!module' => $module)));
     }
-  }
-  $modules = array_unique(array_merge($modules, $dependencies));
-}
-
-/**
- * This calculates any modules that are depending on the modules the user
- * wants to disable.
- */
-function pm_reverse_dependencies(&$modules, $enabled, $module_info) {
-  foreach ($modules as $key => $module) {
-    if (array_search($module, $enabled) === FALSE) {
+    else if ($module_info[$module]->schema_version == -1) { // SCHEMA_UNINSTALLED
+      // The module is uninstalled.
       unset($modules[$key]);
-      drush_log(dt('!module is already disabled.', array('!module' => $module_info[$module]->info['name'])), 'warning');
-    }
-    foreach ($module_info as $dependent => $dependent_search) {
-      if (array_search($module, $dependent_search->info['dependencies']) !== FALSE) {
-        $modules[] = $dependent;
-      }
+      drush_log(dt('!module is already uninstalled.', array('!module' => $module), 'ok'));
     }
   }
-  $modules = array_intersect($enabled, $modules);
-}
 
-/**
- * Submit the system modules form.
- *
- * The modules should already be fully enabled/disabled before calling this 
- * function. Calling this function just makes sure any activities triggered by
- * the form submit (such as admin_role) are completed.
- */
-function pm_system_modules_form_submit($active_modules) {
-  if (function_exists('module_load_include')) {
-    module_load_include('inc', 'system', 'system.admin');
+  // Inform the user which modules will finally be uninstalled.
+  if (empty($modules)) {
+    return drush_log(dt('There were no modules that could be uninstalled.'), 'ok');
   }
   else {
-    // Drupal5 only.
-    require_once('./'. drupal_get_path('module', 'system') .'/system.module');
-  }
-  
-  $form_state = array('values' => array('status' => $active_modules));
-  if (function_exists('drupal_execute')) {
-    drupal_execute('system_modules', $form_state);
+    drush_print(dt('The following modules will be uninstalled: !modules', array('!modules' => implode(', ', $modules))));
+    if(!drush_confirm(dt('Do you really want to continue?'))) {
+      drush_die('Aborting.');
+    }
   }
-  else {
-    // Drupal 7.
-    drupal_form_submit('system_modules', $form_state);
+
+  // Disable the modules.
+  drush_module_uninstall($modules);
+
+  // Inform the user of final status.
+  foreach ($modules as $module) {
+    drush_log(dt('!module was successfully uninstalled.', array('!module' => $module)), 'ok');
   }
 }
 
Index: includes/environment.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/includes/environment.inc,v
retrieving revision 1.68
diff -u -r1.68 environment.inc
--- includes/environment.inc	20 Jan 2010 17:46:18 -0000	1.68
+++ includes/environment.inc	22 Jan 2010 17:33:01 -0000
@@ -986,36 +986,6 @@
 }
 
 /**
- * Get module information for all installed modules. Wrapper for _drush_get_modules().
- *
- * @return
- *   An array containing module info for all installed modules or FALSE on error.
- */
-function drush_get_modules() {
-  if(drush_include_engine('drupal', 'environment')){
-    return _drush_get_modules();
-  }
-  else {
-    return drush_set_error('DRUSH_CORE', dt('Drush was unable to load module information.'));
-  }
-}
-
-/**
- * Get theme information for all installed themes. Wrapper for _drush_get_themes().
- *
- * @return
- *   An array containing theme info for all installed themes or FALSE on error.
- */
-function drush_get_themes() {
-  if(drush_include_engine('drupal', 'environment')){
-    return _drush_get_themes();
-  }
-  else {
-    return drush_set_error('DRUSH_CORE', dt('Drush was unable to load theme information.'));
-  }
-}
-
-/**
  * Make a determination whether or not the given
  * host is local or not.
  *
