? 689400.patch
? 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	21 Jan 2010 17:08:21 -0000
@@ -36,3 +36,55 @@
 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_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;
+}
+
+/**
+ * Enable a list of modules.
+ *
+ */
+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);
+}
+
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	21 Jan 2010 17:08:25 -0000
@@ -27,4 +27,42 @@
  */
 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_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;
+}
+
+/**
+ * Enable a list of modules.
+ *
+ */
+function _drush_module_enable($modules) {
+  module_enable($modules, FALSE);
+}
+
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	21 Jan 2010 17:08:25 -0000
@@ -15,19 +15,7 @@
  *   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;
-    }
-    else {
-      // Hide this module by not returning it in the list.
-      unset($module_info[$module_name]);
-    }
-  }
-  return $module_info;
+  return system_rebuild_module_data();
 }
 
 /**
@@ -39,3 +27,52 @@
 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_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 {
+      // 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 $status;
+}
+
+/**
+ * Enable a list of modules.
+ *
+ */
+function _drush_module_enable($modules) {
+  module_enable($modules, FALSE);
+}
+
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	21 Jan 2010 17:08:34 -0000
@@ -210,45 +210,69 @@
   }
 
   $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_info[$module]->info['name'])), 'ok');
+    }
   }
 
-  // Make sure the install API is available.
+  $dependencies = drush_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)));
+
+  // 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 (!count($modules)) {
+    drush_print('There are no modules to be enabled.');
+    return;
+  }
+  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);
-  $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'));
   
+  // enable the modules.
+  drush_module_enable($modules);
+
+  // pass dependency validation in form submit.
+  $current = drupal_map_assoc($enabled, 'pm_true');
+  $processed = drupal_map_assoc($modules, 'pm_true');
+  $active_modules = array_merge($current, $processed);
   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) {
@@ -343,41 +367,6 @@
 }
 
 /**
- * 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();
-  foreach ($modules as $key => $module) {
-    if (array_search($module, $enabled) !== FALSE) {
-      // 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_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);
-    }
-    else {
-      // 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)));
-    }
-  }
-  $modules = array_unique(array_merge($modules, $dependencies));
-}
-
-/**
  * This calculates any modules that are depending on the modules the user
  * wants to disable.
  */
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	21 Jan 2010 17:08:37 -0000
@@ -992,7 +992,7 @@
  *   An array containing module info for all installed modules or FALSE on error.
  */
 function drush_get_modules() {
-  if(drush_include_engine('drupal', 'environment')){
+  if(drush_include_engine('drupal', 'environment')) {
     return _drush_get_modules();
   }
   else {
@@ -1007,7 +1007,7 @@
  *   An array containing theme info for all installed themes or FALSE on error.
  */
 function drush_get_themes() {
-  if(drush_include_engine('drupal', 'environment')){
+  if(drush_include_engine('drupal', 'environment')) {
     return _drush_get_themes();
   }
   else {
@@ -1016,6 +1016,34 @@
 }
 
 /**
+ *
+ *
+ */
+function drush_module_dependencies($modules, $module_info) {
+  if(drush_include_engine('drupal', 'environment')) {
+    return _drush_module_dependencies($modules, $module_info);
+  }
+  else {
+    return drush_set_error('DRUSH_CORE', dt('Drush was unable to compute module dependencies.'));
+  }
+}
+
+/**
+ * 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_module_enable($modules) {
+  if(drush_include_engine('drupal', 'environment')) {
+    return _drush_module_enable($modules);
+  }
+  else {
+    return drush_set_error('DRUSH_CORE', dt('Drush was unable to enable modules.'));
+  }
+}
+
+/**
  * Make a determination whether or not the given
  * host is local or not.
  *
