"Makes a delicious sandwich.", 'arguments' => array( 'filling' => 'The type of the sandwich (turkey, cheese, etc.). Defaults to ascii.', ), 'options' => array( 'spreads' => array( 'description' => 'Comma delimited list of spreads.', 'example-value' => 'mayonnaise,mustard', ), ), 'examples' => array( 'drush mmas turkey --spreads=ketchup,mustard' => 'Make a terrible-tasting sandwich that is lacking in pickles.', ), 'aliases' => array('mmas'), 'bootstrap' => DRUSH_BOOTSTRAP_DRUSH, // No bootstrap at all. ); // Commandfiles may also add topics. These will appear in // the list of topics when `drush topic` is executed. // To view this topic, run `drush --include=/full/path/to/examples topic` $items['sandwich-exposition'] = array( 'description' => 'Ruminations on the true meaning and philosophy of sandwiches.', 'hidden' => TRUE, 'topic' => TRUE, 'bootstrap' => DRUSH_BOOTSTRAP_DRUSH, 'callback' => 'drush_print_file', 'callback arguments' => array(dirname(__FILE__) . '/sandwich-topic.txt'), ); return $items; } /** * Implementation of hook_drush_help(). * * This function is called whenever a drush user calls * 'drush help '. This hook is optional. If a command * does not implement this hook, the command's description is used instead. * * This hook is also used to look up help metadata, such as help * category title and summary. See the comments below for a description. * * @param * A string with the help section (prepend with 'drush:') * * @return * A string with the help text for your command. */ function sandwich_drush_help($section) { switch ($section) { case 'drush:make-me-a-sandwich': return dt("This command will make you a delicious sandwich, just how you like it."); // The 'title' meta item is used to name a group of // commands in `drush help`. If a title is not defined, // the default is "All commands in ___", with the // specific name of the commandfile (e.g. sandwich). // Command files with less than four commands will // be placed in the "Other commands" section, _unless_ // they define a title. It is therefore preferable // to not define a title unless the file defines a lot // of commands. case 'meta:sandwich:title': return dt("Sandwich commands"); // The 'summary' meta item is displayed in `drush help --filter`, // and is used to give a general idea what the commands in this // command file do, and what they have in common. case 'meta:sandwich:summary': return dt("Automates your sandwich-making business workflows."); } } /** * Implementation of drush_hook_COMMAND_validate(). * * The validate command should exit with * `return drush_set_error(...)` to stop execution of * the command. In practice, calling drush_set_error * OR returning FALSE is sufficient. See drush.api.php * for more details. */ function drush_sandwich_make_me_a_sandwich_validate() { if (drush_is_windows()) { // $name = drush_get_username(); // TODO: implement check for elevated process using w32api // as sudo is not available for Windows // http://php.net/manual/en/book.w32api.php // http://social.msdn.microsoft.com/Forums/en/clr/thread/0957c58c-b30b-4972-a319-015df11b427d } else { $name = posix_getpwuid(posix_geteuid()); if ($name['name'] !== 'root') { return drush_set_error('MAKE_IT_YOUSELF', dt('What? Make your own sandwich.')); } } } /** * Example drush command callback. This is where the action takes place. * * The function name should be same as command name but with dashes turned to * underscores and 'drush_commandfile_' prepended, where 'commandfile' is * taken from the file 'commandfile.drush.inc', which in this case is 'sandwich'. * Note also that a simplification step is also done in instances where * the commandfile name is the same as the beginning of the command name, * "drush_example_example_foo" is simplified to just "drush_example_foo". * To also implement a hook that is called before your command, implement * "drush_hook_pre_example_foo". For a list of all available hooks for a * given command, run drush in --debug mode. * * If for some reason you do not want your hook function to be named * after your command, you may define a 'callback' item in your command * object that specifies the exact name of the function that should be * called. However, the specified callback function must still begin * with "drush_commandfile_" (e.g. 'callback' => "drush_example_foo_execute") * if you want that all hook functions are still called (e.g. * drush_example_pre_foo_execute, and so on). * * In this function, all of Drupal's API is (usually) available, including * any functions you have added in your own modules/themes. * * @see drush_invoke() * @see drush.api.php */ function drush_sandwich_make_me_a_sandwich($filling = 'ascii') { $str_spreads = ''; // Read options with drush_get_option. Note that the options _must_ // be documented in the $items structure for this command in the 'command' hook. // See `drush topic docs-commands` for more information. if ($spreads = drush_get_option('spreads')) { $list = implode(' and ', explode(',', $spreads)); $str_spreads = ' with just a dash of ' . $list; } $msg = dt('Okay. Enjoy this !filling sandwich!str_spreads.', array('!filling' => $filling, '!str_spreads' => $str_spreads) ); drush_print("\n" . $msg . "\n"); if (drush_get_context('DRUSH_NOCOLOR')) { $filename = dirname(__FILE__) . '/sandwich-nocolor.txt'; } else { $filename = dirname(__FILE__) . '/sandwich.txt'; } drush_print(file_get_contents($filename)); } /** * Command argument complete callback. Provides argument * values for shell completion. * * @return * Array of popular fillings. */ function sandwich_make_me_a_sandwich_complete() { return array('values' => array('turkey', 'cheese', 'jelly', 'butter')); }