Drush is a command line shell and Unix scripting interface for Drupal, a
      veritable Swiss Army knife designed to make life easier for those of us who
      spend most of our working hours hacking away at the command prompt.
');
      // Usage
      $output .= '' . t('Usage') . '
';
      $output .= 'drush.php [options] <command> <command> ...
';
      
      // Options
      $output .= '' . t('Options') . '
';
      $options = drush_get_options();
      $output .= "";
      foreach ($options as $option => $description) {
        $output .= '- ' . "$option" . '
';
        $output .= '- ' .  $description . '';
      }
      $output .= "
";
            
      // Commands
      $commands = drush_get_commands();
      $output .= '' . t('Commands') . '
';
      $output .= "";
      foreach ($commands as $command => $info) {
        $output .= '- ' . "drush.php $command" . '
';
        $output .= '- ' .  $info["description"] . '';
      }
      $output .= "
";
      
      return $output;
    
  }
}
/**
 * Implementation of hook_drush_command().
 */
function drush_drush_command() {
  $items['help'] = array(
    'callback' => 'drush_callback_help',
    'description' => 'View help. Run "drush help [command]" to view command-specific help.'
  );
  return $items;
}
/**
 * Get the available options for Drush.
 *
 * @return
 *    An associative array containing the option definition as the key, and the description as the value,
 *    for each of the available options.
 */
function drush_get_options() {
  // TODO: Add a hook for this, to allow other modules to add their options
  $options['-r , --root='] = t("Drupal root directory to use (default: current directory)");
  $options['-l  , --uri=']   = t('URI of the drupal site to use (only needed in multisite environments)');
  $options['-v, --verbose']            = t('Display all available output');
  $options['-y, --yes']                = t("Assume 'yes' as answer to all prompts");
  $options['-s, --simulate']           = t("Simulate all relevant actions (don't actually change the system)");
  $options['-c, --config']             = t("Specify a config file to use. See example.drushrc.php");
  return $options;
}
/**
 * Command callback. Display help.
 */
function drush_callback_help() {
  $commands = func_get_args();
  // Display general help text if no command is specified.
  if (empty($commands)) {
    drush_print('drush ' . drush_version());
    drush_print(t('Usage: drush.php [options]   ...'));
    drush_print();
    drush_print(t('Options: '));
    foreach (drush_get_options() as $option => $description) {
      $rows[] = array($option, $description);
    }
    drush_print_table($rows, 2);
    drush_print();
    drush_print('Commands: ');
    $commands = drush_get_commands();
    $rows = array();
    foreach($commands as $key => $command) {
      $rows[] = array($key, $commands[$key]['description']);
    }
    drush_print_table($rows, 2);
  }
  // Print command specific help.
  else {
    $commandstring = implode(" ", $commands);
    if (!drush_is_command($commandstring)) {
      return drush_error(t('Invalid command !command.', array('!command' => implode(" ", $commands))));
    }
    $help = module_invoke_all('help', 'drush:'. $commandstring);
    if (!empty($help)) {
      drush_print(implode("\n", $help));
    }
    else {
      drush_print(t("No help available for command 'drush $commandstring'."));
    }
  }
}
/**
 * This is called if no command or an unknown command is entered.
 */
function drush_usage() {
  $commands = func_get_args();
  if (drush_get_option('version')) {
    return drush_print('drush ' . drush_version());
  }
  if (drush_get_option('help') || empty($commands)) {
    return drush_callback_help();
  }
  return drush_error(t('Invalid command !command.', array('!command' => implode(" ", $commands))));
}