'No-op command, used to test completion for commands that start the same as other commands.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, ); $items['unit-eval'] = array( 'description' => 'Works like php-eval. Used for testing $command_specific context.', 'bootstrap' => DRUSH_BOOTSTRAP_MAX, 'callback' => 'drush_core_php_eval', ); $items['unit-invoke'] = array( 'description' => 'Return an array indicating which invoke hooks got called.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, 'callback' => 'drush_unit_invoke_primary', ); $items['unit-batch'] = array( 'description' => 'Run a batch process.', 'bootstrap' => DRUSH_BOOTSTRAP_MAX, ); $items['unit-return-options'] = array( 'description' => 'Return options as function result.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, ); $items['unit-return-argv'] = array( 'description' => 'Return original argv as function result.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, ); $items['missing-callback'] = array( 'description' => 'Command with no callback function, to test error reporting.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, ); $items['unit-drush-dependency'] = array( 'description' => 'Command depending on an unknown commandfile.', 'bootstrap' => DRUSH_BOOTSTRAP_NONE, 'drush dependencies' => array('unknown-commandfile'), ); return $items; } // Implement each invoke hook with the same single line of code. // That line records that the hook was called. function drush_unit_invoke_init() {unit_invoke_log(__FUNCTION__);} function drush_unit_invoke_validate() {unit_invoke_log(__FUNCTION__);} function drush_unit_pre_unit_invoke() {unit_invoke_log(__FUNCTION__);} // Primary callback is not invoked when command specifies a 'callback'. // function drush_unit_invoke() {unit_invoke_log(__FUNCTION__);} function drush_unit_invoke_primary() {unit_invoke_log(__FUNCTION__);} function drush_unit_pre_unit_invoke_rollback() {unit_invoke_log(__FUNCTION__);} function drush_unit_post_unit_invoke_rollback() {unit_invoke_log(__FUNCTION__);} // Record that hook_drush_init() fired. function unit_drush_init() { $command = drush_get_command(); if ($command['command'] == 'unit-invoke') { unit_invoke_log(__FUNCTION__); } } function drush_unit_post_unit_invoke() { // Record that this hook was called. unit_invoke_log(__FUNCTION__); // Make sure we enter into rollback. drush_set_error(''); } /** * The final invoke hook. Emit the call history. * Cannot use 'exit' as it does not fire in rollback scenario. */ function drush_unit_invoke_validate_rollback() { unit_invoke_log(__FUNCTION__); print json_encode(unit_invoke_log()); } function unit_invoke_log($function = NULL) { static $called = array(); if ($function) { $called[] = $function; } else { return $called; } } /** * Command callback. */ function drush_unit_batch() { // Reduce php memory/time limits to test backend respawn. // TODO. $batch = array( 'operations' => array( array('_drush_unit_batch_operation', array()), ), 'finished' => '_drush_unit_batch_finished', // 'file' => Doesn't work for us. Drupal 7 enforces this path // to be relative to DRUPAL_ROOT. // @see _batch_process(). ); batch_set($batch); drush_backend_batch_process(); // Print the batch output. drush_backend_output(); } function _drush_unit_batch_operation(&$context) { $context['message'] = "!!! ArrayObject does its job."; for ($i = 0; $i < 5; $i++) { drush_print("Iteration $i"); } $context['finished'] = 1; } function _drush_unit_batch_finished() { // Restore php limits. // TODO. } // Return all of the option values passed in to this routine, minus the // global options. function drush_unit_return_options() { $all_option_values = array_merge(drush_get_context('cli'), drush_get_context('stdin')); foreach (drush_get_global_options() as $key => $info) { unset($all_option_values[$key]); } if (isset($all_option_values['log-message'])) { drush_log($all_option_values['log-message'], 'warning'); drush_log("done", 'warning'); unset($all_option_values['log-message']); } return $all_option_values; } // Return all of the original arguments passed to this script function drush_unit_return_argv() { return drush_get_context('argv'); }