--- drush/drush_tools/drush_tools.module.orig	2008-08-10 20:42:40.000000000 -0400
+++ drush/drush_tools/drush_tools.module	2009-01-16 14:55:13.000000000 -0500
@@ -52,6 +52,10 @@ function drush_tools_drush_command() {
     'callback' => 'drush_tools_eval',
     'description' => 'Evaluate a command',
   );
+  $items['update'] = array(
+    'callback' => 'drush_tools_update',
+    'description' => 'Run all the schema changes from the command-line (replacement for update.php)',
+  );
   return $items;
 }
 
@@ -162,4 +166,89 @@ function drush_tools_watchdog_delete($ty
 
 function drush_tools_eval($command) {
   eval($command);
-}
\ No newline at end of file
+}
+
+/**
+ * Run all the schema changes from the command-line (replacement for update.php)
+ */
+function drush_tools_update($command = '') {
+  ob_start();
+  require_once 'includes/install.inc';
+  require_once 'update.php';
+  $ret = ob_get_contents();
+  drupal_load_updates();
+  ob_end_clean();
+
+  $list = module_list();
+  $update_list = array();
+  foreach ($list as $module) {
+    $updates = drupal_get_schema_versions($module);
+    if ($updates !== FALSE) {
+      $latest = 0;
+      $base = drupal_get_installed_schema_version($module);
+      foreach ($updates as $update) {
+        if ($update > $base) {
+          if ($update > $latest) { $latest = $update; }
+          $update_list[$module][] = $update;
+        }
+      }
+      if ($latest) {
+        sort($update_list[$module]);
+        printf("%-30s %5d -> %5d (%s)\n", $module, $base, $latest, join(', ', $update_list[$module]));
+      } else {
+        printf("%-30s %5d\n", $module, $base);
+      }
+    }
+  }
+  if (count($update_list) == 0) return;
+  if ($command != 'force' && !drush_confirm(t('Do you really want to continue?'))) {
+    drush_die('Aborting.');
+  }
+  ob_start();
+  foreach ($update_list as $module => $versions) {
+    foreach ($versions as $v) {
+      print "Running " . $module . "_update_" . $v . "\n";
+      update_data($module, $v);
+    }
+  }
+  $updates = ob_get_contents();
+
+  cache_clear_all('*', 'cache', TRUE);
+  cache_clear_all('*', 'cache_page', TRUE);
+  cache_clear_all('*', 'cache_menu', TRUE);
+  cache_clear_all('*', 'cache_filter', TRUE);
+  drupal_clear_css_cache();
+  ob_end_clean();
+  $output = '';
+  if (!empty($_SESSION['update_results'])) {
+    $output .= "The following queries were executed:\n";
+    foreach ($_SESSION['update_results'] as $module => $updates) {
+      $output .= "\n" . $module . "\n--------------------------\n";
+      foreach ($updates as $number => $queries) {
+        $output .= 'Update #'. $number . ":\n";
+        foreach ($queries as $query) {
+          if ($query['success']) {
+            $output .= "SUCCESS: " . $query['query'] . "\n";
+          }
+          else {
+            $output .= "FAILURE: " . $query['query'] . "\n";
+          }
+        }
+        if (!count($queries)) {
+          $output .= "No queries\n";
+        }
+      }
+    }
+    $output .= "\n";
+    if ($all_messages = drupal_get_messages()) {
+      foreach ($all_messages as $type => $messages) {
+        foreach ($messages as $message) {
+          $output .= '['. $type .']  '. $message."\n";
+        }
+        $output .= "\n";
+      }
+    }
+    print $output;
+    unset($_SESSION['update_results']);
+  }
+}
--- drush/drush_pm/drush_pm.module.orig	2009-01-16 15:03:58.000000000 -0500
+++ drush/drush_pm/drush_pm.module	2009-01-16 15:04:35.000000000 -0500
@@ -365,7 +365,7 @@ function drush_pm_update_packages($relea
   if ($backup_dir) {
     drush_print(t("Backups were saved into the directory !backup_dir.", array('!backup_dir' => $backup_dir))); 
   }
-  drush_print(t("You should now run update.php through your browser."));
+  drush_print(t("You should now run update.php through your browser or run drush update (requires drush_tools)."));
 }
 
 /**
