/** * The main Drush function. * * - Runs "early" option code, if set (see global options). * - Parses the command line arguments, configuration files and environment. * - Prepares and executes a Drupal bootstrap, if possible, * - Dispatches the given command. * * function_exists('drush_main') may be used by modules to detect whether * they are being called from Drush. See http://drupal.org/node/1181308 * and http://drupal.org/node/827478 * * @return mixed * Whatever the given command returns. */ function drush_main() { // Load Drush core include files, and parse command line arguments. require dirname(__FILE__) . '/includes/preflight.inc'; if (drush_preflight_prepare() === FALSE) { return 1; } // Start code coverage collection. if ($coverage_file = drush_get_option('drush-coverage', FALSE)) { drush_set_context('DRUSH_CODE_COVERAGE', $coverage_file); xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); register_shutdown_function('drush_coverage_shutdown'); } // Load the global Drush configuration files, and global Drush commands. // Find the selected site based on --root, --uri or cwd // Preflight the selected site, and load any configuration and commandfiles associated with it. // Select and return the bootstrap class. $bootstrap = drush_preflight(); // Reset our bootstrap phase to the beginning drush_set_context('DRUSH_BOOTSTRAP_PHASE', DRUSH_BOOTSTRAP_NONE); $return = ''; if (!drush_get_error()) { if ($file = drush_get_option('early', FALSE)) { require_once $file; $function = 'drush_early_' . basename($file, '.inc'); if (function_exists($function)) { if ($return = $function()) { // If the function returns FALSE, we continue and attempt to bootstrap // as normal. Otherwise, we exit early with the returned output. if ($return === TRUE) { $return = ''; } } } } else { // Do any necessary preprocessing operations on the command, // perhaps handling immediately. $command_handled = drush_preflight_command_dispatch(); if (!$command_handled) { $return = $bootstrap->bootstrap_and_dispatch(); } } } // TODO: Get rid of global variable access here, and just trust // the bootstrap object returned from drush_preflight(). This will // require some adjustments to Drush bootstrapping. // See: https://github.com/drush-ops/drush/pull/1303 if ($bootstrap = drush_get_bootstrap_object()) { $bootstrap->terminate(); } drush_postflight(); // How strict are we? If we are very strict, turn 'ok' into 'error' // if there are any warnings in the log. if ($return == 0 && drush_get_option('strict') > 1 && drush_log_has_errors()) { $return = 1; } // After this point the drush_shutdown function will run, // exiting with the correct exit code. return $return; }
/** * Test various combinations of XHProf flag options. * * @dataProvider xhOptionProvider */ public function testFlags($name, $options, $expected) { drush_preflight(); foreach ($options as $option_name => $option_value) { drush_set_option($option_name, $option_value); } $this->assertEquals($expected, xh_flags(), $name); }
function setUp() { // Bootstrap to ensure the auto-loaded is running so that Console_Table is found. drush_preflight(); $this->original_columns = drush_get_context('DRUSH_COLUMNS'); // Some table data we reuse between tests. $this->numbers = array(array('1', '12', '123'), array('1234', '12345', '123456'), array('1234567', '12345678', '123456789')); $this->words = array(array('Drush is a command line shell', 'scripting interface', 'for Drupal'), array('A veritable', 'Swiss Army knife', 'designed to make life easier for us')); }
/** * Calls a Drush command. * * This is an exact copy of drush_main from drush.php, but that file * cannot be loaded because it produces side effects. * * @see drush_main * * @return int|string */ protected static function drushMain() { $return = ''; // Start code coverage collection. if ($coverage_file = drush_get_option('drush-coverage', false)) { drush_set_context('DRUSH_CODE_COVERAGE', $coverage_file); xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); register_shutdown_function('drush_coverage_shutdown'); } /* Set up bootstrap object, so that * - 'early' files can bootstrap when needed. * - bootstrap constants are available. */ $bootstrap_class = drush_get_option('bootstrap_class', 'Drush\\Boot\\DrupalBoot'); $bootstrap = new $bootstrap_class(); drush_set_context('DRUSH_BOOTSTRAP_OBJECT', $bootstrap); $bootstrap->preflight(); // Process initial global options such as --debug. _drush_preflight_global_options(); $return = ''; drush_preflight(); if (!drush_get_error()) { if ($file = drush_get_option('early', false)) { require_once $file; $function = 'drush_early_' . basename($file, '.inc'); if (function_exists($function)) { if ($return = $function()) { // If the function returns FALSE, we continue and attempt to bootstrap // as normal. Otherwise, we exit early with the returned output. if ($return === TRUE) { $return = ''; } } } } else { // Do any necessary preprocessing operations on the command, // perhaps handling immediately. $command_handled = drush_preflight_command_dispatch(); if (!$command_handled) { $bootstrap = drush_get_context('DRUSH_BOOTSTRAP_OBJECT'); $return = $bootstrap->bootstrap_and_dispatch(); } } } drush_postflight(); // How strict are we? If we are very strict, turn 'ok' into 'error' // if there are any warnings in the log. if ($return == 0 && drush_get_option('strict') > 1 && drush_log_has_errors()) { $return = 1; } // After this point the drush_shutdown function will run, // exiting with the correct exit code. return $return; }
/** * Assert that $command has interesting properties. Reference command by * it's alias (dl) to assure that those aliases are built as expected. */ public function testGetCommands() { drush_preflight(); $commands = drush_get_commands(); $command = $commands['dl']; $this->assertEquals('dl', current($command['aliases'])); $this->assertArrayHasKey('version_control', $command['engines']); $this->assertArrayHasKey('package_handler', $command['engines']); $this->assertArrayHasKey('release_info', $command['engines']); $this->assertEquals('pm-download', $command['command']); $this->assertEquals('pm', $command['commandfile']); $this->assertEquals('drush_command', $command['callback']); $this->assertArrayHasKey('examples', $command['sections']); $this->assertTrue($command['is_alias']); $command = $commands['pm-download']; $this->assertArrayNotHasKey('is_alias', $command); }
/** * Test various output formats using php-eval with no Drupal site. * * @dataProvider provider **/ public function testOutputFormat($name, $format, $data, $expected) { drush_preflight(); $this->assertEquals($expected, trim(drush_format($data, array(), $format)), $name . ': ' . $format); }