X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=vendor%2Fdrush%2Fdrush%2Fincludes%2Fpreflight.inc;h=bcba3e638007e46b7d220629d15f2c2bad6de1a3;hb=74df008bdbb3a11eeea356744f39b802369bda3c;hp=116fd3ea7d0398c34c7f02b19a09163d4536de36;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/vendor/drush/drush/includes/preflight.inc b/vendor/drush/drush/includes/preflight.inc index 116fd3ea7..bcba3e638 100644 --- a/vendor/drush/drush/includes/preflight.inc +++ b/vendor/drush/drush/includes/preflight.inc @@ -2,739 +2,19 @@ /** * @file - * Preflight, postflight and shutdown code. + * Postflight and shutdown code. */ -use Drush\Log\LogLevel; +use Drush\Drush; /** * 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. + * This function is still called by drush-launcher. It is no longer used by + * Drush itself. */ function drush_main() { - // Load Drush core include files, and parse command line arguments. - 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 drush_is_absolute_path($file) ? $file : DRUSH_BASE_PATH . DIRECTORY_SEPARATOR . $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(); - if (is_object($return)) { - $return = 0; - } - - // 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; -} - -/** - * Prepare Drush for preflight. - * - * Runs before drush_main(). - * - * @see drush_main() - * @see drush.php - */ -function drush_preflight_prepare() { - define('DRUSH_BASE_PATH', dirname(dirname(__FILE__))); - // Local means that autoload.php is inside of Drush. That is, Drush is its own Composer project. - // Global means autoload.php is outside of Drush. That is, Drush is a dependency of a bigger project. - $local_vendor_path = DRUSH_BASE_PATH . '/vendor/autoload.php'; - $global_vendor_path = DRUSH_BASE_PATH . '/../../../vendor/autoload.php'; - - // Check for a local composer install or a global composer install. Vendor dirs are in different spots). - if (file_exists($local_vendor_path)) { - $vendor_path = $local_vendor_path; - } - elseif (file_exists($global_vendor_path)) { - $vendor_path = $global_vendor_path; - } - else { - $msg = "Unable to load autoload.php. Run composer install to fetch dependencies and write this file (http://docs.drush.org/en/master/install-alternative/). Or if you prefer, use the drush.phar which already has dependencies included (http://docs.drush.org/en/master/install).\n"; - fwrite(STDERR, $msg); - return FALSE; - } - - $classloader = require $vendor_path; - - require_once DRUSH_BASE_PATH . '/includes/startup.inc'; - require_once DRUSH_BASE_PATH . '/includes/bootstrap.inc'; - require_once DRUSH_BASE_PATH . '/includes/environment.inc'; - require_once DRUSH_BASE_PATH . '/includes/annotationcommand_adapter.inc'; - require_once DRUSH_BASE_PATH . '/includes/command.inc'; - require_once DRUSH_BASE_PATH . '/includes/drush.inc'; - require_once DRUSH_BASE_PATH . '/includes/engines.inc'; - require_once DRUSH_BASE_PATH . '/includes/backend.inc'; - require_once DRUSH_BASE_PATH . '/includes/batch.inc'; - require_once DRUSH_BASE_PATH . '/includes/context.inc'; - require_once DRUSH_BASE_PATH . '/includes/sitealias.inc'; - require_once DRUSH_BASE_PATH . '/includes/exec.inc'; - require_once DRUSH_BASE_PATH . '/includes/drupal.inc'; - require_once DRUSH_BASE_PATH . '/includes/output.inc'; - require_once DRUSH_BASE_PATH . '/includes/cache.inc'; - require_once DRUSH_BASE_PATH . '/includes/filesystem.inc'; - require_once DRUSH_BASE_PATH . '/includes/dbtng.inc'; - require_once DRUSH_BASE_PATH . '/includes/array_column.inc'; - - // Stash our vendor path and classloader. - drush_set_context('DRUSH_VENDOR_PATH', dirname($vendor_path)); - drush_set_context('DRUSH_CLASSLOADER', $classloader); - - // Can't log until we have a logger, so we'll create this ASAP. - _drush_create_default_logger(); - - // Terminate immediately unless invoked as a command line script - if (!drush_verify_cli()) { - return drush_set_error('DRUSH_REQUIREMENTS_ERROR', dt('Drush is designed to run via the command line.')); - } - - // Check supported version of PHP. - // Note: If this is adjusted, check other code that compares - // PHP_VERSION, such as drush_json_encode(), runserver/runserver.drush.inc, and also - // adjust _drush_environment_check_php_ini() and the php_prohibited_options - // list in the drush script. See http://drupal.org/node/1748228 - define('DRUSH_MINIMUM_PHP', '5.4.5'); - if (version_compare(phpversion(), DRUSH_MINIMUM_PHP) < 0 && !getenv('DRUSH_NO_MIN_PHP')) { - return drush_set_error('DRUSH_REQUIREMENTS_ERROR', dt('Your command line PHP installation is too old. Drush requires at least PHP !version. To suppress this check, set the environment variable DRUSH_NO_MIN_PHP=1', array('!version' => DRUSH_MINIMUM_PHP))); - } - - if (!$return = _drush_environment_check_php_ini()) { - return; // An error was logged. - } - - $drush_info = drush_read_drush_info(); - define('DRUSH_VERSION', $drush_info['drush_version']); - $version_parts = explode('.', DRUSH_VERSION); - define('DRUSH_MAJOR_VERSION', $version_parts[0]); - define('DRUSH_MINOR_VERSION', $version_parts[1]); - - define('DRUSH_REQUEST_TIME', microtime(TRUE)); - - drush_set_context('argc', $GLOBALS['argc']); - drush_set_context('argv', $GLOBALS['argv']); - - // Set an error handler and a shutdown function - set_error_handler('drush_error_handler'); - register_shutdown_function('drush_shutdown'); - // We need some global options/arguments processed at this early stage. - drush_parse_args(); - - // Process initial global options such as --debug. - _drush_preflight_global_options(); - - drush_log(dt("Drush preflight prepare loaded autoloader at !autoloader", array('!autoloader' => realpath($vendor_path))), LogLevel::PREFLIGHT); -} - -/** - * During the initialization of Drush, this is the first - * step where we load our configuration and commandfiles, - * and select the site we are going to operate on; however, - * we take no irreversible actions (e.g. site bootstrapping). - * This allows commands that are declared with no bootstrap - * to select a new site root and bootstrap it. - * - * In this step we will register the shutdown function, - * parse the command line arguments and store them in their - * related contexts. - * - * Configuration files (drushrc.php) that are - * a) Specified on the command line - * b) Stored in the root directory of drush.php - * c) Stored in the home directory of the system user. - * - * Additionally the DRUSH_QUIET and DRUSH_BACKEND contexts, - * will be evaluated now, as they need to be set very early in - * the execution flow to be able to take affect. - * - * @return \Drush\Boot\Boot; - */ -function drush_preflight() { - // Create an alias '@none' to represent no Drupal site - _drush_sitealias_cache_alias('@none', array('root' => '', 'uri' => '')); - - // Discover terminal width for pretty output. - _drush_preflight_columns(); - - // Display is tidy now that column width has been handled. - drush_log(dt('Starting Drush preflight.'), LogLevel::PREFLIGHT); - - // Statically define a way to call drush again. - define('DRUSH_COMMAND', drush_find_drush()); - - // prime the CWD cache - drush_cwd(); - - // Set up base environment for system-wide file locations. - _drush_preflight_base_environment(); - - // Setup global alias_paths[] in context system. - if (!drush_get_option('local')) { - _drush_preflight_alias_path(); - } - if (!drush_get_option('local')) { - // Load a drushrc.php file in the drush.php's directory. - drush_load_config('drush'); - - // Load a drushrc.php file in the $ETC_PREFIX/etc/drush directory. - drush_load_config('system'); - - // Load a drushrc.php file at ~/.drushrc.php. - drush_load_config('user'); - - // Load a drushrc.php file in the ~/.drush directory. - drush_load_config('home.drush'); - } - - // Load a custom config specified with the --config option. - drush_load_config('custom'); - - _drush_preflight_global_options(); - // Load all the commandfiles findable from any of the - // scopes listed above. - _drush_find_commandfiles_drush(); - - // Look up the alias identifier that the user wants to use, - // either via an argument or via 'site-set'. - $target_alias = drush_sitealias_check_arg_and_site_set(); - - // Process the site alias that specifies which instance - // of Drush (local or remote) this command will operate on. - // We must do this after we load our config files (so that - // site aliases are available), but before the rest of - // Drush preflight and Drupal root bootstrap phase are - // done, since site aliases may set option values that - // affect these phases. - $alias_record = _drush_sitealias_set_context_by_name($target_alias); - - // Find the selected site based on --root, --uri or cwd - drush_preflight_root(); - - // Preflight the selected site, and load any configuration and commandfiles associated with it. - drush_preflight_site(); - - // Check to see if anything changed during the 'site' preflight - // that might allow us to find our alias record now - if (empty($alias_record)) { - $alias_record = _drush_sitealias_set_context_by_name($target_alias); - - // If the site alias settings changed late in the preflight, - // then run the preflight for the root and site contexts again. - if (!empty($alias_record)) { - $remote_host = drush_get_option('remote-host'); - if (!isset($remote_host)) { - drush_preflight_root(); - drush_preflight_site(); - } - } - } - - // Fail if we could not find the selected site alias. - if ($target_alias && empty($alias_record)) { - // We will automatically un-set the site-set alias if it could not be found. - // Otherwise, we'd be stuck -- the user would only be able to execute Drush - // commands again after `drush @none site-set @none`, and most folks would - // have a hard time figuring that out. - $site_env = drush_sitealias_site_get(); - if ($site_env == $target_alias) { - drush_sitealias_site_clear(); - } - return drush_set_error('DRUSH_BOOTSTRAP_NO_ALIAS', dt("Could not find the alias !alias", array('!alias' => $target_alias))); - } - - // If applicable swaps in shell alias values. - drush_shell_alias_replace($target_alias); - - // Copy global options to their respective contexts - _drush_preflight_global_options(); - - // Set environment variables based on #env-vars. - drush_set_environment_vars($alias_record); - - // Select the bootstrap object and return it. - return drush_select_bootstrap_class(); -} - -/** - * If --root is provided, set context. - */ -function drush_preflight_root() { - $root = drush_get_option('root'); - if (!isset($root)) { - $root = drush_locate_root(); - } - if ($root) { - $root = realpath($root); - } - // @todo This context name should not mention Drupal. - // @todo Drupal code should use DRUSH_DRUPAL_ROOT instead of this constant. - drush_set_context('DRUSH_SELECTED_DRUPAL_ROOT', $root); - - // Load the config options from Drupal's /drush, ../drush, and sites/all/drush directories, - // even prior to bootstrapping the root. - drush_load_config('drupal'); - - // Search for commandfiles in the root locations - $discovery = annotationcommand_adapter_get_discovery(); - $searchpath = [dirname($root) . '/drush', "$root/drush", "$root/sites/all/drush"]; - - $drush_root_extensions = $discovery->discover($searchpath, '\Drush'); - drush_set_context( - 'DRUSH_ANNOTATED_COMMANDFILES', - array_merge( - drush_get_context('DRUSH_ANNOTATED_COMMANDFILES'), - $drush_root_extensions - ) - ); -} - -function drush_preflight_site() { - // Load the Drupal site configuration options upfront. - drush_load_config('site'); - - // Determine URI and set constants/contexts accordingly. Keep this after loading of drupal,site configs. - _drush_preflight_uri(); - - // If someone set 'uri' in the 'site' context, then copy it - // to the 'process' context (to give it a higher priority - // than the 'cli' and 'alias' contexts) and reset our selected - // site and @self alias. - $uri = drush_get_option('uri'); - if ($uri != drush_get_option('uri', $uri, 'site')) { - drush_set_option('uri', drush_get_option('uri', $uri, 'site')); - _drush_preflight_uri(); - } - - // Create a @self site alias record. - drush_sitealias_create_self_alias(); -} - -function _drush_preflight_global_options() { - // Debug implies verbose - $verbose = drush_get_option('verbose', FALSE); - $debug = drush_get_option('debug', FALSE); - drush_set_context('DRUSH_VERBOSE', $verbose || $debug); - drush_set_context('DRUSH_DEBUG', $debug); - drush_set_context('DRUSH_DEBUG_NOTIFY', $verbose && $debug); - drush_set_context('DRUSH_SIMULATE', drush_get_option('simulate', FALSE)); - - // Backend implies affirmative unless negative is explicitly specified - drush_set_context('DRUSH_NEGATIVE', drush_get_option('no', FALSE)); - drush_set_context('DRUSH_AFFIRMATIVE', drush_get_option(array('yes', 'pipe'), FALSE) || (drush_get_context('DRUSH_BACKEND') && !drush_get_context('DRUSH_NEGATIVE'))); - - // Pipe implies quiet. - drush_set_context('DRUSH_QUIET', drush_get_option(array('quiet', 'pipe'))); - drush_set_context('DRUSH_PIPE', drush_get_option('pipe')); - - // Suppress colored logging if --nocolor option is explicitly given or if - // terminal does not support it. - $nocolor = (drush_get_option('nocolor', FALSE)); - if (!$nocolor) { - // Check for colorless terminal. If there is no terminal, then - // 'tput colors 2>&1' will return "tput: No value for $TERM and no -T specified", - // which is not numeric and therefore will put us in no-color mode. - $colors = exec('tput colors 2>&1'); - $nocolor = !($colors === FALSE || (is_numeric($colors) && $colors >= 3)); - } - drush_set_context('DRUSH_NOCOLOR', $nocolor); -} - -/** - * Sets up basic environment that controls where Drush looks for files on a - * system-wide basis. Important to call for "early" functions that need to - * work with unit tests. - */ -function _drush_preflight_base_environment() { - // Copy ETC_PREFIX and SHARE_PREFIX from environment variables if available. - // This alters where we check for server-wide config and alias files. - // Used by unit test suite to provide a clean environment. - if (getenv('ETC_PREFIX')) drush_set_context('ETC_PREFIX', getenv('ETC_PREFIX')); - if (getenv('SHARE_PREFIX')) drush_set_context('SHARE_PREFIX', getenv('SHARE_PREFIX')); - - drush_set_context('DOC_PREFIX', DRUSH_BASE_PATH); - if (!file_exists(DRUSH_BASE_PATH . '/README.md') && file_exists(drush_get_context('SHARE_PREFIX', '/usr') . '/share/doc/drush' . '/README.md')) { - drush_set_context('DOC_PREFIX', drush_get_context('SHARE_PREFIX', '/usr') . '/share/doc/drush'); - } - - $default_prefix_configuration = drush_is_windows() ? getenv('ALLUSERSPROFILE') . '/Drush' : ''; - $default_prefix_commandfile = drush_is_windows() ? getenv('ALLUSERSPROFILE') . '/Drush' : '/usr'; - $site_wide_configuration_dir = drush_get_context('ETC_PREFIX', $default_prefix_configuration) . '/etc/drush'; - $site_wide_commandfile_dir = drush_get_context('SHARE_PREFIX', $default_prefix_commandfile) . '/share/drush/commands'; - drush_set_context('DRUSH_SITE_WIDE_CONFIGURATION', $site_wide_configuration_dir); - drush_set_context('DRUSH_SITE_WIDE_COMMANDFILES', $site_wide_commandfile_dir); - - $server_home = drush_server_home(); - if (isset($server_home)) { - drush_set_context('DRUSH_PER_USER_CONFIGURATION', $server_home . '/.drush'); - } -} - -/* - * Set the terminal width, used for wrapping table output. - * Normally this is exported using tput in the drush script. - * If this is not present we do an additional check using stty here. - * On Windows in CMD and PowerShell is this exported using mode con. - */ -function _drush_preflight_columns() { - if (!($columns = getenv('COLUMNS'))) { - // Trying to export the columns using stty. - exec('stty size 2>&1', $columns_output, $columns_status); - if (!$columns_status) $columns = preg_replace('/\d+\s(\d+)/', '$1', $columns_output[0], -1, $columns_count); - - // If stty fails and Drush us running on Windows are we trying with mode con. - if (($columns_status || !$columns_count) && drush_is_windows()) { - $columns_output = array(); - exec('mode con', $columns_output, $columns_status); - if (!$columns_status && is_array($columns_output)) { - $columns = (int)preg_replace('/\D/', '', $columns_output[4], -1, $columns_count); - } - else { - drush_log(dt('Drush could not detect the console window width. Set a Windows Environment Variable of COLUMNS to the desired width.'), LogLevel::WARNING); - } - } - - // Failling back to default columns value - if (empty($columns)) { - $columns = 80; - } - } - // If a caller wants to reserve some room to add additional - // information to the drush output via post-processing, the - // --reserve-margin flag can be used to declare how much - // space to leave out. This only affects drush functions - // such as drush_print_table() that wrap the output. - $columns -= drush_get_option('reserve-margin', 0); - drush_set_context('DRUSH_COLUMNS', $columns); -} - -function _drush_preflight_alias_path() { - $alias_path =& drush_get_context('ALIAS_PATH'); - $default_prefix_configuration = drush_is_windows() ? getenv('ALLUSERSPROFILE') . '/Drush' : ''; - $site_wide_configuration_dir = drush_get_context('ETC_PREFIX', $default_prefix_configuration) . '/etc/drush'; - $alias_path[] = drush_sitealias_alias_base_directory($site_wide_configuration_dir); - - $alias_path[] = drush_sitealias_alias_base_directory(dirname(__FILE__) . '/..'); - - $server_home = drush_server_home(); - if (isset($server_home)) { - $alias_path[] = drush_sitealias_alias_base_directory($server_home . '/.drush'); - } -} - -/* - * Set root and uri. - */ -function _drush_preflight_root_uri() { - drush_preflight_root(); - _drush_preflight_uri(); -} - -/** - * If --uri is provided, set context. - */ -function _drush_preflight_uri() { - $uri = drush_get_option('uri', ''); - drush_set_context('DRUSH_SELECTED_URI', $uri); -} - -function _drush_find_commandfiles_drush() { - // Core commands shipping with Drush - $searchpath[] = dirname(__FILE__) . '/../commands/'; - - // User commands, specified by 'include' option - $include = drush_get_context('DRUSH_INCLUDE', array()); - foreach ($include as $path) { - if (is_dir($path)) { - drush_log('Include ' . $path, LogLevel::NOTICE); - $searchpath[] = $path; - } - } - - if (!drush_get_option('local')) { - // System commands, residing in $SHARE_PREFIX/share/drush/commands - $share_path = drush_get_context('DRUSH_SITE_WIDE_COMMANDFILES'); - if (is_dir($share_path)) { - $searchpath[] = $share_path; - } - - // User commands, residing in ~/.drush - $per_user_config_dir = drush_get_context('DRUSH_PER_USER_CONFIGURATION'); - if (!empty($per_user_config_dir)) { - $searchpath[] = $per_user_config_dir; - } - } - - // @todo the zero parameter is a bit weird here. It's $phase. - _drush_add_commandfiles($searchpath, 0); - - // Also discover Drush's own annotation commands. - $discovery = annotationcommand_adapter_get_discovery(); - $annotation_commandfiles = $discovery->discover(DRUSH_BASE_PATH . '/lib/Drush', '\Drush'); - - // And, finally, search for commandfiles in the $searchpath - $searchpath = array_map( - function ($item) { - if (strtolower(basename($item)) == 'commands') { - return dirname($item); - } - return $item; - }, - $searchpath - ); - $global_drush_extensions = $discovery->discover($searchpath, '\Drush'); - $annotation_commandfiles += $global_drush_extensions; - - drush_set_context('DRUSH_ANNOTATED_COMMANDFILES', $annotation_commandfiles); -} - -/** - * Handle any command preprocessing that may need to be done, including - * potentially redispatching the command immediately (e.g. for remote - * commands). - * - * @return - * TRUE if the command was handled remotely. - */ -function drush_preflight_command_dispatch() { - $interactive = drush_get_option('interactive', FALSE); - - // The command will be executed remotely if the --remote-host flag - // is set; note that if a site alias is provided on the command line, - // and the site alias references a remote server, then the --remote-host - // option will be set when the site alias is processed. - // @see drush_sitealias_check_arg_and_site_set and _drush_sitealias_set_context_by_name - $remote_host = drush_get_option('remote-host'); - $site_list = drush_get_option('site-list'); - // Get the command early so that we can allow commands to directly handle remote aliases if they wish - $command = drush_parse_command(); - drush_command_default_options($command); - - // If the command sets the 'strict-option-handling' flag, then we will remove - // any cli options that appear after the command name from the 'cli' context. - // The cli options that appear before the command name are stored in the - // 'DRUSH_GLOBAL_CLI_OPTIONS' context, so we will just overwrite the cli context - // with this, after doing the neccessary fixup from short-form to long-form options. - // After we do that, we put back any local drush options identified by $command['options']. - if (is_array($command) && !empty($command['strict-option-handling'])) { - $cli_options = drush_get_context('DRUSH_GLOBAL_CLI_OPTIONS', array()); - // Now we are going to sort out any options that exist in $command['options']; - // we will remove these from DRUSH_COMMAND_ARGS and put them back into the - // cli options. - $cli_context = drush_get_context('cli'); - $remove_from_command_args = array(); - foreach ($command['options'] as $option => $info) { - if (array_key_exists($option, $cli_context)) { - $cli_options[$option] = $cli_context[$option]; - $remove_from_command_args[$option] = $option; - } - } - if (!empty($remove_from_command_args)) { - $drush_command_args = array(); - foreach (drush_get_context('DRUSH_COMMAND_ARGS') as $arg) { - if (!_drush_should_remove_command_arg($arg, $remove_from_command_args)) { - $drush_command_args[] = $arg; - } - } - drush_set_context('DRUSH_COMMAND_ARGS', $drush_command_args); - } - drush_expand_short_form_options($cli_options); - drush_set_context('cli', $cli_options); - _drush_preflight_global_options(); - } - $args = drush_get_arguments(); - $command_name = array_shift($args); - $root = drush_get_context('DRUSH_SELECTED_DRUPAL_ROOT'); - $local_drush = drush_get_option('drush-script'); - if (empty($local_drush) && !empty($root)) { - $local_drush = find_wrapper_or_launcher($root); - } - $is_local = drush_get_option('local'); - $values = NULL; - if (!empty($root) && !empty($local_drush) && empty($is_local)) { - if (!drush_is_absolute_path($local_drush)) { - $local_drush = $root . DIRECTORY_SEPARATOR . $local_drush; - } - $local_drush = realpath($local_drush); - $this_drush = drush_find_drush(); - // If there is a local Drush selected, and it is not the - // same Drush that is currently running, redispatch to it. - // We assume that if the current Drush is nested inside - // the current Drupal root (or, more specifically, the - // current Drupal root's parent), then it is a site-local Drush. - // We avoid redispatching in that instance to prevent an - // infinite loop. - if (file_exists($local_drush) && !drush_is_nested_directory(dirname($root), $this_drush)) { - $uri = drush_get_context('DRUSH_SELECTED_URI'); - $aditional_options = array( - 'root' => $root, - ); - if (!empty($uri)) { - $aditional_options['uri'] = $uri; - } - // We need to chdir to the Drupal root here, for the - // benefit of the Drush wrapper. - chdir($root); - $values = drush_do_command_redispatch(is_array($command) ? $command : $command_name, $args, NULL, NULL, $local_drush, TRUE, $aditional_options); - } - } - // If the command sets the 'handle-remote-commands' flag, then we will short-circuit - // remote command dispatching and site-list command dispatching, and always let - // the command handler run on the local machine. - if (is_array($command) && !empty($command['handle-remote-commands'])) { - return FALSE; - } - if (isset($remote_host)) { - $remote_user = drush_get_option('remote-user'); - - // Force interactive mode if there is a single remote target. #interactive is added by drush_do_command_redispatch - $user_interactive = drush_get_option('interactive'); - drush_set_option('interactive', TRUE); - $values = drush_do_command_redispatch(is_array($command) ? $command : $command_name, $args, $remote_host, $remote_user, $user_interactive); - } - // If the --site-list flag is set, then we will execute the specified - // command once for every site listed in the site list. - if (isset($site_list)) { - if (!is_array($site_list)) { - $site_list = explode(',', $site_list); - } - $site_record = array('site-list' => $site_list); - $args = drush_get_arguments(); - - if (!drush_get_context('DRUSH_SIMULATE') && !$interactive && !drush_get_context('DRUSH_AFFIRMATIVE') && !drush_get_context('DRUSH_QUIET')) { - drush_print(dt("You are about to execute '!command' non-interactively (--yes forced) on all of the following targets:", array('!command' => implode(" ", $args)))); - foreach ($site_list as $one_destination) { - drush_print(dt(' !target', array('!target' => $one_destination))); - } - - if (drush_confirm('Continue? ') === FALSE) { - drush_user_abort(); - return TRUE; - } - } - $command_name = array_shift($args); - $multi_options = drush_redispatch_get_options(); - $backend_options = array(); - if (drush_get_option('pipe') || drush_get_option('interactive')) { - $backend_options['interactive'] = TRUE; - } - if (drush_get_option('no-label', FALSE)) { - $backend_options['no-label'] = TRUE; - } - // If the user specified a format, try to look up the - // default list separator for the specified format. - // If the user did not specify a different label separator, - // then pass in the default as an option, so that the - // separator between the items in the list and the site - // name will be consistent. - $format = drush_get_option('format', FALSE); - if ($format && !array_key_exists('label-separator', $multi_options)) { - $formatter = drush_load_engine('outputformat', $format); - if ($formatter) { - $list_separator = $formatter->get_info('list-separator'); - if ($list_separator) { - $multi_options['label-separator'] = $list_separator; - } - } - } - $values = drush_invoke_process($site_record, $command_name, $args, $multi_options, $backend_options); - } - if (isset($values)) { - if (is_array($values) && ($values['error_status'] > 0)) { - // Force an error result code. Note that drush_shutdown() will still run. - drush_set_context('DRUSH_EXECUTION_COMPLETED', TRUE); - exit($values['error_status']); - } - return TRUE; - } - return FALSE; -} - -/** - * Look for instances of arguments or parameters that - * start with "~/". Replace these with "$HOME/". - * - * Note that this function is called _after_ Drush does - * its redispatch checks; tildes are passed through - * unmodified on a redispatch, and are only expanded when - * a command is handled locally. - */ -function drush_preflight_tilde_expansion(&$command) { - // Skip tilde expansion for commands that use - // stict option handling, or those that explicitly - // turn it off via $command['tilde-expansion'] = FALSE. - if ($command['tilde-expansion'] && !$command['strict-option-handling']) { - $cli =& drush_get_context('cli'); - $match = '#^~/#'; - $replacement = drush_server_home() . '/'; - foreach ($cli as $key => $value) { - if (is_string($value) && preg_match($match, $value)) { - $cli[$key] = preg_replace($match, $replacement, $value); - } - } - $command['arguments'] = array_map(function($value) use($match, $replacement) { return is_string($value) ? preg_replace($match, $replacement, $value) : $value; } , $command['arguments']); - } + require dirname(__DIR__) . '/drush.php'; } /** @@ -761,45 +41,31 @@ function drush_postflight() { * result of drush_get_error() if it wasn't. */ function drush_shutdown() { + // Avoid doing anything if our container has not been initialized yet. + if (!Drush::hasContainer()) { + return; + } + // Mysteriously make $user available during sess_write(). Avoids a NOTICE. global $user; if (!drush_get_context('DRUSH_EXECUTION_COMPLETED', FALSE) && !drush_get_context('DRUSH_USER_ABORT', FALSE)) { $php_error_message = ''; if ($error = error_get_last()) { - $php_error_message = "\n" . dt('Error: !message in !file, line !line', array('!message' => $error['message'], '!file' => $error['file'], '!line' => $error['line'])); + $php_error_message = "\n" . dt('Error: !message in !file, line !line', ['!message' => $error['message'], '!file' => $error['file'], '!line' => $error['line']]); } // We did not reach the end of the drush_main function, // this generally means somewhere in the code a call to exit(), // was made. We catch this, so that we can trigger an error in // those cases. - drush_set_error("DRUSH_NOT_COMPLETED", dt("Drush command terminated abnormally due to an unrecoverable error.!message", array('!message' => $php_error_message))); + drush_set_error("DRUSH_NOT_COMPLETED", dt("Drush command terminated abnormally due to an unrecoverable error.!message", ['!message' => $php_error_message])); // Attempt to give the user some advice about how to fix the problem _drush_postmortem(); } - // @todo Ask the bootstrap object (or maybe dispatch) how far we got. - $phase = drush_get_context('DRUSH_BOOTSTRAP_PHASE'); - if (drush_get_context('DRUSH_BOOTSTRAPPING')) { - switch ($phase) { - case DRUSH_BOOTSTRAP_DRUPAL_FULL : - ob_end_clean(); - _drush_log_drupal_messages(); - drush_set_error('DRUSH_DRUPAL_BOOTSTRAP_ERROR'); - break; - } - } - - if (drush_get_context('DRUSH_BACKEND', FALSE)) { + if (Drush::backend()) { drush_backend_output(); } - elseif (drush_get_context('DRUSH_QUIET', FALSE)) { - ob_end_clean(); - // If we are in pipe mode, emit the compact representation of the command, if available. - if (drush_get_context('DRUSH_PIPE')) { - drush_pipe_output(); - } - } // This way drush_return_status() will always be the last shutdown function (unless other shutdown functions register shutdown functions...) // and won't prevent other registered shutdown functions (IE from numerous cron methods) from running by calling exit() before they get a chance.