Drush: includes/command.inc Source File

  1. 7.x doxygen/html/includes_2command_8inc_source.html
  2. master doxygen/html/command_8inc_source.html
  3. master doxygen/html/includes_2command_8inc_source.html
Go to the documentation of this file.
1 <?php
2 
3 /**
4  * @defgroup dispatching Command dispatching functions.
5  * @{
6  *
7  * These functions handle command dispatching, and can
8  * be used to programatically invoke drush commands in
9  * different ways.
10  */
11 
12 /**
13  * Invokes a Drush API call, including all hooks.
14  *
15  * Executes the specified command with the specified arguments on the currently
16  * bootstrapped site using the current option contexts. Note that it will not
17  * bootstrap any further than the current command has already bootstrapped;
18  * therefore, you should only invoke commands that have the same (or lower)
19  * bootstrap requirements.
20  *
21  * Commands execute with the same options that the user provided on the
22  * commandline. If you need to invoke another Drush command with options you
23  * specify, use drush_invoke_process() instead.
24  *
25  * @param string $command
26  * The command to invoke.
27  * @param array $arguments
28  * An array of argument to pass into the command.
29  *
30  * @return mixed|false
31  * The return value from drush_dispatch() or FALSE on error.
32  *
33  * @see drush_invoke_process()
34  */
35 function drush_invoke($command, $arguments = array()) {
36  // Convert a standalone argument to a single-element array.
37  if (!is_array($arguments)) {
38  $arguments = array($arguments);
39  }
40  $commands = drush_get_commands();
41  if (array_key_exists($command, $commands)) {
42  $command = $commands[$command];
43  // Drush overloads the 'arguments' element, which contains the help string
44  // for the allowed arguments for the command when fetched, and is fixed up
45  // by _drush_prepare_command() to contain the actual commandline arguments
46  // during dispatching.
47  $command['arguments'] = array();
48  return drush_dispatch($command, $arguments);
49  }
50  else {
51  return drush_set_error('DRUSH_COMMAND_NOT_FOUND', dt("The drush command '!command' could not be found.", array('!command' => $command)));
52  }
53 }
54 
55 /**
56  * Invoke a command in a new process, targeting the site specified by
57  * the provided site alias record.
58  *
59  * @param array $site_alias_record
60  * The site record to execute the command on. Use '@self' to run on the current site.
61  * @param string $command_name
62  * The command to invoke.
63  * @param array $commandline_args
64  * The arguments to pass to the command.
65  * @param array $commandline_options
66  * The options (e.g. --select) to provide to the command.
67  * @param mixed $backend_options
68  * TRUE - integrate errors
69  * FALSE - do not integrate errors
70  * array - @see drush_backend_invoke_concurrent
71  * There are also several options that _only_ work when set in
72  * this parameter. They include:
73  * 'invoke-multiple'
74  * If $site_alias_record represents a single site, then 'invoke-multiple'
75  * will cause the _same_ command with the _same_ arguments and options
76  * to be invoked concurrently (e.g. for running concurrent batch processes).
77  * 'concurrency'
78  * Limits the number of concurrent processes that will run at the same time.
79  * Defaults to '4'.
80  * 'override-simulated'
81  * Forces the command to run, even in 'simulated' mode. Useful for
82  * commands that do not change any state on the machine, e.g. to fetch
83  * database information for sql-sync via sql-conf.
84  * 'interactive'
85  * Overrides the backend invoke process to run commands interactively.
86  * 'fork'
87  * Overrides the backend invoke process to run non blocking commands in
88  * the background. Forks a new process by adding a '&' at the end of the
89  * command. The calling process does not receive any output from the child
90  * process. The fork option is used to spawn a process that outlives its
91  * parent.
92  *
93  * @return
94  * If the command could not be completed successfully, FALSE.
95  * If the command was completed, this will return an associative
96  * array containing the results of the API call.
98  *
99  * Do not change the signature of this function! drush_invoke_process
100  * is one of the key Drush APIs. See http://drupal.org/node/1152908
101  */
102 function drush_invoke_process($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = TRUE) {
103  if (is_array($site_alias_record) && array_key_exists('site-list', $site_alias_record)) {
104  list($site_alias_records, $not_found) = drush_sitealias_resolve_sitespecs($site_alias_record['site-list']);
105  if (!empty($not_found)) {
106  drush_log(dt("Not found: @list", array("@list" => implode(', ', $not_found))), 'warning');
107  return FALSE;
108  }
109  $site_alias_records = drush_sitealias_simplify_names($site_alias_records);
110  foreach ($site_alias_records as $alias_name => $alias_record) {
111  $invocations[] = array(
112  'site' => $alias_record,
113  'command' => $command_name,
114  'args' => $commandline_args,
115  );
116  }
117  }
118  else {
119  $invocations[] = array(
120  'site' => $site_alias_record,
121  'command' => $command_name,
122  'args' => $commandline_args);
123  $invoke_multiple = drush_get_option_override($backend_options, 'invoke-multiple', 0);
124  if ($invoke_multiple) {
125  $invocations = array_fill(0, $invoke_multiple, $invocations[0]);
126  }
127  }
128  return drush_backend_invoke_concurrent($invocations, $commandline_options, $backend_options);
129 }
130 
131 /**
132  * Given a command record, dispatch it as if it were
133  * the original command. Executes in the currently
134  * bootstrapped site using the current option contexts.
135  * Note that drush_dispatch will not bootstrap any further than the
136  * current command has already bootstrapped; therefore, you should only invoke
137  * commands that have the same (or lower) bootstrap requirements.
138  *
139  * @param command
140  * A full $command such as returned by drush_get_commands(),
141  * or a string containing the name of the command record from
142  * drush_get_commands() to call.
143  * @param arguments
144  * An array of argument values.
145  *
146  * @see drush_topic_docs_topic().
147  */
148 function drush_dispatch($command, $arguments = array()) {
149  drush_set_command($command);
150  $return = FALSE;
151 
152  if ($command) {
153  // Add arguments, if this has not already been done.
154  // (If the command was fetched from drush_parse_command,
155  // then you cannot provide arguments to drush_dispatch.)
156  if (empty($command['arguments'])) {
157  _drush_prepare_command($command, $arguments);
158  }
159 
160  // Add command-specific options, if applicable.
162 
163  // Test to see if any of the options in the 'cli' context
164  // are not represented in the command structure.
165  if ((_drush_verify_cli_options($command) === FALSE) || (_drush_verify_cli_arguments($command) === FALSE)) {
166  return FALSE;
167  }
168 
169  // Give command files an opportunity to alter the command record
170  drush_command_invoke_all_ref('drush_command_alter', $command);
171 
172  // Include and validate command engines.
173  if (drush_load_command_engines($command) === FALSE) {
174  return FALSE;
175  }
176 
177  // Call the callback function of the active command.
178  $return = call_user_func_array($command['callback'], $command['arguments']);
179  }
180 
181  // Add a final log entry, just so a timestamp appears.
182  drush_log(dt('Command dispatch complete'), 'notice');
183 
184  return $return;
185 }
186 
187 /**
188  * Entry point for commands into the drush_invoke() API
189  *
190  * If a command does not have a callback specified, this function will be called.
191  *
192  * This function will trigger $hook_drush_init, then if no errors occur,
193  * it will call drush_invoke() with the command that was dispatch.
194  *
195  * If no errors have occured, it will run $hook_drush_exit.
196  */
197 function drush_command() {
198  $args = func_get_args();
199  $command = drush_get_command();
200  foreach (drush_command_implements("drush_init") as $name) {
201  $func = $name . '_drush_init';
202  if (drush_get_option('show-invoke')) {
203  drush_log(dt("Calling global init hook: !func", array('!name' => $name, '!func' => $func . '()')), 'bootstrap');
204  }
205  call_user_func_array($func, $args);
207  }
208 
209  if (!drush_get_error()) {
210  $result = _drush_invoke_hooks($command, $args);
211  }
212 
213  if (!drush_get_error()) {
214  foreach (drush_command_implements('drush_exit') as $name) {
215  $func = $name . '_drush_exit';
216  if (drush_get_option('show-invoke')) {
217  drush_log(dt("Calling global exit hook: !func", array('!name' => $name, '!func' => $func . '()')), 'bootstrap');
218  }
219  call_user_func_array($func, $args);
221  }
222  }
223 }
224 
225 /**
226  * Invoke Drush API calls, including all hooks.
227  *
228  * This is an internal function; it is called from drush_dispatch via
229  * drush_command, but only if the command does not specify a 'callback'
230  * function. If a callback function is specified, it will be called
231  * instead of drush_command + _drush_invoke_hooks.
232  *
233  * Executes the specified command with the specified arguments on the
234  * currently bootstrapped site using the current option contexts.
235  * Note that _drush_invoke_hooks will not bootstrap any further than the
236  * current command has already bootstrapped; therefore, you should only invoke
237  * commands that have the same (or lower) bootstrap requirements.
238  *
239  * Call the correct hook for all the modules that implement it.
240  * Additionally, the ability to rollback when an error has been encountered is also provided.
241  * If at any point during execution, the drush_get_error() function returns anything but 0,
242  * drush_invoke() will trigger $hook_rollback for each of the hooks that implement it,
243  * in reverse order from how they were executed. Rollbacks are also triggered any
244  * time a hook function returns FALSE.
245  *
246  * This function will also trigger pre_$hook and post_$hook variants of the hook
247  * and its rollbacks automatically.
248  *
249  * HOW DRUSH HOOK FUNCTIONS ARE NAMED:
250  *
251  * The name of the hook is composed from the name of the command and the name of
252  * the command file that the command definition is declared in. The general
253  * form for the hook filename is:
254  *
255  * drush_COMMANDFILE_COMMANDNAME
256  *
257  * In many cases, drush commands that are functionally part of a common collection
258  * of similar commands will all be declared in the same file, and every command
259  * defined in that file will start with the same command prefix. For example, the
260  * command file "pm.drush.inc" defines commands such as "pm-enable" and "pm-disable".
261  * In the case of "pm-enable", the command file is "pm", and and command name is
262  * "pm-enable". When the command name starts with the same sequence of characters
263  * as the command file, then the repeated sequence is dropped; thus, the command
264  * hook for "pm-enable" is "drush_pm_enable", not "drush_pm_pm_enable".
265  *
266  * There is also a special Drupal-version-specific naming convention that may
267  * be used. To hide a commandfile from all versions of Drupal except for the
268  * specific one named, add a ".dVERSION" after the command prefix. For example,
269  * the file "views.d8.drush.inc" defines a "views" commandfile that will only
270  * load with Drupal 8. This feature is not necessary and should not be used
271  * in contrib modules (any extension with a ".module" file), since these modules
272  * are already version-specific.
273  *
274  * @param command
275  * The drush command to execute.
276  * @param args
277  * An array of arguments to the command OR a single non-array argument.
278  * @return
279  * The return value will be passed along to the caller if --backend option is
280  * present. A boolean FALSE indicates failure and rollback will be intitated.
281  *
282  * This function should not be called directly.
283  * @see drush_invoke() and @see drush_invoke_process()
284  */
285 function _drush_invoke_hooks($command, $args) {
286  // If someone passed a standalone arg, convert it to a single-element array
287  if (!is_array($args)) {
288  $args = array($args);
289  }
290  // Include the external command file used by this command, if there is one.
291  drush_command_include($command['command-hook']);
292  // Generate the base name for the hook by converting all
293  // dashes in the command name to underscores.
294  $hook = str_replace("-", "_", $command['command-hook']);
295 
296  // Call the hook init function, if it exists.
297  // If a command needs to bootstrap, it is advisable
298  // to do so in _init; otherwise, new commandfiles
299  // will miss out on participating in any stage that
300  // has passed or started at the time it was discovered.
301  $func = 'drush_' . $hook . '_init';
302  if (function_exists($func)) {
303  drush_log(dt("Calling drush command init function: !func", array('!func' => $func)), 'bootstrap');
304  call_user_func_array($func, $args);
306  if (drush_get_error()) {
307  drush_log(dt('The command @command could not be initialized.', array('@command' => $command['command-hook'])), 'error');
308  return FALSE;
309  }
310  }
311 
312  $rollback = FALSE;
313  $completed = array();
314  $available_rollbacks = array();
315  $all_available_hooks = array();
316 
317  // Iterate through the different hook variations
318  $variations = array($hook . "_pre_validate", $hook . "_validate", "pre_$hook", $hook, "post_$hook");
319  foreach ($variations as $var_hook) {
320  // Get the list of command files.
321  // We re-fetch the list every time through
322  // the loop in case one of the hook function
323  // does something that will add additional
324  // commandfiles to the list (i.e. bootstrapping
325  // to a higher phase will do this).
326  $list = drush_commandfile_list();
327 
328  // Make a list of function callbacks to call. If
329  // there is a 'primary function' mentioned, make sure
330  // that it appears first in the list, but only if
331  // we are running the main hook ("$hook"). After that,
332  // make sure that any callback associated with this commandfile
333  // executes before any other hooks defined in any other
334  // commandfiles.
335  $callback_list = array();
336  if (($var_hook == $hook) && ($command['primary function'])) {
337  $callback_list[$command['primary function']] = $list[$command['commandfile']];
338  }
339  else {
340  $primary_func = ($command['commandfile'] . "_" == substr($var_hook . "_",0,strlen($command['commandfile']) + 1)) ? sprintf("drush_%s", $var_hook) : sprintf("drush_%s_%s", $command['commandfile'], $var_hook);
341  $callback_list[$primary_func] = $list[$command['commandfile']];
342  }
343  // We've got the callback for the primary function in the
344  // callback list; now add all of the other callback functions.
345  unset($list[$command['commandfile']]);
346  foreach ($list as $commandfile => $filename) {
347  $func = sprintf("drush_%s_%s", $commandfile, $var_hook);
348  $callback_list[$func] = $filename;
349  }
350  // Run all of the functions available for this variation
351  $accumulated_result = NULL;
352  foreach ($callback_list as $func => $filename) {
353  if (function_exists($func)) {
354  $all_available_hooks[] = $func . ' [* Defined in ' . $filename . ']';
355  $available_rollbacks[] = $func . '_rollback';
356  $completed[] = $func;
357  drush_log(dt("Calling hook !hook", array('!hook' => $func)), 'debug');
358  try {
359  $result = call_user_func_array($func, $args);
360  drush_log(dt("Returned from hook !hook", array('!hook' => $func)), 'debug');
361  }
362  catch (Exception $e) {
363  drush_set_error('DRUSH_EXECUTION_EXCEPTION', $e->getMessage());
364  }
365  // If there is an error, break out of the foreach
366  // $variations and foreach $callback_list
367  if (drush_get_error() || ($result === FALSE)) {
368  $rollback = TRUE;
369  break 2;
370  }
371  // If result values are arrays, then combine them all together.
372  // Later results overwrite earlier results.
373  if (isset($result) && is_array($accumulated_result) && is_array($result)) {
374  $accumulated_result = array_merge($accumulated_result, $result);
375  }
376  else {
377  $accumulated_result = $result;
378  }
380  }
381  else {
382  $all_available_hooks[] = $func;
383  }
384  }
385  // Process the result value from the 'main' callback hook only.
386  if ($var_hook == $hook) {
387  $return = $accumulated_result;
388  if (isset($return)) {
389  drush_handle_command_output($command, $return);
390  }
391  }
392  }
393 
394  // If no hook functions were found, print a warning.
395  if (empty($completed)) {
396  $default_command_hook = sprintf("drush_%s_%s", $command['commandfile'], $hook);
397  if (($command['commandfile'] . "_" == substr($hook . "_",0,strlen($command['commandfile'])+ 1))) {
398  $default_command_hook = sprintf("drush_%s", $hook);
399  }
400  $dt_args = array(
401  '!command' => $command['command-hook'],
402  '!default_func' => $default_command_hook,
403  );
404  $message = "No hook functions were found for !command. The primary hook function is !default_func(). Please implement this function. Run with --show-invoke to see all available hooks.";
405  $return = drush_set_error('DRUSH_FUNCTION_NOT_FOUND', dt($message, $dt_args));
406  }
407  if (drush_get_option('show-invoke')) {
408  // We show all available hooks up to and including the one that failed (or all, if there were no failures)
409  drush_log(dt("Available drush_invoke() hooks for !command: !available", array('!command' => $command['command-hook'], '!available' => "\n" . implode("\n", $all_available_hooks))), 'ok');
410  }
411  if (drush_get_option('show-invoke') && !empty($available_rollbacks)) {
412  drush_log(dt("Available rollback hooks for !command: !rollback", array('!command' => $command['command-hook'], '!rollback' => "\n" . implode("\n", $available_rollbacks))), 'ok');
413  }
414 
415  // Something went wrong, we need to undo.
416  if ($rollback) {
417  if (drush_get_option('confirm-rollback', FALSE)) {
418  // Optionally ask for confirmation, --yes and --no are ignored from here on as we are about to finish this process.
419  drush_set_context('DRUSH_AFFIRMATIVE', FALSE);
420  drush_set_context('DRUSH_NEGATIVE', FALSE);
421  $rollback = drush_confirm(dt('Do you want to rollback? (manual cleanup might be required otherwise)'));
422  }
423 
424  if ($rollback) {
425  foreach (array_reverse($completed) as $func) {
426  $rb_func = $func . '_rollback';
427  if (function_exists($rb_func)) {
428  call_user_func_array($rb_func, $args);
430  drush_log(dt("Changes made in !func have been rolled back.", array('!func' => $func)), 'rollback');
431  }
432  }
433  }
434  $return = FALSE;
435  }
436 
437  if (isset($return)) {
438  return $return;
439  }
440 }
441 
442 /**
443  * Convert the structured output array provided from the Drush
444  * command into formatted output. Output is only printed for commands
445  * that define 'default-format' &/or 'default-pipe-format'; all
446  * other commands are expected to do their own output.
447  */
448 function drush_handle_command_output($command, $structured_output) {
449  // If the hook already called drush_backend_set_result,
450  // then return that value. If it did not, then the return
451  // value from the hook will be the value returned from
452  // this routine.
453  $return = drush_backend_get_result();
454  if (empty($return)) {
455  drush_backend_set_result($structured_output);
456  }
457  // We skip empty strings and empty arrays, but note that 'empty'
458  // returns TRUE for the integer value '0', but we do want to print that.
459  // Only handle output here if the command defined an output format
460  // engine. If no engine was declared, then we presume that the command
461  // handled its own output.
462  if ((!empty($structured_output) || ($structured_output === 0))) {
463  // If the command specifies a default pipe format and
464  // returned a result, then output the formatted output when
465  // in --pipe mode.
466  $formatter = drush_get_outputformat();
467  if (!$formatter && is_string($structured_output)) {
468  $formatter = drush_load_engine('outputformat', 'string');
469  }
470  if ($formatter) {
471  if ($formatter === TRUE) {
472  return drush_set_error(dt('No outputformat class defined for !format', array('!format' => $format)));
473  }
474  if ((!empty($command['engines']['outputformat'])) && (!in_array($formatter->selected_engine, $command['engines']['outputformat']['usable']))) {
475  return $formatter->format_error(dt("The command '!command' does not produce output in a structure usable by this output format.", array('!command' => $command['command'])));
476  }
477  // Add any user-specified options to the metadata passed to the formatter.
478  $metadata = array();
479  $metadata['strict'] = drush_get_option('strict', FALSE);
480  if (isset($formatter->engine_config['options'])) {
481  $machine_parsable = $formatter->engine_config['engine-info']['machine-parsable'];
482  if (drush_get_option('full', FALSE)) {
483  if (isset($formatter->engine_config['fields-full'])) {
484  $formatter->engine_config['fields-default'] = $formatter->engine_config['fields-full'];
485  }
486  else {
487  $formatter->engine_config['fields-default'] = array_keys($formatter->engine_config['field-labels']);
488  }
489  }
490  elseif ((drush_get_context('DRUSH_PIPE') || $machine_parsable) && isset($formatter->engine_config['fields-pipe'])) {
491  $formatter->engine_config['fields-default'] = $formatter->engine_config['fields-pipe'];
492  }
493 
494  // Determine the --format, and options relevant for that format.
495  foreach ($formatter->engine_config['options'] as $option => $option_info) {
496  $default_value = isset($formatter->engine_config[$option . '-default']) ? $formatter->engine_config[$option . '-default'] : FALSE;
497  if (($default_value === FALSE) && array_key_exists('default', $option_info)) {
498  $default_value = $option_info['default'];
499  }
500  if (isset($option_info['list'])) {
501  $user_specified_value = drush_get_option_list($option, $default_value);
502  }
503  else {
504  $user_specified_value = drush_get_option($option, $default_value);
505  }
506  if ($user_specified_value !== FALSE) {
507  if (array_key_exists('key', $option_info)) {
508  $option = $option_info['key'];
509  }
510  $metadata[$option] =$user_specified_value;
511  }
512  }
513  }
514  if (isset($metadata['fields']) && !empty($metadata['fields'])) {
515  if (isset($formatter->engine_config['field-labels'])) {
516  $formatter->engine_config['field-labels'] = drush_select_fields($formatter->engine_config['field-labels'], $metadata['fields'], $metadata['strict']);
517  }
518  }
519  $output = $formatter->process($structured_output, $metadata);
520  if (drush_get_context('DRUSH_PIPE')) {
521  drush_print_pipe($output);
522  }
523  else {
524  drush_print($output);
525  }
526  }
527  }
528 }
529 
530 /**
531  * Fail with an error if the user specified options on the
532  * command line that are not documented in the current command
533  * record. Also verify that required options are present.
534  */
535 function _drush_verify_cli_options($command) {
536  // Start out with just the options in the current command record.
537  $options = _drush_get_command_options($command);
538  // Skip all tests if the command is marked to allow anything.
539  // Also skip backend commands, which may have options on the commandline
540  // that were inherited from the calling command.
541  if (($command['allow-additional-options'] === TRUE)) {
542  return TRUE;
543  }
544  // If 'allow-additional-options' contains a list of command names,
545  // then union together all of the options from all of the commands.
546  if (is_array($command['allow-additional-options'])) {
547  $implemented = drush_get_commands();
548  foreach ($command['allow-additional-options'] as $subcommand_name) {
549  if (array_key_exists($subcommand_name, $implemented)) {
550  $options = array_merge($options, _drush_get_command_options($implemented[$subcommand_name]));
551  }
552  }
553  }
554  // Also add in global options
555  $options = array_merge($options, drush_get_global_options());
556 
557  // Add a placeholder option so that backend requests originating from prior versions of Drush are valid.
558  $options += array('invoke' => '');
559 
560  // Now we will figure out which options in the cli context
561  // are not represented in our options list.
562  $cli_options = array_keys(drush_get_context('cli'));
563  $allowed_options = _drush_flatten_options($options);
564  $allowed_options = drush_append_negation_options($allowed_options);
565  $disallowed_options = array_diff($cli_options, $allowed_options);
566  if (!empty($disallowed_options)) {
567  $unknown = count($disallowed_options) > 1 ? dt('Unknown options') : dt('Unknown option');
568  if (drush_get_option('strict', TRUE)) {
569  $msg = dt("@unknown: --@options. See `drush help @command` for available options. To suppress this error, add the option --strict=0.", array('@unknown' => $unknown, '@options' => implode(', --', $disallowed_options), '@command' => $command['command']));
570  return drush_set_error('DRUSH_UNKNOWN_OPTION', $msg);
571  }
572  }
573 
574  // Next check to see if all required options were specified.
575  $missing_required_options = array();
576  foreach ($command['options'] as $option_name => $option) {
577  if (is_array($option) && !empty($option['required']) && drush_get_option($option_name, NULL) === NULL) {
578  $missing_required_options[] = $option_name;
579  }
580  }
581  if (!empty($missing_required_options)) {
582  $missing = count($missing_required_options) > 1 ? dt('Missing required options') : dt('Missing required option');
583  return drush_set_error(dt("@missing: --@options. See `drush help @command` for information on usage.", array('@missing' => $missing, '@options' => implode(', --', $missing_required_options), '@command' => $command['command'])));
584  }
585  return TRUE;
586 }
587 
588 function drush_append_negation_options($allowed_options) {
589  $new_allowed = $allowed_options;
590  foreach ($allowed_options as $option) {
591  $new_allowed[] = 'no-' . $option;
592  }
593  return $new_allowed;
594 }
595 
596 function _drush_verify_cli_arguments($command) {
597  // Check to see if all of the required arguments
598  // are specified.
599  if ($command['required-arguments']) {
600  $required_arg_count = $command['required-arguments'];
601  if ($required_arg_count === TRUE) {
602  $required_arg_count = count($command['argument-description']);
603  }
604 
605  if (count($command['arguments']) < $required_arg_count) {
606  $missing = $required_arg_count > 1 ? dt('Missing required arguments') : dt('Missing required argument');
607  $required = array_slice(array_keys($command['argument-description']), 0, $required_arg_count);
608 
609  return drush_set_error(dt("@missing: @required. See `drush help @command` for information on usage.", array(
610  '@missing' => $missing,
611  '@required' => implode(", ", $required),
612  '@command' => $command['command'],
613  )));
614  }
615  }
616  return TRUE;
617 }
618 
619 /**
620  * Return the list of all of the options for the given
621  * command record by merging the 'options' and 'sub-options'
622  * records.
623  */
624 function _drush_get_command_options($command) {
625  drush_command_invoke_all_ref('drush_help_alter', $command);
626  $options = $command['options'];
627  foreach ($command['sub-options'] as $group => $suboptions) {
628  $options = array_merge($options, $suboptions);
629  }
630  return $options;
631 }
632 
633 /**
634  * Return the array keys of $options, plus any 'short-form'
635  * representations that may appear in the option's value.
636  */
637 function _drush_flatten_options($options) {
638  $flattened_options = array();
639 
640  foreach($options as $key => $value) {
641  // engine sections start with 'package-handler=git_drupalorg',
642  // or something similar. Get rid of everything from the = onward.
643  if (($eq_pos = strpos($key, '=')) !== FALSE) {
644  $key = substr($key, 0, $eq_pos);
645  }
646  $flattened_options[] = $key;
647  if (is_array($value)) {
648  if (array_key_exists('short-form', $value)) {
649  $flattened_options[] = $value['short-form'];
650  }
651  }
652  }
653  return $flattened_options;
654 }
655 
656 /**
657  * Get the options that were passed to the current command.
658  *
659  * This function returns an array that contains all of the options
660  * that are appropriate for forwarding along to drush_invoke_process.
661  *
662  * @return
663  * An associative array of option key => value pairs.
664  */
666  // Start off by taking everything from the site alias and command line
667  // ('cli' context)
668  $cli_context = drush_get_context('cli');
669  // local php settings should not override sitealias settings
670  unset($cli_context['php']);
671  unset($cli_context['php-options']);
672  // cli overrides and command specific
673  $options = $cli_context + drush_get_context('specific');
674  $global_option_list = drush_get_global_options(FALSE);
675  foreach (drush_get_context('alias') as $key => $value) {
676  if (array_key_exists($key, $global_option_list)) {
677  $options[$key] = $value;
678  }
679  }
680 
682  unset($options['command-specific']);
683  unset($options['path-aliases']);
684  // If we can parse the current command, then examine all contexts
685  // in order for any option that is directly related to the current command
686  $command = drush_parse_command();
687  if (is_array($command)) {
688  foreach ($command['options'] as $key => $value) {
689  // Strip leading --
690  $key = ltrim($key, '-');
691  $value = drush_get_option($key);
692  if (isset($value)) {
693  $options[$key] = $value;
694  }
695  }
696  }
697  // If --bootstrap-to-first-arg is specified, do not
698  // pass it along to remote commands.
699  unset($options['bootstrap-to-first-arg']);
700 
701  return $options;
702 }
703 
704 /**
705  * @} End of "defgroup dispatching".
706  */
707 
708 /**
709  * @file
710  * The drush command engine.
711  *
712  * Since drush can be invoked independently of a proper Drupal
713  * installation and commands may operate across sites, a distinct
714  * command engine is needed.
715  *
716  * It mimics the Drupal module engine in order to economize on
717  * concepts and to make developing commands as familiar as possible
718  * to traditional Drupal module developers.
719  */
720 
721 /**
722  * Parse console arguments.
723  */
724 function drush_parse_args() {
725  $args = drush_get_context('argv');
726  $command_args = NULL;
727  $global_options = array();
728  $target_alias_name = NULL;
729  // It would be nice if commandfiles could somehow extend this list,
730  // but it is not possible. We need to parse args before we find commandfiles,
731  // because the specified options may affect how commandfiles are located.
732  // Therefore, commandfiles are loaded too late to affect arg parsing.
733  // There are only a limited number of short options anyway; drush reserves
734  // all for use by drush core.
735  static $arg_opts = array('c', 'u', 'r', 'l', 'i');
736 
737  // Check to see if we were executed via a "#!/usr/bin/env drush" script
739 
740  // Now process the command line arguments. We will divide them
741  // into options (starting with a '-') and arguments.
742  $arguments = $options = array();
743 
744  for ($i = 1; $i < count($args); $i++) {
745  $opt = $args[$i];
746  // We set $command_args to NULL until the first argument that is not
747  // an alias is found (the command); we put everything that follows
748  // into $command_args.
749  if (is_array($command_args)) {
750  $command_args[] = $opt;
751  }
752  // Is the arg an option (starting with '-')?
753  if (!empty($opt) && $opt{0} == "-" && strlen($opt) != 1) {
754  // Do we have multiple options behind one '-'?
755  if (strlen($opt) > 2 && $opt{1} != "-") {
756  // Each char becomes a key of its own.
757  for ($j = 1; $j < strlen($opt); $j++) {
758  $options[substr($opt, $j, 1)] = true;
759  }
760  }
761  // Do we have a longopt (starting with '--')?
762  elseif ($opt{1} == "-") {
763  if ($pos = strpos($opt, '=')) {
764  $options[substr($opt, 2, $pos - 2)] = substr($opt, $pos + 1);
765  }
766  else {
767  $options[substr($opt, 2)] = true;
768  }
769  }
770  else {
771  $opt = substr($opt, 1);
772  // Check if the current opt is in $arg_opts (= has to be followed by an argument).
773  if ((in_array($opt, $arg_opts))) {
774  // Raising errors for missing option values should be handled by the
775  // bootstrap or specific command, so we no longer do this here.
776  $options[$opt] = $args[$i + 1];
777  $i++;
778  }
779  else {
780  $options[$opt] = true;
781  }
782  }
783  }
784  // If it's not an option, it's a command.
785  else {
786  $arguments[] = $opt;
787  // Once we find the first argument, record the command args and global options
788  if (!is_array($command_args)) {
789  // Remember whether we set $target_alias_name on a previous iteration,
790  // then record the $target_alias_name iff this arguement references a valid site alias.
791  $already_set_target = is_string($target_alias_name);
792  if (!$already_set_target && drush_sitealias_valid_alias_format($opt)) {
793  $target_alias_name = $opt;
794  }
795  // If an alias record was set on a previous iteration, then this
796  // argument must be the command name. If we set the target alias
797  // record on this iteration, then this is not the command name.
798  // If we've found the command name, then save $options in $global_options
799  // (all options that came before the command name), and initialize
800  // $command_args to an array so that we will begin storing all args
801  // and options that follow the command name in $command_args.
802  if ($already_set_target || (!is_string($target_alias_name))) {
803  $command_args = array();
804  $global_options = $options;
805  }
806  }
807  }
808  }
809  // If no arguments are specified, then the command will
810  // be either 'help' or 'version' (the later if --version is specified)
811  // @todo: it would be handy if one could do `drush @remote st --help` and
812  // have that show help for st. Today, that shows --help for help command!
813  if (!count($arguments)) {
814  if (array_key_exists('version', $options)) {
815  $arguments = array('version');
816  }
817  else {
818  $arguments = array('help');
819  }
820  }
821  if (is_array($command_args)) {
822  drush_set_context('DRUSH_COMMAND_ARGS', $command_args);
823  }
824  drush_set_context('DRUSH_GLOBAL_CLI_OPTIONS', $global_options);
825 
826  // Handle the "@shift" alias, if present
828 
829  drush_set_arguments($arguments);
831  drush_set_context('cli', $options);
832  return $arguments;
833 }
834 
835 /**
836  * Pop an argument off of drush's argument list
837  */
838 function drush_shift() {
839  $arguments = drush_get_arguments();
840  $result = NULL;
841  if (!empty($arguments)) {
842  // The php-script command uses the DRUSH_SHIFT_SKIP
843  // context to cause drush_shift to skip the 'php-script'
844  // command and the script path argument when it is
845  // called from the user script.
846  $skip_count = drush_get_context('DRUSH_SHIFT_SKIP');
847  if (is_numeric($skip_count)) {
848  for ($i = 0; $i < $skip_count; $i++) {
849  array_shift($arguments);
850  }
851  $skip_count = drush_set_context('DRUSH_SHIFT_SKIP', 0);
852  }
853  $result = array_shift($arguments);
854  drush_set_arguments($arguments);
855  }
856  return $result;
857 }
858 
859 /**
860  * Special checking for "shebang" script handling.
861  *
862  * If there is a file 'script.php' that begins like so:
863  * #!/path/to/drush
864  * Then $args will be:
865  * /path/to/drush /path/to/script userArg1 userArg2 ...
866  * If it instead starts like this:
867  * #!/path/to/drush --flag php-script
868  * Then $args will be:
869  * /path/to/drush "--flag php-script" /path/to/script userArg1 userArg2 ...
870  * (Note that execve does not split the parameters from
871  * the shebang line on whitespace; see http://en.wikipedia.org/wiki/Shebang_%28Unix%29)
872  * When drush is called via one of the "shebang" lines above,
873  * the first or second parameter will be the full path
874  * to the "shebang" script file -- and if the path to the
875  * script is in the second position, then we will expect that
876  * the argument in the first position must begin with a
877  * '@' (alias) or '-' (flag). Under ordinary circumstances,
878  * we do not expect that the drush command must come before
879  * any argument that is the full path to a file. We use
880  * this assumption to detect "shebang" script execution.
881  */
883  if (drush_has_bash()) {
884  // The drush script may add --php or --php-options at the
885  // head of the argument list; skip past those.
886  $base_arg_number = 1;
887  while (substr($args[$base_arg_number], 0, 5) == '--php') {
888  ++$base_arg_number;
889  }
890  if (_drush_is_drush_shebang_script($args[$base_arg_number])) {
891  // If $args[1] is a drush "shebang" script, we will insert
892  // the option "--bootstrap-to-first-arg" and the command
893  // "php-script" at the beginning of @args, so the command
894  // line args become:
895  // /path/to/drush --bootstrap-to-first-arg php-script /path/to/script userArg1 userArg2 ...
896  drush_set_option('bootstrap-to-first-arg', TRUE);
897  array_splice($args, $base_arg_number, 0, array('php-script'));
898  drush_set_context('DRUSH_SHEBANG_SCRIPT', TRUE);
899  }
900  elseif (((strpos($args[$base_arg_number], ' ') !== FALSE) || (!ctype_alnum($args[$base_arg_number][0]))) && (_drush_is_drush_shebang_script($args[$base_arg_number + 1]))) {
901  // If $args[2] is a drush "shebang" script, we will insert
902  // the space-exploded $arg[1] in place of $arg[1], so the
903  // command line args become:
904  // /path/to/drush scriptArg1 scriptArg2 ... /path/to/script userArg1 userArg2 ...
905  // If none of the script arguments look like a drush command,
906  // then we will insert "php-script" as the default command to
907  // execute.
908  $script_args = explode(' ', $args[$base_arg_number]);
909  $has_command = FALSE;
910  foreach ($script_args as $script_arg) {
911  if (preg_match("/^[a-z][a-z0-9-]*$/",$script_arg)) {
912  $has_command = TRUE;
913  }
914  }
915  if (!$has_command) {
916  $script_args[] = 'php-script';
917  }
918  array_splice($args, 1, $base_arg_number, $script_args);
919  drush_set_context('DRUSH_SHEBANG_SCRIPT', TRUE);
920  }
921  }
922 }
923 
924 /**
925  * Process the --bootstrap-to-first-arg option, if it is present.
926  *
927  * This option checks to see if the first user-provided argument is an alias
928  * or site specification; if it is, it will be shifted into the first argument
929  * position, where it will specify the site to bootstrap. The result of this
930  * is that if your shebang line looks like this:
931  *
932  * #!/path/to/drush --bootstrap-to-first-arg php-script
933  *
934  * Then when you run that script, you can optionally provide an alias such
935  * as @dev as the first argument (e.g. $ ./mydrushscript.php @dev scriptarg1
936  * scriptarg2). Since this is the behavior that one would usually want,
937  * it is default behavior for a canonical script. That is, a script
938  * with a simple shebang line, like so:
939  *
940  * #!/path/to/drush
941  *
942  * will implicitly have "--bootstrap-to-first-arg" and "php-script" prepended, and will therefore
943  * behave exactly like the first example. To write a script that does not
944  * use --bootstrap-to-first-arg, then the drush command or at least one flag must be explicitly
945  * included, like so:
946  *
947  * #!/path/to/drush php-script
948  */
950  if (drush_get_option('bootstrap-to-first-arg', FALSE)) {
951  $shift_alias_pos = 1 + (drush_get_context('DRUSH_SHEBANG_SCRIPT') === TRUE);
952  if (count($arguments) >= $shift_alias_pos) {
953  $shifted_alias = $arguments[$shift_alias_pos];
954  $alias_record = drush_sitealias_get_record($shifted_alias);
955  if (!empty($alias_record)) {
956  // Move the alias we shifted from its current position
957  // in the argument list to the front of the list
958  array_splice($arguments, $shift_alias_pos, 1);
959  array_unshift($arguments, $shifted_alias);
960  }
961  }
962  }
963 }
964 
965 /**
966  * Get a list of all implemented commands.
967  * This invokes hook_drush_command().
968  *
969  * @return
970  * Associative array of currently active command descriptors.
971  *
972  */
973 function drush_get_commands($reset = FALSE) {
974  static $commands = array();
975 
976  if ($reset) {
977  $commands = array();
978  return;
979  }
980  elseif ($commands) {
981  return $commands;
982  }
983 
984  $list = drush_commandfile_list();
985  foreach ($list as $commandfile => $path) {
986  if (drush_command_hook($commandfile, 'drush_command')) {
987  $function = $commandfile . '_drush_command';
988  $result = $function();
989  foreach ((array)$result as $key => $command) {
990  // Add some defaults and normalize the command descriptor.
991  $command += drush_command_defaults($key, $commandfile, $path);
992 
993  // Add engine data.
994  drush_merge_engine_data($command);
995 
996  // Translate command.
997  drush_command_translate($command);
998 
999  // If the command callback is not 'drush_command', then
1000  // copy the callback function to an alternate element
1001  // of the command array that will be called when Drush
1002  // calls the command function hooks. Then, set the
1003  // callback to drush_command so that the function hooks
1004  // will be called.
1005  if (($command['callback'] != 'drush_command') && $command['invoke hooks']) {
1006  $command['primary function'] = $command['callback'];
1007  $command['callback'] = 'drush_command';
1008  }
1009 
1010  $commands[$key] = $command;
1011  // For every alias, make a copy of the command and store it in the command list
1012  // using the alias as a key
1013  if (isset($command['aliases']) && count($command['aliases'])) {
1014  foreach ($command['aliases'] as $alias) {
1015  $commands[$alias] = $command;
1016  $commands[$alias]['is_alias'] = TRUE;
1017  }
1018  }
1019  }
1020  }
1021  }
1022 
1023  return $commands;
1024 }
1025 
1026 function drush_command_defaults($key, $commandfile, $path) {
1027  $defaults = array(
1028  'command' => $key,
1029  'command-hook' => $key,
1030  'invoke hooks' => TRUE,
1031  'callback arguments' => array(),
1032  'commandfile' => $commandfile,
1033  'path' => dirname($path),
1034  'engines' => array(), // Helpful for drush_show_help().
1035  'callback' => 'drush_command',
1036  'primary function' => FALSE,
1037  'description' => NULL,
1038  'sections' => array(
1039  'examples' => 'Examples',
1040  'arguments' => 'Arguments',
1041  'options' => 'Options',
1042  ),
1043  'arguments' => array(),
1044  'required-arguments' => FALSE,
1045  'options' => array(),
1046  'sub-options' => array(),
1047  'allow-additional-options' => FALSE,
1048  'examples' => array(),
1049  'aliases' => array(),
1050  'core' => array(),
1051  'scope' => 'site',
1052  'drupal dependencies' => array(),
1053  'drush dependencies' => array(),
1054  'handle-remote-commands' => FALSE,
1055  'remote-tty' => FALSE,
1056  'strict-option-handling' => FALSE,
1057  'bootstrap_errors' => array(),
1058  'topics' => array(),
1059  'hidden' => FALSE,
1060  'category' => $commandfile,
1061  );
1062  if ($bootstrap = drush_get_context('DRUSH_BOOTSTRAP_OBJECT')) {
1063  $defaults = array_merge($defaults, $bootstrap->command_defaults());
1064  }
1065  return $defaults;
1066 }
1067 
1068 /**
1069  * Translates description and other keys of a command definition.
1070  *
1071  * @param $command
1072  * A command definition.
1073  */
1074 function drush_command_translate(&$command) {
1075  $command['description'] = _drush_command_translate($command['description']);
1076  $keys = array('arguments', 'options', 'examples', 'sections');
1077  foreach ($keys as $key) {
1078  foreach ($command[$key] as $k => $v) {
1079  if (is_array($v)) {
1080  $v['description'] = _drush_command_translate($v['description']);
1081  }
1082  else {
1083  $v = _drush_command_translate($v);
1084  }
1085  $command[$key][$k] = $v;
1086  }
1087  }
1088 }
1089 
1090 /**
1091  * Helper function for drush_command_translate().
1092  *
1093  * @param $source
1094  * String or array.
1095  */
1096 function _drush_command_translate($source) {
1097  return is_array($source) ? call_user_func_array('dt', $source) : dt($source);
1098 }
1099 
1100 /**
1101  * Matches a commands array, as returned by drush_get_arguments, with the
1102  * current command table.
1103  *
1104  * Note that not all commands may be discoverable at the point-of-call,
1105  * since Drupal modules can ship commands as well, and they are
1106  * not available until after bootstrapping.
1107  *
1108  * drush_parse_command returns a normalized command descriptor, which
1109  * is an associative array. Some of its entries are:
1110  * - callback arguments: an array of arguments to pass to the calback.
1111  * - callback: the function to run. Usually, this is 'drush_command', which
1112  * will determine the primary hook for the function automatically. Only
1113  * specify a callback function if you need many commands to call the same
1114  * function (e.g. drush_print_file).
1115  * - invoke hooks: If TRUE (the default), Drush will invoke all of the pre and
1116  * post hooks for this command. Set to FALSE to suppress hooks. This setting
1117  * is ignored unless the command 'callback' is also set.
1118  * - primary function: Drush will copy the 'callback' parameter here if
1119  * necessary. This value should not be set explicitly; use 'callback' instead.
1120  * - description: description of the command.
1121  * - arguments: an array of arguments that are understood by the command. for help texts.
1122  * - required-arguments: The minimum number of arguments that are required, or TRUE if all are required.
1123  * - options: an array of options that are understood by the command. for help texts.
1124  * - examples: an array of examples that are understood by the command. for help texts.
1125  * - scope: one of 'system', 'project', 'site'.
1126  * - bootstrap: drupal bootstrap level (depends on Drupal major version). -1=no_bootstrap.
1127  * - core: Drupal major version required.
1128  * - drupal dependencies: drupal modules required for this command.
1129  * - drush dependencies: other drush command files required for this command.
1130  * - handle-remote-commands: set to TRUE if `drush @remote mycommand` should be executed
1131  * locally rather than remotely dispatched. When this mode is set, the target site
1132  * can be obtained via:
1133  * drush_get_context('DRUSH_TARGET_SITE_ALIAS')
1134  * - remote-tty: set to TRUE if Drush should force ssh to allocate a pseudo-tty
1135  * when this command is being called remotely. Important for interactive commands.
1136  * Remote commands that allocate a psedo-tty always print "Connection closed..." when done.
1137  * - strict-option-handling: set to TRUE if drush should strictly separate local command
1138  * cli options from the global options. Usually, drush allows global cli options and
1139  * command cli options to be interspersed freely on the commandline. For commands where
1140  * this flag is set, options are separated, with global options comming before the
1141  * command names, and command options coming after, like so:
1142  * drush --global-options command --command-options
1143  * In this mode, the command options are no longer available via drush_get_option();
1144  * instead, they can be retrieved via:
1146  * $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
1147  * In this case, $args will contain the command args and options literally, exactly as they
1148  * were entered on the command line, and in the same order as they appeared.
1149  * - 'outputformat': declares the data format to be used to render the
1150  * command result. In addition to the output format engine options
1151  * listed below, each output format type can take additional metadata
1152  * items that control the way that the output is rendered. See the
1153  * comment in each particular output format class for information. The
1154  * Drush core output format engines can be found in commands/core/outputformat.
1155  * - 'default': The default type to render output as. If declared, the
1156  * command should not print any output on its own, but instead should
1157  * return a data structure (usually an associative array) that can
1158  * be rendered by the output type selected.
1159  * - 'pipe-format': When the command is executed in --pipe mode, the
1160  * command output will be rendered by the format specified by the
1161  * pipe-format item instead of the default format. Note that in
1162  * either event, the user may specify the format to use via the
1163  * --format command-line option.
1164  * - 'formatted-filter': specifies a function callback that will be
1165  * used to filter the command result if the selected output formatter
1166  * is NOT declared to be machine-parsable. "table" is an example of
1167  * an output format that is not machine-parsable.
1168  * - 'parsable-filter': function callback that will be used to filter the
1169  * command result if the selected output formatter is declared to be
1170  * machine-parsable. "var_export" is an example of an output format that
1171  * is machine-parsable.
1172  * - 'output-data-type': An identifier representing the data structure that
1173  * the command returns. @see outputformat_drush_engine_outputformat() for
1174  * a description of the supported values.
1175  * - 'field-labels': A mapping from machine name to human-readable name
1176  * for all of the fields in a table-format command result. All
1177  * possible field names should appear in this list.
1178  * - 'fields-default': A list of the machine names of the fields that
1179  * should be displayed by default in tables.
1180  * - 'private-fields': A list of any fields that contain sensitive
1181  * information, such as passwords. By default, Drush will hide private
1182  * fields before printing the results to the console, but will include
1183  * them in backend invoke results. Use --show-passwords to display.
1184  * - 'column-widths': A mapping from field machine name to the column width
1185  * that should be used in table output. Drush will automatically
1186  * calculate the width of any field not listed here based on the length
1187  * of the data items in it.
1188  * - engines: declares information on Drush engines the command will load.
1189  * Available engines can vary by command type.
1190  *
1191  * @return bool|array
1192  * A command definition.
1193  */
1195  $args = drush_get_arguments();
1196  $command = FALSE;
1197 
1198  // Get a list of all implemented commands.
1199  $implemented = drush_get_commands();
1200  if (!empty($args) && isset($implemented[$args[0]])) {
1201  $command = $implemented[$args[0]];
1202  $arguments = array_slice($args, 1);
1203  }
1204 
1205  // We have found a command that matches. Set the appropriate values.
1206  if ($command) {
1207  // Special case. Force help command if --help option was specified.
1208  if (drush_get_option('help')) {
1209  $arguments = array($command['command']);
1210  $command = $implemented['help'];
1211  $command['arguments'] = $arguments;
1212  }
1213  else {
1214  _drush_prepare_command($command, $arguments);
1215  }
1216  drush_set_command($command);
1217  }
1218  return $command;
1219 }
1220 
1221 /**
1222  * Called by drush_parse_command(). If a command is dispatched
1223  * directly by drush_dispatch(), then drush_dispatch() will call
1224  * this function.
1225  */
1226 function _drush_prepare_command(&$command, $arguments = array()) {
1227  // Drush overloads $command['arguments']; save the argument description
1228  if (!isset($command['argument-description'])) {
1229  $command['argument-description'] = $command['arguments'];
1230  }
1231  // Merge specified callback arguments, which precede the arguments passed on the command line.
1232  if (isset($command['callback arguments']) && is_array($command['callback arguments'])) {
1233  $arguments = array_merge($command['callback arguments'], $arguments);
1234  }
1235  $command['arguments'] = $arguments;
1236 }
1237 
1238 /**
1239  * Invoke a hook in all available command files that implement it.
1240  *
1242  *
1243  * @param $hook
1244  * The name of the hook to invoke.
1245  * @param ...
1246  * Arguments to pass to the hook.
1247  * @return
1248  * An array of return values of the hook implementations. If commands return
1249  * arrays from their implementations, those are merged into one array.
1250  */
1252  $args = func_get_args();
1253  if (count($args) == 1) {
1254  $args[] = NULL;
1255  }
1256  $reference_value = $args[1];
1257  $args[1] = &$reference_value;
1258 
1259  return call_user_func_array('drush_command_invoke_all_ref', $args);
1260 }
1261 
1262 /**
1263  * A drush_command_invoke_all() that wants the first parameter to be passed by reference.
1264  *
1265  * @see drush_command_invoke_all()
1266  */
1267 function drush_command_invoke_all_ref($hook, &$reference_parameter) {
1268  $args = func_get_args();
1269  array_shift($args);
1270  // Insure that call_user_func_array can alter first parameter
1271  $args[0] = &$reference_parameter;
1272  $return = array();
1273  $modules = drush_command_implements($hook);
1274  if ($hook != 'drush_invoke_alter') {
1275  // Allow modules to control the order of hook invocations
1276  drush_command_invoke_all_ref('drush_invoke_alter', $modules, $hook);
1277  }
1278  foreach ($modules as $module) {
1279  $function = $module .'_'. $hook;
1280  $result = call_user_func_array($function, $args);
1281  if (isset($result) && is_array($result)) {
1282  $return = array_merge_recursive($return, $result);
1283  }
1284  else if (isset($result)) {
1285  $return[] = $result;
1286  }
1287  }
1288  return $return;
1289 }
1290 
1291 /**
1292  * Determine which command files are implementing a hook.
1293  *
1294  * @param $hook
1295  * The name of the hook (e.g. "drush_help" or "drush_command").
1296  *
1297  * @return
1298  * An array with the names of the command files which are implementing this hook.
1299  */
1300 function drush_command_implements($hook) {
1301  $implementations[$hook] = array();
1302  $list = drush_commandfile_list();
1303  foreach ($list as $commandfile => $file) {
1304  if (drush_command_hook($commandfile, $hook)) {
1305  $implementations[$hook][] = $commandfile;
1306  }
1307  }
1308  return (array)$implementations[$hook];
1309 }
1310 
1311 /**
1312  * @param string
1313  * name of command to check.
1314  *
1315  * @return boolean
1316  * TRUE if the given command has an implementation.
1317  */
1318 function drush_is_command($command) {
1319  $commands = drush_get_commands();
1320  return isset($commands[$command]);
1321 }
1322 
1323 /**
1324  * @param string
1325  * name of command or command alias.
1326  *
1327  * @return string
1328  * Primary name of command.
1329  */
1330 function drush_command_normalize_name($command_name) {
1331  $commands = drush_get_commands();
1332  return isset($commands[$command_name]) ? $commands[$command_name]['command'] : $command_name;
1333 }
1334 
1335 /**
1336  * Collect a list of all available drush command files.
1337  *
1338  * Scans the following paths for drush command files:
1339  *
1340  * - The "/path/to/drush/commands" folder.
1341  * - Folders listed in the 'include' option (see example.drushrc.php).
1342  * - The system-wide drush commands folder, e.g. /usr/share/drush/commands
1343  * - The ".drush" folder in the user's HOME folder.
1344  * - /drush and sites/all/drush in current Drupal site.
1345  * - Folders belonging to enabled modules in the current Drupal site.
1346  *
1347  * A Drush command file is a file that matches "*.drush.inc".
1348  *
1349  * @see drush_scan_directory()
1350  *
1351  * @return
1352  * An associative array whose keys and values are the names of all available
1353  * command files.
1354  */
1356  return drush_get_context('DRUSH_COMMAND_FILES', array());
1357 }
1358 
1359 function _drush_add_commandfiles($searchpath, $phase = NULL, $reset = FALSE) {
1360  static $evaluated = array();
1361  static $deferred = array();
1362 
1363  $cache =& drush_get_context('DRUSH_COMMAND_FILES', array());
1364 
1365  if (count($searchpath)) {
1366  if (!$reset) {
1367  // Assemble a cid specific to the bootstrap phase and searchpaths.
1368  // Bump $cf_version when making a change to a dev version of Drush
1369  // that invalidates the commandfile cache.
1370  $cf_version = 4;
1371  $cid = drush_get_cid('commandfiles-' . $phase, array(), array_merge($searchpath, array($cf_version)));
1372  $command_cache = drush_cache_get($cid);
1373  if (isset($command_cache->data)) {
1374  $cached_list = $command_cache->data;
1375  // If we want to temporarily ignore modules via 'ignored-modules',
1376  // then we need to take these out of the cache as well.
1377  foreach (drush_get_option_list('ignored-modules') as $ignored) {
1378  unset($cached_list[$ignored]);
1379  }
1380  }
1381  }
1382 
1383  // Build a list of all of the modules to attempt to load.
1384  // Start with any modules deferred from a previous phase.
1385  $list = $deferred;
1386  if (isset($cached_list)) {
1387  $list = array_merge($list, $cached_list);
1388  }
1389  else {
1390  // Scan for drush command files; add to list for consideration if found.
1391  foreach (array_unique($searchpath) as $path) {
1392  if (is_dir($path)) {
1393  $nomask = array_merge(drush_filename_blacklist(), drush_get_option_list('ignored-modules'));
1394  $dmv = DRUSH_MAJOR_VERSION;
1395  $files = drush_scan_directory($path, "/\.drush($dmv|)\.inc$/", $nomask);
1396  foreach ($files as $filename => $info) {
1397  $module = basename($filename);
1398  $module = preg_replace('/\.*drush[0-9]*\.inc/', '', $module);
1399  // Only try to bootstrap modules that we have never seen before.
1400  if (!array_key_exists($module, $evaluated) && file_exists($filename)) {
1401  $evaluated[$module] = TRUE;
1402  $list[$module] = $filename;
1403  }
1404  }
1405  }
1406  }
1407  if (isset($cid)) {
1408  drush_cache_set($cid, $list);
1409  }
1410  }
1411  // Check to see if the commandfile is valid for this version of Drupal
1412  // and is still present on filesystem (in case of cached commandfile list).
1413  foreach ($list as $module => $filename) {
1414  $load_command = TRUE;
1415  $module_versionless = preg_replace('/\.d([0-9]+)$/', '', $module);
1416  if (!isset($cache[$module_versionless])) {
1417  $drupal_version = '';
1418  if (preg_match('/\.d([0-9]+)$/', $module, $matches)) {
1419  $drupal_version = $matches[1];
1420  }
1421  if (!empty($drupal_version) && ($drupal_version != drush_drupal_major_version())) {
1422  $load_command = FALSE;
1423  }
1424  if ($load_command) {
1425  // Only try to require if the file exists. If not, a file from the
1426  // command file cache may not be available anymore, in which case
1427  // we rebuild the cache for this phase.
1428  if ($filepath = realpath($filename)) {
1429  $cache[$module_versionless] = $filename;
1430  require_once $filepath;
1431  unset($deferred[$module]);
1432  }
1433  elseif (!$reset) {
1434  _drush_add_commandfiles($searchpath, $phase, TRUE);
1435  }
1436  }
1437  else {
1438  unset($list[$module]);
1439  // Signal that we should try again on
1440  // the next bootstrap phase. We set
1441  // the flag to the filename of the first
1442  // module we find so that only that one
1443  // will be retried.
1444  $deferred[$module] = $filename;
1445  }
1446  }
1447  }
1448 
1449  if (count($list)) {
1450  ksort($cache);
1451  }
1452  }
1453 }
1454 
1455 /**
1456  * Substrings to ignore during commandfile and site alias searching.
1457  */
1459  $blacklist = array('.', '..', 'drush_make', 'examples', 'tests', 'disabled', 'gitcache', 'cache');
1460  for ($v=4; $v<=(DRUSH_MAJOR_VERSION)+3; ++$v) {
1461  if ($v != DRUSH_MAJOR_VERSION) {
1462  $blacklist[] = 'drush' . $v;
1463  }
1464  }
1465  $blacklist = array_merge($blacklist, drush_get_option_list('exclude'));
1466  return $blacklist;
1467 }
1468 
1469 /**
1470  * Conditionally include files based on the command used.
1471  *
1472  * Steps through each of the currently loaded commandfiles and
1473  * loads an optional commandfile based on the key.
1474  *
1475  * When a command such as 'pm-enable' is called, this
1476  * function will find all 'enable.pm.inc' files that
1477  * are present in each of the commandfile directories.
1478  */
1479 function drush_command_include($command) {
1480  $include_files = drush_command_get_includes($command);
1481  foreach($include_files as $filename => $commandfile) {
1482  drush_log(dt('Including !filename', array('!filename' => $filename)), 'bootstrap');
1483  include_once($filename);
1484  }
1485 }
1486 
1487 function drush_command_get_includes($command) {
1488  $include_files = array();
1489  $parts = explode('-', $command);
1490  $command = implode(".", array_reverse($parts));
1491 
1492  $commandfiles = drush_commandfile_list();
1493  $options = array();
1494  foreach ($commandfiles as $commandfile => $file) {
1495  $filename = sprintf("%s/%s.inc", dirname($file), $command);
1496  if (file_exists($filename)) {
1497  $include_files[$filename] = $commandfile;
1498  }
1499  }
1500  return $include_files;
1501 }
1502 
1503 /**
1504  * Conditionally include default options based on the command used.
1505  */
1506 function drush_command_default_options($command = NULL) {
1507  $command_default_options = drush_get_context('command-specific');
1508  drush_command_set_command_specific($command_default_options, $command);
1509 }
1510 
1511 function drush_sitealias_command_default_options($site_record, $prefix, $command = NULL) {
1512  if (isset($site_record) && array_key_exists($prefix . 'command-specific', $site_record)) {
1513  drush_command_set_command_specific($site_record[$prefix . 'command-specific'], $command);
1514  }
1515  return FALSE;
1516 }
1517 
1518 function drush_command_set_command_specific_options($prefix, $command = NULL) {
1519  $command_default_options = drush_get_option($prefix . 'command-specific', array());
1520  drush_command_set_command_specific($command_default_options, $command);
1521 }
1522 
1523 function drush_command_set_command_specific($command_default_options, $command = NULL) {
1524  if (!$command) {
1525  $command = drush_get_command();
1526  }
1527  if ($command) {
1528  // Look for command-specific options for this command
1529  // keyed both on the command's primary name, and on each
1530  // of its aliases.
1531  $options_were_set = _drush_command_set_default_options($command_default_options, $command['command']);
1532  if (isset($command['aliases']) && count($command['aliases'])) {
1533  foreach ($command['aliases'] as $alias) {
1534  $options_were_set += _drush_command_set_default_options($command_default_options, $alias);
1535  }
1536  }
1537  // If we set or cleared any options, go back and re-bootstrap any global
1538  // options such as -y and -v.
1539  if (!empty($options_were_set)) {
1541  }
1542  // If the command uses strict option handling, back out any global
1543  // options that were set.
1544  if ($command['strict-option-handling']) {
1545  $global_options = drush_get_global_options();
1546  foreach ($options_were_set as $key) {
1547  if (array_key_exists($key, $global_options)) {
1548  if (!array_key_exists('context', $global_options[$key])) {
1549  $strict_options_warning =& drush_get_context('DRUSH_STRICT_OPTIONS_WARNING', array());
1550  if (!array_key_exists($key, $strict_options_warning)) {
1551  drush_log(dt("Global option --!option not supported in command-specific options for command !command due to a limitation in strict option handling.", array('!option' => $key, '!command' => $command['command'])), 'warning');
1552  $strict_options_warning[$key] = TRUE;
1553  }
1554  }
1555  drush_unset_option($key, 'specific');
1556  }
1557  }
1558  }
1559  }
1560 }
1561 
1562 function _drush_command_set_default_options($command_default_options, $command) {
1563  $options_were_set = array();
1564  if (array_key_exists($command, $command_default_options)) {
1565  foreach ($command_default_options[$command] as $key => $value) {
1566  // We set command-specific options in their own context
1567  // that is higher precedence than the various config file
1568  // context, but lower than command-line options.
1569  if (!drush_get_option('no-' . $key, FALSE)) {
1570  drush_set_option($key, $value, 'specific');
1571  $options_were_set[] = $key;
1572  }
1573  }
1574  }
1575  return $options_were_set;
1576 }
1577 
1578 /**
1579  * Return all of the command-specific options defined in the given
1580  * options set for the specified command name. Note that it is valid
1581  * to use the command name alias rather than the primary command name,
1582  * both in the parameter to this function, and in the options set.
1583  */
1584 function drush_command_get_command_specific_options($options, $command_name, $prefix = '') {
1585  $result = array();
1586  $command_name = drush_command_normalize_name($command_name);
1587  if (isset($options[$prefix . 'command-specific'])) {
1588  foreach ($options[$prefix . 'command-specific'] as $options_for_command => $values) {
1589  if ($command_name == drush_command_normalize_name($options_for_command)) {
1590  $result = array_merge($result, $values);
1591  }
1592  }
1593  }
1594  return $result;
1595 }
1596 
1597 /**
1598  * Return the original cli args and options, exactly as they
1599  * appeared on the command line, and in the same order.
1600  * Any command-specific options that were set will also
1601  * appear in this list, appended at the very end.
1602  *
1603  * The args and options returned are raw, and must be
1604  * escaped as necessary before use.
1605  */
1606 function drush_get_original_cli_args_and_options($command = NULL) {
1607  $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
1608  $command_specific_options = drush_get_context('specific');
1609  if ($command == NULL) {
1610  $command = drush_get_command();
1611  }
1612  $command_options = ($command == NULL) ? array() : _drush_get_command_options($command);
1613  foreach ($command_specific_options as $key => $value) {
1614  if (!array_key_exists($key, $command_options)) {
1615  if (($value === TRUE) || (!isset($value))) {
1616  $args[] = "--$key";
1617  }
1618  else {
1619  $args[] = "--$key=$value";
1620  }
1621  }
1622  }
1623  return $args;
1624 }
1625 
1626 /**
1627  * Determine whether a command file implements a hook.
1628  *
1629  * @param $module
1630  * The name of the module (without the .module extension).
1631  * @param $hook
1632  * The name of the hook (e.g. "help" or "menu").
1633  * @return
1634  * TRUE if the the hook is implemented.
1635  */
1636 function drush_command_hook($commandfile, $hook) {
1637  return function_exists($commandfile . '_' . $hook);
1638 }
1639 
1640 /**
1641  * Check that a command is valid for the current bootstrap phase.
1642  *
1643  * @param $command
1644  * Command to check. Any errors will be added to the 'bootstrap_errors' element.
1645  *
1646  * @return
1647  * TRUE if command is valid.
1648  */
1650  $valid = array();
1651  $current_phase = drush_get_context('DRUSH_BOOTSTRAP_PHASE');
1652  if ($command['bootstrap'] <= $current_phase) {
1653  return TRUE;
1654  }
1655  // TODO: provide description text for each bootstrap level so we can give
1656  // the user something more helpful and specific here.
1657  $command['bootstrap_errors']['DRUSH_COMMAND_INSUFFICIENT_BOOTSTRAP'] = dt('Command !command needs a higher bootstrap level to run - you will need to invoke drush from a more functional Drupal environment to run this command.', array('!command' => $command['command']));
1658 }
1659 
1660 /**
1661  * Check that a command has its declared drush dependencies available or have no
1662  * dependencies. Drush dependencies are helpful when a command is invoking
1663  * another command, or implementing its API.
1664  *
1665  * @param $command
1666  * Command to check. Any errors will be added to the 'bootstrap_errors' element.
1667  * @return
1668  * TRUE if dependencies are met.
1669  */
1671  // If there are no drush dependencies, then do nothing.
1672  if (!empty($command['drush dependencies'])) {
1673  $commandfiles = drush_commandfile_list();
1674  foreach ($command['drush dependencies'] as $dependency) {
1675  if (!isset($commandfiles[$dependency])) {
1676  $dt_args = array(
1677  '!command' => $command['command'],
1678  '!dependency' => "$dependency.drush.inc",
1679  );
1680  $command['bootstrap_errors']['DRUSH_COMMANDFILE_DEPENDENCY_ERROR'] = dt('Command !command needs the following drush command file to run: !dependency.', $dt_args);
1681  return FALSE;
1682  }
1683  }
1684  }
1685  return TRUE;
1686 }
1687 
1688 /**
1689  * Check that a command is valid for the current major version of core. Handles
1690  * explicit version numbers and 'plus' numbers like 7+ (compatible with 7,8 ...).
1691  *
1692  * @param $command
1693  * Command to check. Any errors will be added to the 'bootstrap_errors' element.
1694  *
1695  * @return
1696  * TRUE if command is valid.
1697  */
1698 function drush_enforce_requirement_core(&$command) {
1699  $major = drush_drupal_major_version();
1700  if (!$core = $command['core']) {
1701  return TRUE;
1702  }
1703  foreach ($core as $compat) {
1704  if ($compat == $major) {
1705  return TRUE;
1706  }
1707  elseif (substr($compat, -1) == '+' && $major >= substr($compat, 0, strlen($compat)-1)) {
1708  return TRUE;
1709  }
1710  }
1711  $versions = array_pop($core);
1712  if (!empty($core)) {
1713  $versions = implode(', ', $core) . dt(' or ') . $versions;
1714  }
1715  $command['bootstrap_errors']['DRUSH_COMMAND_CORE_VERSION_ERROR'] = dt('Command !command requires Drupal core version !versions to run.', array('!command' => $command['command'], '!versions' => $versions));
1716 }
1717 
1718 /**
1719  * Check if a shell alias exists for current request. If so, re-route to
1720  * core-execute and pass alias value along with rest of CLI arguments.
1721  */
1723  $args = drush_get_arguments();
1724  $argv = drush_get_context('argv');
1725  $first = current($args);
1726  // @todo drush_get_option is awkward here.
1727  $shell_aliases = drush_get_context('shell-aliases', array());
1728  if (isset($shell_aliases[$first])) {
1729  // Shell alias found for first argument in the request.
1730  $alias_value = $shell_aliases[$first];
1731  if (!is_array($alias_value)) {
1732  // Shell aliases can have embedded variables such as {{@target}} and {{%root}}
1733  // that are replaced with the name of the target site alias, or the value of a
1734  // path alias defined in the target site alias record. We only support replacements
1735  // when the alias value is a string; if it is already broken out into an array,
1736  // then the values therein are used literally.
1737  $alias_variables = array( '{{@target}}' => '@none' );
1738  $target_site_alias = drush_get_context('DRUSH_TARGET_SITE_ALIAS', FALSE);
1739  if ($target_site_alias) {
1740  $alias_variables = array( '{{@target}}' => $target_site_alias );
1741  $target = drush_sitealias_get_record($target_site_alias);
1742  foreach ($target as $key => $value) {
1743  if (!is_array($value)) {
1744  $alias_variables['{{' . $key . '}}'] = $value;
1745  }
1746  }
1747  if (array_key_exists('path-aliases', $target)) {
1748  foreach ($target['path-aliases'] as $key => $value) {
1749  // n.b. $key will contain something like "%root" or "%files".
1750  $alias_variables['{{' . $key . '}}'] = $value;
1751  }
1752  }
1753  }
1754  $alias_value = str_replace(array_keys($alias_variables), array_values($alias_variables), $alias_value);
1755  // Check for unmatched replacements
1756  $matches = array();
1757  $match_result = preg_match('/{{[%@#]*[a-z0-9.]*}}/', $alias_value, $matches);
1758  if ($match_result) {
1759  $unmatched_replacements = implode(', ', $matches);
1760  $unmatched_replacements = preg_replace('/[{}]/', '', $unmatched_replacements);
1761  return drush_set_error('DRUSH_SHELL_ALIAS_UNMATCHED_REPLACEMENTS', dt('The shell alias @alias-name uses replacements "@unmatched". You must use this command with a site alias (e.g. `drush @myalias @alias-name ...`) that defines all of these variables.', array('@alias-name' => $first, '@unmatched' => $unmatched_replacements)));
1762  }
1764  $alias_value = str_getcsv($alias_value, ' ');
1765  }
1766  drush_log(dt('Shell alias found: !key => !value', array('!key' => $first, '!value' => implode(' ', $alias_value))), 'debug');
1767  $replacement = $alias_value;
1768  if (substr($alias_value[0], 0, 1) == '!') {
1769  $replacement[0] = ltrim($replacement[0], '!');
1770  array_unshift($replacement, 'core-execute');
1771  }
1772  $pos = array_search($first, $argv);
1773  array_splice($argv, $pos, 1, $replacement);
1774  drush_set_context('argv', $argv);
1775  drush_parse_args();
1777  }
1778 }

File

doxygen/html/includes_2command_8inc_source.html
View source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>Drush: includes/command.inc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Drush
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_09e761304027c904456130627fd4dcf5.html">includes</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">command.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="includes_2command_8inc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;&lt;?php</div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * @defgroup dispatching Command dispatching functions.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * @{</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * These functions handle command dispatching, and can</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * be used to programatically invoke drush commands in</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> * different ways.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> * Invokes a Drush API call, including all hooks.</span></div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> * Executes the specified command with the specified arguments on the currently</span></div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * bootstrapped site using the current option contexts. Note that it will not</span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * bootstrap any further than the current command has already bootstrapped;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * therefore, you should only invoke commands that have the same (or lower)</span></div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * bootstrap requirements.</span></div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * Commands execute with the same options that the user provided on the</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * commandline. If you need to invoke another Drush command with options you</span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * specify, use drush_invoke_process() instead.</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * @param string $command</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> *   The command to invoke.</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * @param array $arguments</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> *   An array of argument to pass into the command.</span></div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="comment"> * @return mixed|false</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> *   The return value from drush_dispatch() or FALSE on error.</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> * @see drush_invoke_process()</span></div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"><a class="code" href="group__dispatching.html#gad45b0ad6ccdc34ebb10d38d5c2d6a1d1">   35</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#gad45b0ad6ccdc34ebb10d38d5c2d6a1d1">drush_invoke</a>($command, $arguments = array()) {</div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;  <span class="comment">// Convert a standalone argument to a single-element array.</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;  <span class="keywordflow">if</span> (!is_array($arguments)) {</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    $arguments = array($arguments);</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;  }</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;  $commands = <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;  <span class="keywordflow">if</span> (array_key_exists($command, $commands)) {</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;    $command = $commands[$command];</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="comment">// Drush overloads the &#39;arguments&#39; element, which contains the help string</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    <span class="comment">// for the allowed arguments for the command when fetched, and is fixed up</span></div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    <span class="comment">// by _drush_prepare_command() to contain the actual commandline arguments</span></div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="comment">// during dispatching.</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    $command[<span class="stringliteral">&#39;arguments&#39;</span>] = array();</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__dispatching.html#ga5db6ec7318291b3692bf905b87a9276b">drush_dispatch</a>($command, $arguments);</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;  }</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_COMMAND_NOT_FOUND&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;The drush command &#39;!command&#39; could not be found.&quot;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command)));</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  }</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;}</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment"> * Invoke a command in a new process, targeting the site specified by</span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment"> * the provided site alias record.</span></div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="comment"> * @param array $site_alias_record</span></div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment"> *  The site record to execute the command on.  Use &#39;@self&#39; to run on the current site.</span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment"> * @param string $command_name</span></div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="comment"> *  The command to invoke.</span></div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="comment"> * @param array $commandline_args</span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="comment"> *  The arguments to pass to the command.</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="comment"> * @param array $commandline_options</span></div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="comment"> *  The options (e.g. --select) to provide to the command.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="comment"> * @param mixed $backend_options</span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="comment"> *   TRUE - integrate errors</span></div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;<span class="comment"> *   FALSE - do not integrate errors</span></div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="comment"> *   array - @see drush_backend_invoke_concurrent</span></div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="comment"> *     There are also several options that _only_ work when set in</span></div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment"> *     this parameter.  They include:</span></div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="comment"> *      &#39;invoke-multiple&#39;</span></div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;<span class="comment"> *        If $site_alias_record represents a single site, then &#39;invoke-multiple&#39;</span></div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="comment"> *        will cause the _same_ command with the _same_ arguments and options</span></div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;<span class="comment"> *        to be invoked concurrently (e.g. for running concurrent batch processes).</span></div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="comment"> *      &#39;concurrency&#39;</span></div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="comment"> *        Limits the number of concurrent processes that will run at the same time.</span></div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="comment"> *        Defaults to &#39;4&#39;.</span></div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="comment"> *      &#39;override-simulated&#39;</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="comment"> *        Forces the command to run, even in &#39;simulated&#39; mode. Useful for</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="comment"> *        commands that do not change any state on the machine, e.g. to fetch</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="comment"> *        database information for sql-sync via sql-conf.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="comment"> *      &#39;interactive&#39;</span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment"> *        Overrides the backend invoke process to run commands interactively.</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment"> *      &#39;fork&#39;</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="comment"> *        Overrides the backend invoke process to run non blocking commands in</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment"> *        the background. Forks a new process by adding a &#39;&amp;&#39; at the end of the</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment"> *        command. The calling process does not receive any output from the child</span></div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="comment"> *        process. The fork option is used to spawn a process that outlives its</span></div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="comment"> *        parent.</span></div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;<span class="comment"> *   If the command could not be completed successfully, FALSE.</span></div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="comment"> *   If the command was completed, this will return an associative</span></div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="comment"> *   array containing the results of the API call.</span></div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="comment"> *   @see drush_backend_get_result()</span></div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment"> * Do not change the signature of this function!  drush_invoke_process</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="comment"> * is one of the key Drush APIs.  See http://drupal.org/node/1152908</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">  102</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">drush_invoke_process</a>($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = TRUE) {</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;  <span class="keywordflow">if</span> (is_array($site_alias_record) &amp;&amp; array_key_exists(<span class="stringliteral">&#39;site-list&#39;</span>, $site_alias_record)) {</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    list($site_alias_records, $not_found) = <a class="code" href="sitealias_8inc.html#a0dd349885b59373b8a067d7589d096e7">drush_sitealias_resolve_sitespecs</a>($site_alias_record[<span class="stringliteral">&#39;site-list&#39;</span>]);</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    <span class="keywordflow">if</span> (!empty($not_found)) {</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Not found: @list&quot;</span>, array(<span class="stringliteral">&quot;@list&quot;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $not_found))), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    }</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    $site_alias_records = <a class="code" href="sitealias_8inc.html#a0665329c1176b30398fa27ee5cd10423">drush_sitealias_simplify_names</a>($site_alias_records);</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="keywordflow">foreach</span> ($site_alias_records as $alias_name =&gt; $alias_record) {</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      $invocations[] = array(</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;        <span class="stringliteral">&#39;site&#39;</span> =&gt; $alias_record,</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;        <span class="stringliteral">&#39;command&#39;</span> =&gt; $command_name,</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;        <span class="stringliteral">&#39;args&#39;</span> =&gt; $commandline_args,</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;      );</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    }</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;  }</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    $invocations[] = array(</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;      <span class="stringliteral">&#39;site&#39;</span> =&gt; $site_alias_record,</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;      <span class="stringliteral">&#39;command&#39;</span> =&gt; $command_name,</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;      <span class="stringliteral">&#39;args&#39;</span> =&gt; $commandline_args);</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    $invoke_multiple = <a class="code" href="context_8inc.html#a559008f6decb23108b83e704208e415e">drush_get_option_override</a>($backend_options, <span class="stringliteral">&#39;invoke-multiple&#39;</span>, 0);</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="keywordflow">if</span> ($invoke_multiple) {</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;      $invocations = array_fill(0, $invoke_multiple, $invocations[0]);</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    }</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;  }</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="backend_8inc.html#a7852d5448cd4ee3a2082eccd24d690e7">drush_backend_invoke_concurrent</a>($invocations, $commandline_options, $backend_options);</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;}</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="comment"> * Given a command record, dispatch it as if it were</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="comment"> * the original command.  Executes in the currently</span></div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="comment"> * bootstrapped site using the current option contexts.</span></div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;<span class="comment"> * Note that drush_dispatch will not bootstrap any further than the</span></div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="comment"> * current command has already bootstrapped; therefore, you should only invoke</span></div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;<span class="comment"> * commands that have the same (or lower) bootstrap requirements.</span></div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="comment"> * @param command</span></div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;<span class="comment"> *   A full $command such as returned by drush_get_commands(),</span></div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="comment"> *   or a string containing the name of the command record from</span></div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="comment"> *   drush_get_commands() to call.</span></div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="comment"> * @param arguments</span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="comment"> *   An array of argument values.</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment"> * @see drush_topic_docs_topic().</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga5db6ec7318291b3692bf905b87a9276b">  148</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga5db6ec7318291b3692bf905b87a9276b">drush_dispatch</a>($command, $arguments = array()) {</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;  <a class="code" href="context_8inc.html#af37b8df12a8fc3bf25b173d420a11203">drush_set_command</a>($command);</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;  $return = FALSE;</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;  <span class="keywordflow">if</span> ($command) {</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    <span class="comment">// Add arguments, if this has not already been done.</span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <span class="comment">// (If the command was fetched from drush_parse_command,</span></div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="comment">// then you cannot provide arguments to drush_dispatch.)</span></div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    <span class="keywordflow">if</span> (empty($command[<span class="stringliteral">&#39;arguments&#39;</span>])) {</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;      <a class="code" href="includes_2command_8inc.html#a6a908a954cb96c0e4dadb715cd72cae4">_drush_prepare_command</a>($command, $arguments);</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    }</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    <span class="comment">// Add command-specific options, if applicable.</span></div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    <a class="code" href="includes_2command_8inc.html#ad5dd93fad069d6ba73b3546d26855071">drush_command_default_options</a>($command);</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;    <span class="comment">// Test to see if any of the options in the &#39;cli&#39; context</span></div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <span class="comment">// are not represented in the command structure.</span></div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="keywordflow">if</span> ((<a class="code" href="group__dispatching.html#ga1e55a13b320525b6871dacc7265bf5a7">_drush_verify_cli_options</a>($command) === FALSE) || (_drush_verify_cli_arguments($command) === FALSE)) {</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    }</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    <span class="comment">// Give command files an opportunity to alter the command record</span></div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <a class="code" href="includes_2command_8inc.html#a74995cc76034e90a39baee51111b20be">drush_command_invoke_all_ref</a>(<span class="stringliteral">&#39;drush_command_alter&#39;</span>, $command);</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    <span class="comment">// Include and validate command engines.</span></div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="engines_8inc.html#a04e206fccfe9fe74aacda617336f5b87">drush_load_command_engines</a>($command) === FALSE) {</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    }</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;    <span class="comment">// Call the callback function of the active command.</span></div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    $return = call_user_func_array($command[<span class="stringliteral">&#39;callback&#39;</span>], $command[<span class="stringliteral">&#39;arguments&#39;</span>]);</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;  }</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;  <span class="comment">// Add a final log entry, just so a timestamp appears.</span></div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;  <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Command dispatch complete&#39;</span>), <span class="stringliteral">&#39;notice&#39;</span>);</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;  <span class="keywordflow">return</span> $return;</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;}</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="comment"> * Entry point for commands into the drush_invoke() API</span></div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="comment"> * If a command does not have a callback specified, this function will be called.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="comment"> * This function will trigger $hook_drush_init, then if no errors occur,</span></div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;<span class="comment"> * it will call drush_invoke() with the command that was dispatch.</span></div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="comment"> * If no errors have occured, it will run $hook_drush_exit.</span></div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"><a class="code" href="group__dispatching.html#gae7a7f1f4b8c5edffbc2ececc6638698a">  197</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#gae7a7f1f4b8c5edffbc2ececc6638698a">drush_command</a>() {</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;  $args = func_get_args();</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;  $command = <a class="code" href="context_8inc.html#a8fc57227375a540fea5314b154576354">drush_get_command</a>();</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;  <span class="keywordflow">foreach</span> (<a class="code" href="includes_2command_8inc.html#a385cd0ff47c30105f965722a81987809">drush_command_implements</a>(<span class="stringliteral">&quot;drush_init&quot;</span>) as $name) {</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    $func = $name . <span class="stringliteral">&#39;_drush_init&#39;</span>;</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;show-invoke&#39;</span>)) {</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Calling global init hook: !func&quot;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!func&#39;</span> =&gt; $func . <span class="stringliteral">&#39;()&#39;</span>)), <span class="stringliteral">&#39;bootstrap&#39;</span>);</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    }</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    call_user_func_array($func, $args);</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;  }</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__errorhandling.html#ga33fe8456b3dc49a0e28e7f63692a0d44">drush_get_error</a>()) {</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    $result = <a class="code" href="group__dispatching.html#gac0d79cc522d6f5cecf9f72ecc5ecceb8">_drush_invoke_hooks</a>($command, $args);</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;  }</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__errorhandling.html#ga33fe8456b3dc49a0e28e7f63692a0d44">drush_get_error</a>()) {</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="keywordflow">foreach</span> (<a class="code" href="includes_2command_8inc.html#a385cd0ff47c30105f965722a81987809">drush_command_implements</a>(<span class="stringliteral">&#39;drush_exit&#39;</span>) as $name) {</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;      $func = $name . <span class="stringliteral">&#39;_drush_exit&#39;</span>;</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;show-invoke&#39;</span>)) {</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Calling global exit hook: !func&quot;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!func&#39;</span> =&gt; $func . <span class="stringliteral">&#39;()&#39;</span>)), <span class="stringliteral">&#39;bootstrap&#39;</span>);</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;      }</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;      call_user_func_array($func, $args);</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;      <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    }</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  }</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;}</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="comment"> * Invoke Drush API calls, including all hooks.</span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="comment"> * This is an internal function; it is called from drush_dispatch via</span></div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;<span class="comment"> * drush_command, but only if the command does not specify a &#39;callback&#39;</span></div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="comment"> * function.  If a callback function is specified, it will be called</span></div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="comment"> * instead of drush_command + _drush_invoke_hooks.</span></div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="comment"> * Executes the specified command with the specified arguments on the</span></div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="comment"> * currently bootstrapped site using the current option contexts.</span></div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="comment"> * Note that _drush_invoke_hooks will not bootstrap any further than the</span></div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;<span class="comment"> * current command has already bootstrapped; therefore, you should only invoke</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="comment"> * commands that have the same (or lower) bootstrap requirements.</span></div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="comment"> * Call the correct hook for all the modules that implement it.</span></div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="comment"> * Additionally, the ability to rollback when an error has been encountered is also provided.</span></div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="comment"> * If at any point during execution, the drush_get_error() function returns anything but 0,</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="comment"> * drush_invoke() will trigger $hook_rollback for each of the hooks that implement it,</span></div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="comment"> * in reverse order from how they were executed.  Rollbacks are also triggered any</span></div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="comment"> * time a hook function returns FALSE.</span></div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="comment"> * This function will also trigger pre_$hook and post_$hook variants of the hook</span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="comment"> * and its rollbacks automatically.</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="comment"> * HOW DRUSH HOOK FUNCTIONS ARE NAMED:</span></div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="comment"> * The name of the hook is composed from the name of the command and the name of</span></div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="comment"> * the command file that the command definition is declared in.  The general</span></div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="comment"> * form for the hook filename is:</span></div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="comment"> *      drush_COMMANDFILE_COMMANDNAME</span></div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;<span class="comment"> * In many cases, drush commands that are functionally part of a common collection</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="comment"> * of similar commands will all be declared in the same file, and every command</span></div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="comment"> * defined in that file will start with the same command prefix.  For example, the</span></div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="comment"> * command file &quot;pm.drush.inc&quot; defines commands such as &quot;pm-enable&quot; and &quot;pm-disable&quot;.</span></div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment"> * In the case of &quot;pm-enable&quot;, the command file is &quot;pm&quot;, and and command name is</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="comment"> * &quot;pm-enable&quot;.  When the command name starts with the same sequence of characters</span></div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;<span class="comment"> * as the command file, then the repeated sequence is dropped; thus, the command</span></div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;<span class="comment"> * hook for &quot;pm-enable&quot; is &quot;drush_pm_enable&quot;, not &quot;drush_pm_pm_enable&quot;.</span></div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="comment"> * There is also a special Drupal-version-specific naming convention that may</span></div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;<span class="comment"> * be used.  To hide a commandfile from all versions of Drupal except for the</span></div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;<span class="comment"> * specific one named, add a &quot;.dVERSION&quot; after the command prefix.  For example,</span></div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;<span class="comment"> * the file &quot;views.d8.drush.inc&quot; defines a &quot;views&quot; commandfile that will only</span></div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;<span class="comment"> * load with Drupal 8.  This feature is not necessary and should not be used</span></div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;<span class="comment"> * in contrib modules (any extension with a &quot;.module&quot; file), since these modules</span></div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;<span class="comment"> * are already version-specific.</span></div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;<span class="comment"> * @param command</span></div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;<span class="comment"> *   The drush command to execute.</span></div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;<span class="comment"> * @param args</span></div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;<span class="comment"> *   An array of arguments to the command OR a single non-array argument.</span></div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;<span class="comment"> *   The return value will be passed along to the caller if --backend option is</span></div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;<span class="comment"> *   present. A boolean FALSE indicates failure and rollback will be intitated.</span></div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;<span class="comment"> * This function should not be called directly.</span></div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;<span class="comment"> * @see drush_invoke() and @see drush_invoke_process()</span></div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"><a class="code" href="group__dispatching.html#gac0d79cc522d6f5cecf9f72ecc5ecceb8">  285</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#gac0d79cc522d6f5cecf9f72ecc5ecceb8">_drush_invoke_hooks</a>($command, $args) {</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;  <span class="comment">// If someone passed a standalone arg, convert it to a single-element array</span></div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;  <span class="keywordflow">if</span> (!is_array($args)) {</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    $args = array($args);</div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  }</div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;  <span class="comment">// Include the external command file used by this command, if there is one.</span></div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;  <a class="code" href="includes_2command_8inc.html#abf0bb730c62cb31e3f74c36d5bc1d01a">drush_command_include</a>($command[<span class="stringliteral">&#39;command-hook&#39;</span>]);</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;  <span class="comment">// Generate the base name for the hook by converting all</span></div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;  <span class="comment">// dashes in the command name to underscores.</span></div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;  $hook = str_replace(<span class="stringliteral">&quot;-&quot;</span>, <span class="stringliteral">&quot;_&quot;</span>, $command[<span class="stringliteral">&#39;command-hook&#39;</span>]);</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;  <span class="comment">// Call the hook init function, if it exists.</span></div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;  <span class="comment">// If a command needs to bootstrap, it is advisable</span></div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;  <span class="comment">// to do so in _init; otherwise, new commandfiles</span></div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;  <span class="comment">// will miss out on participating in any stage that</span></div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;  <span class="comment">// has passed or started at the time it was discovered.</span></div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;  $func = <span class="stringliteral">&#39;drush_&#39;</span> . $hook . <span class="stringliteral">&#39;_init&#39;</span>;</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;  <span class="keywordflow">if</span> (function_exists($func)) {</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Calling drush command init function: !func&quot;</span>, array(<span class="stringliteral">&#39;!func&#39;</span> =&gt; $func)), <span class="stringliteral">&#39;bootstrap&#39;</span>);</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    call_user_func_array($func, $args);</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__errorhandling.html#ga33fe8456b3dc49a0e28e7f63692a0d44">drush_get_error</a>()) {</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;The command @command could not be initialized.&#39;</span>, array(<span class="stringliteral">&#39;@command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command-hook&#39;</span>])), <span class="stringliteral">&#39;error&#39;</span>);</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;    }</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;  }</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;  $rollback = FALSE;</div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;  $completed = array();</div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;  $available_rollbacks = array();</div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;  $all_available_hooks = array();</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;  <span class="comment">// Iterate through the different hook variations</span></div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;  $variations = array($hook . <span class="stringliteral">&quot;_pre_validate&quot;</span>, $hook . <span class="stringliteral">&quot;_validate&quot;</span>, <span class="stringliteral">&quot;pre_$hook&quot;</span>, $hook, <span class="stringliteral">&quot;post_$hook&quot;</span>);</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;  <span class="keywordflow">foreach</span> ($variations as $var_hook) {</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    <span class="comment">// Get the list of command files.</span></div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <span class="comment">// We re-fetch the list every time through</span></div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    <span class="comment">// the loop in case one of the hook function</span></div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="comment">// does something that will add additional</span></div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    <span class="comment">// commandfiles to the list (i.e. bootstrapping</span></div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    <span class="comment">// to a higher phase will do this).</span></div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    $list = <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>();</div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    <span class="comment">// Make a list of function callbacks to call.  If</span></div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="comment">// there is a &#39;primary function&#39; mentioned, make sure</span></div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <span class="comment">// that it appears first in the list, but only if</span></div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;    <span class="comment">// we are running the main hook (&quot;$hook&quot;).  After that,</span></div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    <span class="comment">// make sure that any callback associated with this commandfile</span></div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    <span class="comment">// executes before any other hooks defined in any other</span></div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="comment">// commandfiles.</span></div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    $callback_list = array();</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    <span class="keywordflow">if</span> (($var_hook == $hook) &amp;&amp; ($command[<span class="stringliteral">&#39;primary function&#39;</span>])) {</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;      $callback_list[$command[<span class="stringliteral">&#39;primary function&#39;</span>]] = $list[$command[<span class="stringliteral">&#39;commandfile&#39;</span>]];</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    }</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;      $primary_func = ($command[<span class="stringliteral">&#39;commandfile&#39;</span>] . <span class="stringliteral">&quot;_&quot;</span> == substr($var_hook . <span class="stringliteral">&quot;_&quot;</span>,0,strlen($command[<span class="stringliteral">&#39;commandfile&#39;</span>]) + 1)) ? sprintf(<span class="stringliteral">&quot;drush_%s&quot;</span>, $var_hook) : sprintf(<span class="stringliteral">&quot;drush_%s_%s&quot;</span>, $command[<span class="stringliteral">&#39;commandfile&#39;</span>], $var_hook);</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;      $callback_list[$primary_func] = $list[$command[<span class="stringliteral">&#39;commandfile&#39;</span>]];</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;    }</div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;    <span class="comment">// We&#39;ve got the callback for the primary function in the</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;    <span class="comment">// callback list; now add all of the other callback functions.</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    unset($list[$command[<span class="stringliteral">&#39;commandfile&#39;</span>]]);</div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;    <span class="keywordflow">foreach</span> ($list as $commandfile =&gt; $filename) {</div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;      $func = sprintf(<span class="stringliteral">&quot;drush_%s_%s&quot;</span>, $commandfile, $var_hook);</div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;      $callback_list[$func] = $filename;</div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;    }</div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <span class="comment">// Run all of the functions available for this variation</span></div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    $accumulated_result = NULL;</div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    <span class="keywordflow">foreach</span> ($callback_list as $func =&gt; $filename) {</div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;      <span class="keywordflow">if</span> (function_exists($func)) {</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;        $all_available_hooks[] = $func . <span class="stringliteral">&#39; [* Defined in &#39;</span> . $filename . <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;        $available_rollbacks[] = $func . <span class="stringliteral">&#39;_rollback&#39;</span>;</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;        $completed[] = $func;</div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Calling hook !hook&quot;</span>, array(<span class="stringliteral">&#39;!hook&#39;</span> =&gt; $func)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;        <span class="keywordflow">try</span> {</div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;          $result = call_user_func_array($func, $args);</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Returned from hook !hook&quot;</span>, array(<span class="stringliteral">&#39;!hook&#39;</span> =&gt; $func)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;        }</div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;        <span class="keywordflow">catch</span> (Exception $e) {</div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;          <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_EXECUTION_EXCEPTION&#39;</span>, $e-&gt;getMessage());</div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;        }</div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;        <span class="comment">// If there is an error, break out of the foreach</span></div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        <span class="comment">// $variations and foreach $callback_list</span></div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="group__errorhandling.html#ga33fe8456b3dc49a0e28e7f63692a0d44">drush_get_error</a>() || ($result === FALSE)) {</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;          $rollback = TRUE;</div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;          <span class="keywordflow">break</span> 2;</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;        }</div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;        <span class="comment">// If result values are arrays, then combine them all together.</span></div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;        <span class="comment">// Later results overwrite earlier results.</span></div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;        <span class="keywordflow">if</span> (isset($result) &amp;&amp; is_array($accumulated_result) &amp;&amp; is_array($result)) {</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;          $accumulated_result = array_merge($accumulated_result, $result);</div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;        }</div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;          $accumulated_result = $result;</div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;        }</div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;        <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;      }</div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;        $all_available_hooks[] = $func;</div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;      }</div>
<div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    }</div>
<div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <span class="comment">// Process the result value from the &#39;main&#39; callback hook only.</span></div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="keywordflow">if</span> ($var_hook == $hook) {</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;      $return = $accumulated_result;</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;      <span class="keywordflow">if</span> (isset($return)) {</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;        <a class="code" href="group__dispatching.html#gaec7e84c5668d8e13f33c948659112495">drush_handle_command_output</a>($command, $return);</div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;      }</div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    }</div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;  }</div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;</div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;  <span class="comment">// If no hook functions were found, print a warning.</span></div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;  <span class="keywordflow">if</span> (empty($completed)) {</div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    $default_command_hook = sprintf(<span class="stringliteral">&quot;drush_%s_%s&quot;</span>, $command[<span class="stringliteral">&#39;commandfile&#39;</span>], $hook);</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <span class="keywordflow">if</span> (($command[<span class="stringliteral">&#39;commandfile&#39;</span>] . <span class="stringliteral">&quot;_&quot;</span> == substr($hook . <span class="stringliteral">&quot;_&quot;</span>,0,strlen($command[<span class="stringliteral">&#39;commandfile&#39;</span>])+ 1))) {</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;      $default_command_hook = sprintf(<span class="stringliteral">&quot;drush_%s&quot;</span>, $hook);</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    }</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    $dt_args = array(</div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;      <span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command-hook&#39;</span>],</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;      <span class="stringliteral">&#39;!default_func&#39;</span> =&gt; $default_command_hook,</div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    );</div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    $message = <span class="stringliteral">&quot;No hook functions were found for !command. The primary hook function is !default_func(). Please implement this function. Run with --show-invoke to see all available hooks.&quot;</span>;</div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    $return = <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_FUNCTION_NOT_FOUND&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>($message, $dt_args));</div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;  }</div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;show-invoke&#39;</span>)) {</div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <span class="comment">// We show all available hooks up to and including the one that failed (or all, if there were no failures)</span></div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Available drush_invoke() hooks for !command: !available&quot;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command-hook&#39;</span>], <span class="stringliteral">&#39;!available&#39;</span> =&gt; <span class="stringliteral">&quot;\n&quot;</span> . implode(<span class="stringliteral">&quot;\n&quot;</span>, $all_available_hooks))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;  }</div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;show-invoke&#39;</span>) &amp;&amp; !empty($available_rollbacks)) {</div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Available rollback hooks for !command: !rollback&quot;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command-hook&#39;</span>], <span class="stringliteral">&#39;!rollback&#39;</span> =&gt; <span class="stringliteral">&quot;\n&quot;</span> . implode(<span class="stringliteral">&quot;\n&quot;</span>, $available_rollbacks))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;  }</div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;  <span class="comment">// Something went wrong, we need to undo.</span></div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;  <span class="keywordflow">if</span> ($rollback) {</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;confirm-rollback&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;      <span class="comment">// Optionally ask for confirmation, --yes and --no are ignored from here on as we are about to finish this process.</span></div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;      <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_AFFIRMATIVE&#39;</span>, FALSE);</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;      <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_NEGATIVE&#39;</span>, FALSE);</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;      $rollback = <a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Do you want to rollback? (manual cleanup might be required otherwise)&#39;</span>));</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    }</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;</div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    <span class="keywordflow">if</span> ($rollback) {</div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;      <span class="keywordflow">foreach</span> (array_reverse($completed) as $func) {</div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;        $rb_func = $func . <span class="stringliteral">&#39;_rollback&#39;</span>;</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        <span class="keywordflow">if</span> (function_exists($rb_func)) {</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;          call_user_func_array($rb_func, $args);</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;          <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Changes made in !func have been rolled back.&quot;</span>, array(<span class="stringliteral">&#39;!func&#39;</span> =&gt; $func)), <span class="stringliteral">&#39;rollback&#39;</span>);</div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;        }</div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;      }</div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    }</div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;    $return = FALSE;</div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;  }</div>
<div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;  <span class="keywordflow">if</span> (isset($return)) {</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    <span class="keywordflow">return</span> $return;</div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;  }</div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;}</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;<span class="comment"> * Convert the structured output array provided from the Drush</span></div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;<span class="comment"> * command into formatted output.  Output is only printed for commands</span></div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="comment"> * that define &#39;default-format&#39; &amp;/or &#39;default-pipe-format&#39;; all</span></div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;<span class="comment"> * other commands are expected to do their own output.</span></div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00448"></a><span class="lineno"><a class="code" href="group__dispatching.html#gaec7e84c5668d8e13f33c948659112495">  448</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#gaec7e84c5668d8e13f33c948659112495">drush_handle_command_output</a>($command, $structured_output) {</div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;  <span class="comment">// If the hook already called drush_backend_set_result,</span></div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;  <span class="comment">// then return that value. If it did not, then the return</span></div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;  <span class="comment">// value from the hook will be the value returned from</span></div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;  <span class="comment">// this routine.</span></div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;  $return = <a class="code" href="backend_8inc.html#ac295e52c1fa40b91d9100517ed8e76de">drush_backend_get_result</a>();</div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;  <span class="keywordflow">if</span> (empty($return)) {</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    <a class="code" href="backend_8inc.html#ad8040331b08464a2a48b7ac8a00ed13c">drush_backend_set_result</a>($structured_output);</div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;  }</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;  <span class="comment">// We skip empty strings and empty arrays, but note that &#39;empty&#39;</span></div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;  <span class="comment">// returns TRUE for the integer value &#39;0&#39;, but we do want to print that.</span></div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;  <span class="comment">// Only handle output here if the command defined an output format</span></div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;  <span class="comment">// engine.  If no engine was declared, then we presume that the command</span></div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;  <span class="comment">// handled its own output.</span></div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;  <span class="keywordflow">if</span> ((!empty($structured_output) || ($structured_output === 0))) {</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;    <span class="comment">// If the command specifies a default pipe format and</span></div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    <span class="comment">// returned a result, then output the formatted output when</span></div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="comment">// in --pipe mode.</span></div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    $formatter = <a class="code" href="outputformat_8drush_8inc.html#a9b9f691b2f676d97dc57dc3e60f57500">drush_get_outputformat</a>();</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <span class="keywordflow">if</span> (!$formatter &amp;&amp; is_string($structured_output)) {</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;      $formatter = <a class="code" href="engines_8inc.html#af360562cce71af9828bbbb7326b1d7a8">drush_load_engine</a>(<span class="stringliteral">&#39;outputformat&#39;</span>, <span class="stringliteral">&#39;string&#39;</span>);</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;    }</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;    <span class="keywordflow">if</span> ($formatter) {</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;      <span class="keywordflow">if</span> ($formatter === TRUE) {</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;No outputformat class defined for !format&#39;</span>, array(<span class="stringliteral">&#39;!format&#39;</span> =&gt; $format)));</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;      }</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;      <span class="keywordflow">if</span> ((!empty($command[<span class="stringliteral">&#39;engines&#39;</span>][<span class="stringliteral">&#39;outputformat&#39;</span>])) &amp;&amp; (!in_array($formatter-&gt;selected_engine, $command[<span class="stringliteral">&#39;engines&#39;</span>][<span class="stringliteral">&#39;outputformat&#39;</span>][<span class="stringliteral">&#39;usable&#39;</span>]))) {</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;        <span class="keywordflow">return</span> $formatter-&gt;format_error(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;The command &#39;!command&#39; does not produce output in a structure usable by this output format.&quot;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>])));</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;      }</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;      <span class="comment">// Add any user-specified options to the metadata passed to the formatter.</span></div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;      $metadata = array();</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;      $metadata[<span class="stringliteral">&#39;strict&#39;</span>] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;strict&#39;</span>, FALSE);</div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;      <span class="keywordflow">if</span> (isset($formatter-&gt;engine_config[<span class="stringliteral">&#39;options&#39;</span>])) {</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;        $machine_parsable = $formatter-&gt;engine_config[<span class="stringliteral">&#39;engine-info&#39;</span>][<span class="stringliteral">&#39;machine-parsable&#39;</span>];</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;full&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;          <span class="keywordflow">if</span> (isset($formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-full&#39;</span>])) {</div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;            $formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-default&#39;</span>] = $formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-full&#39;</span>];</div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;          }</div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;          <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;            $formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-default&#39;</span>] = array_keys($formatter-&gt;engine_config[<span class="stringliteral">&#39;field-labels&#39;</span>]);</div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;          }</div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;        }</div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;        elseif ((<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_PIPE&#39;</span>) || $machine_parsable) &amp;&amp; isset($formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-pipe&#39;</span>])) {</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;          $formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-default&#39;</span>] = $formatter-&gt;engine_config[<span class="stringliteral">&#39;fields-pipe&#39;</span>];</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;        }</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;        <span class="comment">// Determine the --format, and options relevant for that format.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;        <span class="keywordflow">foreach</span> ($formatter-&gt;engine_config[<span class="stringliteral">&#39;options&#39;</span>] as $option =&gt; $option_info) {</div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;          $default_value = isset($formatter-&gt;engine_config[$option . <span class="stringliteral">&#39;-default&#39;</span>]) ? $formatter-&gt;engine_config[$option . <span class="stringliteral">&#39;-default&#39;</span>] : FALSE;</div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;          <span class="keywordflow">if</span> (($default_value === FALSE) &amp;&amp; array_key_exists(<span class="stringliteral">&#39;default&#39;</span>, $option_info)) {</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;            $default_value = $option_info[<span class="stringliteral">&#39;default&#39;</span>];</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;          }</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;          <span class="keywordflow">if</span> (isset($option_info[<span class="stringliteral">&#39;list&#39;</span>])) {</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;            $user_specified_value = <a class="code" href="context_8inc.html#ade60e65f76863ed34db22f5e7f83a150">drush_get_option_list</a>($option, $default_value);</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;          }</div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;          <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;            $user_specified_value = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($option, $default_value);</div>
<div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;          }</div>
<div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;          <span class="keywordflow">if</span> ($user_specified_value !== FALSE) {</div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;            <span class="keywordflow">if</span> (array_key_exists(<span class="stringliteral">&#39;key&#39;</span>, $option_info)) {</div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;              $option = $option_info[<span class="stringliteral">&#39;key&#39;</span>];</div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;            }</div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;            $metadata[$option] =$user_specified_value;</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;          }</div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;        }</div>
<div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;      }</div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;      <span class="keywordflow">if</span> (isset($metadata[<span class="stringliteral">&#39;fields&#39;</span>]) &amp;&amp; !empty($metadata[<span class="stringliteral">&#39;fields&#39;</span>])) {</div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;        <span class="keywordflow">if</span> (isset($formatter-&gt;engine_config[<span class="stringliteral">&#39;field-labels&#39;</span>])) {</div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;          $formatter-&gt;engine_config[<span class="stringliteral">&#39;field-labels&#39;</span>] = <a class="code" href="group__outputfunctions.html#gaad650f1047d3ea256f7a4ca376a41191">drush_select_fields</a>($formatter-&gt;engine_config[<span class="stringliteral">&#39;field-labels&#39;</span>], $metadata[<span class="stringliteral">&#39;fields&#39;</span>], $metadata[<span class="stringliteral">&#39;strict&#39;</span>]);</div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;        }</div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;      }</div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;      $output = $formatter-&gt;process($structured_output, $metadata);</div>
<div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_PIPE&#39;</span>)) {</div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;        <a class="code" href="group__outputfunctions.html#ga03664ee5326159c3f8e6c97aa93c7981">drush_print_pipe</a>($output);</div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;      }</div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;        <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>($output);</div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;      }</div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    }</div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;  }</div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;}</div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;<span class="comment"> * Fail with an error if the user specified options on the</span></div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;<span class="comment"> * command line that are not documented in the current command</span></div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;<span class="comment"> * record. Also verify that required options are present.</span></div>
<div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00535"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga1e55a13b320525b6871dacc7265bf5a7">  535</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga1e55a13b320525b6871dacc7265bf5a7">_drush_verify_cli_options</a>($command) {</div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;  <span class="comment">// Start out with just the options in the current command record.</span></div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;  $options = <a class="code" href="group__dispatching.html#ga0edaf347ba975a7743a81eb3d7a4e38c">_drush_get_command_options</a>($command);</div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;  <span class="comment">// Skip all tests if the command is marked to allow anything.</span></div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;  <span class="comment">// Also skip backend commands, which may have options on the commandline</span></div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;  <span class="comment">// that were inherited from the calling command.</span></div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;  <span class="keywordflow">if</span> (($command[<span class="stringliteral">&#39;allow-additional-options&#39;</span>] === TRUE)) {</div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;  }</div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;  <span class="comment">// If &#39;allow-additional-options&#39; contains a list of command names,</span></div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;  <span class="comment">// then union together all of the options from all of the commands.</span></div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;  <span class="keywordflow">if</span> (is_array($command[<span class="stringliteral">&#39;allow-additional-options&#39;</span>])) {</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    $implemented = <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;allow-additional-options&#39;</span>] as $subcommand_name) {</div>
<div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;      <span class="keywordflow">if</span> (array_key_exists($subcommand_name, $implemented)) {</div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;        $options = array_merge($options, <a class="code" href="group__dispatching.html#ga0edaf347ba975a7743a81eb3d7a4e38c">_drush_get_command_options</a>($implemented[$subcommand_name]));</div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;      }</div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    }</div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;  }</div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;  <span class="comment">// Also add in global options</span></div>
<div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;  $options = array_merge($options, <a class="code" href="drush_8inc.html#acb0a26e79bcbdd1152d59a6916a35aae">drush_get_global_options</a>());</div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;</div>
<div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;  <span class="comment">// Add a placeholder option so that backend requests originating from prior versions of Drush are valid.</span></div>
<div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;  $options += array(<span class="stringliteral">&#39;invoke&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>);</div>
<div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;</div>
<div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;  <span class="comment">// Now we will figure out which options in the cli context</span></div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;  <span class="comment">// are not represented in our options list.</span></div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;  $cli_options = array_keys(<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;cli&#39;</span>));</div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;  $allowed_options = <a class="code" href="group__dispatching.html#ga2d33822aebecae3f76bd5d19ff490d6b">_drush_flatten_options</a>($options);</div>
<div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;  $allowed_options = drush_append_negation_options($allowed_options);</div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;  $disallowed_options = array_diff($cli_options, $allowed_options);</div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;  <span class="keywordflow">if</span> (!empty($disallowed_options)) {</div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    $unknown = count($disallowed_options) &gt; 1 ? <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unknown options&#39;</span>) : <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unknown option&#39;</span>);</div>
<div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;strict&#39;</span>, TRUE)) {</div>
<div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;      $msg = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;@unknown: --@options.  See `drush help @command` for available options. To suppress this error, add the option --strict=0.&quot;</span>, array(<span class="stringliteral">&#39;@unknown&#39;</span> =&gt; $unknown, <span class="stringliteral">&#39;@options&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, --&#39;</span>, $disallowed_options), <span class="stringliteral">&#39;@command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>]));</div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_UNKNOWN_OPTION&#39;</span>, $msg);</div>
<div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    }</div>
<div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;  }</div>
<div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;</div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;  <span class="comment">// Next check to see if all required options were specified.</span></div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;  $missing_required_options = array();</div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;  <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;options&#39;</span>] as $option_name =&gt; $option) {</div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    <span class="keywordflow">if</span> (is_array($option) &amp;&amp; !empty($option[<span class="stringliteral">&#39;required&#39;</span>]) &amp;&amp; <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($option_name, NULL) === NULL) {</div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;      $missing_required_options[] = $option_name;</div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    }</div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;  }</div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;  <span class="keywordflow">if</span> (!empty($missing_required_options)) {</div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    $missing = count($missing_required_options) &gt; 1 ? <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Missing required options&#39;</span>) : <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Missing required option&#39;</span>);</div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;@missing: --@options.  See `drush help @command` for information on usage.&quot;</span>, array(<span class="stringliteral">&#39;@missing&#39;</span> =&gt; $missing, <span class="stringliteral">&#39;@options&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, --&#39;</span>, $missing_required_options), <span class="stringliteral">&#39;@command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>])));</div>
<div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;  }</div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;}</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;<span class="keyword">function</span> drush_append_negation_options($allowed_options) {</div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;  $new_allowed = $allowed_options;</div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;  <span class="keywordflow">foreach</span> ($allowed_options as $option) {</div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    $new_allowed[] = <span class="stringliteral">&#39;no-&#39;</span> . $option;</div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;  }</div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;  <span class="keywordflow">return</span> $new_allowed;</div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;}</div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;</div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;<span class="keyword">function</span> _drush_verify_cli_arguments($command) {</div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;  <span class="comment">// Check to see if all of the required arguments</span></div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;  <span class="comment">// are specified.</span></div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;  <span class="keywordflow">if</span> ($command[<span class="stringliteral">&#39;required-arguments&#39;</span>]) {</div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    $required_arg_count = $command[<span class="stringliteral">&#39;required-arguments&#39;</span>];</div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="keywordflow">if</span> ($required_arg_count === TRUE) {</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;      $required_arg_count = count($command[<span class="stringliteral">&#39;argument-description&#39;</span>]);</div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    }</div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="keywordflow">if</span> (count($command[<span class="stringliteral">&#39;arguments&#39;</span>]) &lt; $required_arg_count) {</div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;      $missing = $required_arg_count &gt; 1 ? <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Missing required arguments&#39;</span>) : dt(<span class="stringliteral">&#39;Missing required argument&#39;</span>);</div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;      $required = array_slice(array_keys($command[<span class="stringliteral">&#39;argument-description&#39;</span>]), 0, $required_arg_count);</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;</div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;@missing: @required.  See `drush help @command` for information on usage.&quot;</span>, array(</div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;        <span class="stringliteral">&#39;@missing&#39;</span> =&gt; $missing,</div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;        <span class="stringliteral">&#39;@required&#39;</span> =&gt; implode(<span class="stringliteral">&quot;, &quot;</span>, $required),</div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;        <span class="stringliteral">&#39;@command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>],</div>
<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;      )));</div>
<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    }</div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;  }</div>
<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;}</div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;<span class="comment"> * Return the list of all of the options for the given</span></div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;<span class="comment"> * command record by merging the &#39;options&#39; and &#39;sub-options&#39;</span></div>
<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;<span class="comment"> * records.</span></div>
<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00624"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga0edaf347ba975a7743a81eb3d7a4e38c">  624</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga0edaf347ba975a7743a81eb3d7a4e38c">_drush_get_command_options</a>($command) {</div>
<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;  <a class="code" href="includes_2command_8inc.html#a74995cc76034e90a39baee51111b20be">drush_command_invoke_all_ref</a>(<span class="stringliteral">&#39;drush_help_alter&#39;</span>, $command);</div>
<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;  $options = $command[<span class="stringliteral">&#39;options&#39;</span>];</div>
<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;  <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;sub-options&#39;</span>] as $group =&gt; $suboptions) {</div>
<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;    $options = array_merge($options, $suboptions);</div>
<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;  }</div>
<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;  <span class="keywordflow">return</span> $options;</div>
<div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;}</div>
<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;<span class="comment"> * Return the array keys of $options, plus any &#39;short-form&#39;</span></div>
<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;<span class="comment"> * representations that may appear in the option&#39;s value.</span></div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00637"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga2d33822aebecae3f76bd5d19ff490d6b">  637</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga2d33822aebecae3f76bd5d19ff490d6b">_drush_flatten_options</a>($options) {</div>
<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;  $flattened_options = array();</div>
<div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;</div>
<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;  <span class="keywordflow">foreach</span>($options as $key =&gt; $value) {</div>
<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    <span class="comment">// engine sections start with &#39;package-handler=git_drupalorg&#39;,</span></div>
<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    <span class="comment">// or something similar.  Get rid of everything from the = onward.</span></div>
<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="keywordflow">if</span> (($eq_pos = strpos($key, <span class="charliteral">&#39;=&#39;</span>)) !== FALSE) {</div>
<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;      $key = substr($key, 0, $eq_pos);</div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    }</div>
<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    $flattened_options[] = $key;</div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="keywordflow">if</span> (is_array($value)) {</div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;      <span class="keywordflow">if</span> (array_key_exists(<span class="stringliteral">&#39;short-form&#39;</span>, $value)) {</div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;        $flattened_options[] = $value[<span class="stringliteral">&#39;short-form&#39;</span>];</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;      }</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    }</div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;  }</div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;  <span class="keywordflow">return</span> $flattened_options;</div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;}</div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;<span class="comment"> * Get the options that were passed to the current command.</span></div>
<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;<span class="comment"> * This function returns an array that contains all of the options</span></div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;<span class="comment"> * that are appropriate for forwarding along to drush_invoke_process.</span></div>
<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;<span class="comment"> *   An associative array of option key =&gt; value pairs.</span></div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"><a class="code" href="group__dispatching.html#ga9b1a98376983ee529fc868ef4280b12d">  665</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__dispatching.html#ga9b1a98376983ee529fc868ef4280b12d">drush_redispatch_get_options</a>() {</div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;  <span class="comment">// Start off by taking everything from the site alias and command line</span></div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  <span class="comment">// (&#39;cli&#39; context)</span></div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;  $cli_context = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;cli&#39;</span>);</div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  <span class="comment">// local php settings should not override sitealias settings</span></div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  unset($cli_context[<span class="stringliteral">&#39;php&#39;</span>]);</div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;  unset($cli_context[<span class="stringliteral">&#39;php-options&#39;</span>]);</div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;  <span class="comment">// cli overrides and command specific</span></div>
<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;  $options = $cli_context + <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;specific&#39;</span>);</div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;  $global_option_list = <a class="code" href="drush_8inc.html#acb0a26e79bcbdd1152d59a6916a35aae">drush_get_global_options</a>(FALSE);</div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;  <span class="keywordflow">foreach</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;alias&#39;</span>) as $key =&gt; $value) {</div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordflow">if</span> (array_key_exists($key, $global_option_list)) {</div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;      $options[$key] = $value;</div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    }</div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;  }</div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;</div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;  $options = array_diff_key($options, array_flip(<a class="code" href="sitealias_8inc.html#a4345c09c2ecb4793246075f06c146fec">drush_sitealias_site_selection_keys</a>()));</div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;  unset($options[<span class="stringliteral">&#39;command-specific&#39;</span>]);</div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;  unset($options[<span class="stringliteral">&#39;path-aliases&#39;</span>]);</div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;  <span class="comment">// If we can parse the current command, then examine all contexts</span></div>
<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;  <span class="comment">// in order for any option that is directly related to the current command</span></div>
<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;  $command = <a class="code" href="includes_2command_8inc.html#aaf301462cb45c0da60e79ea868323858">drush_parse_command</a>();</div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;  <span class="keywordflow">if</span> (is_array($command)) {</div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;options&#39;</span>] as $key =&gt; $value) {</div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;      <span class="comment">// Strip leading --</span></div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;      $key = ltrim($key, <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;      $value = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($key);</div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;      <span class="keywordflow">if</span> (isset($value)) {</div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;        $options[$key] = $value;</div>
<div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;      }</div>
<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    }</div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;  }</div>
<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;  <span class="comment">// If --bootstrap-to-first-arg is specified, do not</span></div>
<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;  <span class="comment">// pass it along to remote commands.</span></div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;  unset($options[<span class="stringliteral">&#39;bootstrap-to-first-arg&#39;</span>]);</div>
<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;</div>
<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;  <span class="keywordflow">return</span> $options;</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;}</div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;<span class="comment"> * @} End of &quot;defgroup dispatching&quot;.</span></div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;<span class="comment"> * @file</span></div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;<span class="comment"> * The drush command engine.</span></div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;<span class="comment"> * Since drush can be invoked independently of a proper Drupal</span></div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;<span class="comment"> * installation and commands may operate across sites, a distinct</span></div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;<span class="comment"> * command engine is needed.</span></div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;<span class="comment"> * It mimics the Drupal module engine in order to economize on</span></div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;<span class="comment"> * concepts and to make developing commands as familiar as possible</span></div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;<span class="comment"> * to traditional Drupal module developers.</span></div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;<span class="comment"> * Parse console arguments.</span></div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00724"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a5c7d0d064d4cb56bfe2b2311e5643e11">  724</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a5c7d0d064d4cb56bfe2b2311e5643e11">drush_parse_args</a>() {</div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;  $args = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;argv&#39;</span>);</div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;  $command_args = NULL;</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;  $global_options = array();</div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;  $target_alias_name = NULL;</div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;  <span class="comment">// It would be nice if commandfiles could somehow extend this list,</span></div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;  <span class="comment">// but it is not possible. We need to parse args before we find commandfiles,</span></div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;  <span class="comment">// because the specified options may affect how commandfiles are located.</span></div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;  <span class="comment">// Therefore, commandfiles are loaded too late to affect arg parsing.</span></div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;  <span class="comment">// There are only a limited number of short options anyway; drush reserves</span></div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  <span class="comment">// all for use by drush core.</span></div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;  <span class="keyword">static</span> $arg_opts = array(<span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;u&#39;</span>, <span class="charliteral">&#39;r&#39;</span>, <span class="charliteral">&#39;l&#39;</span>, <span class="charliteral">&#39;i&#39;</span>);</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;  <span class="comment">// Check to see if we were executed via a &quot;#!/usr/bin/env drush&quot; script</span></div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;  <a class="code" href="includes_2command_8inc.html#a59d387101622883fca350211a1c486f1">drush_adjust_args_if_shebang_script</a>($args);</div>
<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;  <span class="comment">// Now process the command line arguments.  We will divide them</span></div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;  <span class="comment">// into options (starting with a &#39;-&#39;) and arguments.</span></div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;  $arguments = $options = array();</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;</div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;  <span class="keywordflow">for</span> ($i = 1; $i &lt; count($args); $i++) {</div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;    $opt = $args[$i];</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;    <span class="comment">// We set $command_args to NULL until the first argument that is not</span></div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;    <span class="comment">// an alias is found (the command); we put everything that follows</span></div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;    <span class="comment">// into $command_args.</span></div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;    <span class="keywordflow">if</span> (is_array($command_args)) {</div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;      $command_args[] = $opt;</div>
<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;    }</div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    <span class="comment">// Is the arg an option (starting with &#39;-&#39;)?</span></div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    <span class="keywordflow">if</span> (!empty($opt) &amp;&amp; $opt{0} == <span class="stringliteral">&quot;-&quot;</span> &amp;&amp; strlen($opt) != 1) {</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;      <span class="comment">// Do we have multiple options behind one &#39;-&#39;?</span></div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;      <span class="keywordflow">if</span> (strlen($opt) &gt; 2 &amp;&amp; $opt{1} != <span class="stringliteral">&quot;-&quot;</span>) {</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;        <span class="comment">// Each char becomes a key of its own.</span></div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;        <span class="keywordflow">for</span> ($j = 1; $j &lt; strlen($opt); $j++) {</div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;          $options[substr($opt, $j, 1)] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;        }</div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;      }</div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;      <span class="comment">// Do we have a longopt (starting with &#39;--&#39;)?</span></div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;      elseif ($opt{1} == <span class="stringliteral">&quot;-&quot;</span>) {</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;        <span class="keywordflow">if</span> ($pos = strpos($opt, <span class="charliteral">&#39;=&#39;</span>)) {</div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;          $options[substr($opt, 2, $pos - 2)] = substr($opt, $pos + 1);</div>
<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;        }</div>
<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;          $options[substr($opt, 2)] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;        }</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;      }</div>
<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        $opt = substr($opt, 1);</div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        <span class="comment">// Check if the current opt is in $arg_opts (= has to be followed by an argument).</span></div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;        <span class="keywordflow">if</span> ((in_array($opt, $arg_opts))) {</div>
<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;          <span class="comment">// Raising errors for missing option values should be handled by the</span></div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;          <span class="comment">// bootstrap or specific command, so we no longer do this here.</span></div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;          $options[$opt] = $args[$i + 1];</div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;          $i++;</div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;        }</div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;          $options[$opt] = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;        }</div>
<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;      }</div>
<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    }</div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    <span class="comment">// If it&#39;s not an option, it&#39;s a command.</span></div>
<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;      $arguments[] = $opt;</div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;      <span class="comment">// Once we find the first argument, record the command args and global options</span></div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;      <span class="keywordflow">if</span> (!is_array($command_args)) {</div>
<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;        <span class="comment">// Remember whether we set $target_alias_name on a previous iteration,</span></div>
<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        <span class="comment">// then record the $target_alias_name iff this arguement references a valid site alias.</span></div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;        $already_set_target = is_string($target_alias_name);</div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;        <span class="keywordflow">if</span> (!$already_set_target &amp;&amp; <a class="code" href="sitealias_8inc.html#a146cdaffbcfaa41f0a53c27cbc7e8b19">drush_sitealias_valid_alias_format</a>($opt)) {</div>
<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;          $target_alias_name = $opt;</div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        }</div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;        <span class="comment">// If an alias record was set on a previous iteration, then this</span></div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;        <span class="comment">// argument must be the command name.  If we set the target alias</span></div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;        <span class="comment">// record on this iteration, then this is not the command name.</span></div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;        <span class="comment">// If we&#39;ve found the command name, then save $options in $global_options</span></div>
<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;        <span class="comment">// (all options that came before the command name), and initialize</span></div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;        <span class="comment">// $command_args to an array so that we will begin storing all args</span></div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;        <span class="comment">// and options that follow the command name in $command_args.</span></div>
<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;        <span class="keywordflow">if</span> ($already_set_target || (!is_string($target_alias_name))) {</div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;          $command_args = array();</div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;          $global_options = $options;</div>
<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;        }</div>
<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;      }</div>
<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    }</div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;  }</div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  <span class="comment">// If no arguments are specified, then the command will</span></div>
<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;  <span class="comment">// be either &#39;help&#39; or &#39;version&#39; (the later if --version is specified)</span></div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;  <span class="comment">// @todo: it would be handy if one could do `drush @remote st --help` and</span></div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;  <span class="comment">// have that show help for st. Today, that shows --help for help command!</span></div>
<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;  <span class="keywordflow">if</span> (!count($arguments)) {</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    <span class="keywordflow">if</span> (array_key_exists(<span class="stringliteral">&#39;version&#39;</span>, $options)) {</div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;      $arguments = array(<span class="stringliteral">&#39;version&#39;</span>);</div>
<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    }</div>
<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;      $arguments = array(<span class="stringliteral">&#39;help&#39;</span>);</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    }</div>
<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;  }</div>
<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;  <span class="keywordflow">if</span> (is_array($command_args)) {</div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_COMMAND_ARGS&#39;</span>, $command_args);</div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;  }</div>
<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_GLOBAL_CLI_OPTIONS&#39;</span>, $global_options);</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;</div>
<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;  <span class="comment">// Handle the &quot;@shift&quot; alias, if present</span></div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;  <a class="code" href="includes_2command_8inc.html#a019118f49079e478cd35ca8eb17998c1">drush_process_bootstrap_to_first_arg</a>($arguments);</div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;</div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;  <a class="code" href="context_8inc.html#ade90fc1aa9c39a740a20c2bf1cb97c25">drush_set_arguments</a>($arguments);</div>
<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;  <a class="code" href="context_8inc.html#a16a51c5b09d64e968c3bd7ec414b8846">drush_set_config_special_contexts</a>($options);</div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;cli&#39;</span>, $options);</div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;  <span class="keywordflow">return</span> $arguments;</div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;}</div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;<span class="comment"> * Pop an argument off of drush&#39;s argument list</span></div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00838"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a069157c844a772c6fc1c5c7e63f1b613">  838</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a069157c844a772c6fc1c5c7e63f1b613">drush_shift</a>() {</div>
<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;  $arguments = <a class="code" href="context_8inc.html#afaf9361f1297f29d10402b075985985a">drush_get_arguments</a>();</div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;  $result = NULL;</div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;  <span class="keywordflow">if</span> (!empty($arguments)) {</div>
<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    <span class="comment">// The php-script command uses the DRUSH_SHIFT_SKIP</span></div>
<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    <span class="comment">// context to cause drush_shift to skip the &#39;php-script&#39;</span></div>
<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    <span class="comment">// command and the script path argument when it is</span></div>
<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    <span class="comment">// called from the user script.</span></div>
<div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    $skip_count = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SHIFT_SKIP&#39;</span>);</div>
<div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    <span class="keywordflow">if</span> (is_numeric($skip_count)) {</div>
<div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;      <span class="keywordflow">for</span> ($i = 0; $i &lt; $skip_count; $i++) {</div>
<div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;        array_shift($arguments);</div>
<div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;      }</div>
<div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;      $skip_count = <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_SHIFT_SKIP&#39;</span>, 0);</div>
<div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    }</div>
<div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    $result = array_shift($arguments);</div>
<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    <a class="code" href="context_8inc.html#ade90fc1aa9c39a740a20c2bf1cb97c25">drush_set_arguments</a>($arguments);</div>
<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;  }</div>
<div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;}</div>
<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;<span class="comment"> * Special checking for &quot;shebang&quot; script handling.</span></div>
<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;<span class="comment"> * If there is a file &#39;script.php&#39; that begins like so:</span></div>
<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;<span class="comment"> *   #!/path/to/drush</span></div>
<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;<span class="comment"> * Then $args will be:</span></div>
<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;<span class="comment"> *   /path/to/drush /path/to/script userArg1 userArg2 ...</span></div>
<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;<span class="comment"> * If it instead starts like this:</span></div>
<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;<span class="comment"> *   #!/path/to/drush --flag php-script</span></div>
<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;<span class="comment"> * Then $args will be:</span></div>
<div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;<span class="comment"> *   /path/to/drush &quot;--flag php-script&quot; /path/to/script userArg1 userArg2 ...</span></div>
<div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;<span class="comment"> * (Note that execve does not split the parameters from</span></div>
<div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;<span class="comment"> * the shebang line on whitespace; see http://en.wikipedia.org/wiki/Shebang_%28Unix%29)</span></div>
<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;<span class="comment"> * When drush is called via one of the &quot;shebang&quot; lines above,</span></div>
<div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;<span class="comment"> * the first or second parameter will be the full path</span></div>
<div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;<span class="comment"> * to the &quot;shebang&quot; script file -- and if the path to the</span></div>
<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;<span class="comment"> * script is in the second position, then we will expect that</span></div>
<div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;<span class="comment"> * the argument in the first position must begin with a</span></div>
<div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;<span class="comment"> * &#39;@&#39; (alias) or &#39;-&#39; (flag).  Under ordinary circumstances,</span></div>
<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;<span class="comment"> * we do not expect that the drush command must come before</span></div>
<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;<span class="comment"> * any argument that is the full path to a file.  We use</span></div>
<div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;<span class="comment"> * this assumption to detect &quot;shebang&quot; script execution.</span></div>
<div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a59d387101622883fca350211a1c486f1">  882</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a59d387101622883fca350211a1c486f1">drush_adjust_args_if_shebang_script</a>(&amp;$args) {</div>
<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="includes_2environment_8inc.html#a87a6fcd104950fb9b0d90e25208bcf79">drush_has_bash</a>()) {</div>
<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    <span class="comment">// The drush script may add --php or --php-options at the</span></div>
<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    <span class="comment">// head of the argument list; skip past those.</span></div>
<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    $base_arg_number = 1;</div>
<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    <span class="keywordflow">while</span> (substr($args[$base_arg_number], 0, 5) == <span class="stringliteral">&#39;--php&#39;</span>) {</div>
<div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;      ++$base_arg_number;</div>
<div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    }</div>
<div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="drush_8inc.html#a8f5d18c322518e0f31f3fce0f024f2ef">_drush_is_drush_shebang_script</a>($args[$base_arg_number])) {</div>
<div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;      <span class="comment">// If $args[1] is a drush &quot;shebang&quot; script, we will insert</span></div>
<div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;      <span class="comment">// the option &quot;--bootstrap-to-first-arg&quot; and the command</span></div>
<div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;      <span class="comment">// &quot;php-script&quot; at the beginning of  @args, so the command</span></div>
<div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;      <span class="comment">// line args become:</span></div>
<div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;      <span class="comment">//   /path/to/drush --bootstrap-to-first-arg php-script /path/to/script userArg1 userArg2 ...</span></div>
<div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;      <a class="code" href="context_8inc.html#aa4b55e2f6174c8b6efaa8f23a0f9e0af">drush_set_option</a>(<span class="stringliteral">&#39;bootstrap-to-first-arg&#39;</span>, TRUE);</div>
<div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;      array_splice($args, $base_arg_number, 0, array(<span class="stringliteral">&#39;php-script&#39;</span>));</div>
<div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;      <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_SHEBANG_SCRIPT&#39;</span>, TRUE);</div>
<div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;    }</div>
<div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    elseif (((strpos($args[$base_arg_number], <span class="charliteral">&#39; &#39;</span>) !== FALSE) || (!ctype_alnum($args[$base_arg_number][0]))) &amp;&amp; (<a class="code" href="drush_8inc.html#a8f5d18c322518e0f31f3fce0f024f2ef">_drush_is_drush_shebang_script</a>($args[$base_arg_number + 1]))) {</div>
<div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;      <span class="comment">// If $args[2] is a drush &quot;shebang&quot; script, we will insert</span></div>
<div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;      <span class="comment">// the space-exploded $arg[1] in place of $arg[1], so the</span></div>
<div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;      <span class="comment">// command line args become:</span></div>
<div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;      <span class="comment">//   /path/to/drush scriptArg1 scriptArg2 ... /path/to/script userArg1 userArg2 ...</span></div>
<div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;      <span class="comment">// If none of the script arguments look like a drush command,</span></div>
<div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;      <span class="comment">// then we will insert &quot;php-script&quot; as the default command to</span></div>
<div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;      <span class="comment">// execute.</span></div>
<div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;      $script_args = explode(<span class="charliteral">&#39; &#39;</span>, $args[$base_arg_number]);</div>
<div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;      $has_command = FALSE;</div>
<div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;      <span class="keywordflow">foreach</span> ($script_args as $script_arg) {</div>
<div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;        <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&quot;/^[a-z][a-z0-9-]*$/&quot;</span>,$script_arg)) {</div>
<div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;          $has_command = TRUE;</div>
<div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;        }</div>
<div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;      }</div>
<div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;      <span class="keywordflow">if</span> (!$has_command) {</div>
<div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;        $script_args[] = <span class="stringliteral">&#39;php-script&#39;</span>;</div>
<div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;      }</div>
<div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;      array_splice($args, 1, $base_arg_number, $script_args);</div>
<div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;      <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_SHEBANG_SCRIPT&#39;</span>, TRUE);</div>
<div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    }</div>
<div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;  }</div>
<div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;}</div>
<div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;<span class="comment"> * Process the --bootstrap-to-first-arg option, if it is present.</span></div>
<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;<span class="comment"> * This option checks to see if the first user-provided argument is an alias</span></div>
<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;<span class="comment"> * or site specification; if it is, it will be shifted into the first argument</span></div>
<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;<span class="comment"> * position, where it will specify the site to bootstrap. The result of this</span></div>
<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;<span class="comment"> * is that if your shebang line looks like this:</span></div>
<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;<span class="comment"> * #!/path/to/drush --bootstrap-to-first-arg php-script</span></div>
<div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;<span class="comment"> * Then when you run that script, you can optionally provide an alias such</span></div>
<div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;<span class="comment"> * as @dev as the first argument (e.g. $ ./mydrushscript.php @dev scriptarg1</span></div>
<div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;<span class="comment"> * scriptarg2). Since this is the behavior that one would usually want,</span></div>
<div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;<span class="comment"> * it is default behavior for a canonical script. That is, a script</span></div>
<div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;<span class="comment"> * with a simple shebang line, like so:</span></div>
<div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;<span class="comment"> * #!/path/to/drush</span></div>
<div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;<span class="comment"> * will implicitly have &quot;--bootstrap-to-first-arg&quot; and &quot;php-script&quot; prepended, and will therefore</span></div>
<div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;<span class="comment"> * behave exactly like the first example. To write a script that does not</span></div>
<div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;<span class="comment"> * use --bootstrap-to-first-arg, then the drush command or at least one flag must be explicitly</span></div>
<div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;<span class="comment"> * included, like so:</span></div>
<div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;<span class="comment"> * #!/path/to/drush php-script</span></div>
<div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00949"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a019118f49079e478cd35ca8eb17998c1">  949</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a019118f49079e478cd35ca8eb17998c1">drush_process_bootstrap_to_first_arg</a>(&amp;$arguments) {</div>
<div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;bootstrap-to-first-arg&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;    $shift_alias_pos = 1 + (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SHEBANG_SCRIPT&#39;</span>) === TRUE);</div>
<div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;    <span class="keywordflow">if</span> (count($arguments) &gt;= $shift_alias_pos) {</div>
<div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;      $shifted_alias = $arguments[$shift_alias_pos];</div>
<div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;      $alias_record = <a class="code" href="sitealias_8inc.html#ac2f57b80441374522c4e4cdc3b7e0c2b">drush_sitealias_get_record</a>($shifted_alias);</div>
<div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;      <span class="keywordflow">if</span> (!empty($alias_record)) {</div>
<div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;        <span class="comment">// Move the alias we shifted from its current position</span></div>
<div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;        <span class="comment">// in the argument list to the front of the list</span></div>
<div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;        array_splice($arguments, $shift_alias_pos, 1);</div>
<div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;        array_unshift($arguments, $shifted_alias);</div>
<div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;      }</div>
<div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    }</div>
<div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;  }</div>
<div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;}</div>
<div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;<span class="comment"> * Get a list of all implemented commands.</span></div>
<div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;<span class="comment"> * This invokes hook_drush_command().</span></div>
<div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;<span class="comment"> *   Associative array of currently active command descriptors.</span></div>
<div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00973"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">  973</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>($reset = FALSE) {</div>
<div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;  <span class="keyword">static</span> $commands = array();</div>
<div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;</div>
<div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;  <span class="keywordflow">if</span> ($reset) {</div>
<div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;    $commands = array();</div>
<div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;    <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;  }</div>
<div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;  elseif ($commands) {</div>
<div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;    <span class="keywordflow">return</span> $commands;</div>
<div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;  }</div>
<div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;</div>
<div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;  $list = <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>();</div>
<div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;  <span class="keywordflow">foreach</span> ($list as $commandfile =&gt; $path) {</div>
<div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="includes_2command_8inc.html#a2ce77284c0002dda3a5d0527e583e017">drush_command_hook</a>($commandfile, <span class="stringliteral">&#39;drush_command&#39;</span>)) {</div>
<div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;      $function = $commandfile . <span class="stringliteral">&#39;_drush_command&#39;</span>;</div>
<div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;      $result = $function();</div>
<div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;      <span class="keywordflow">foreach</span> ((array)$result as $key =&gt; $command) {</div>
<div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;        <span class="comment">// Add some defaults and normalize the command descriptor.</span></div>
<div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        $command += drush_command_defaults($key, $commandfile, $path);</div>
<div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;</div>
<div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;        <span class="comment">// Add engine data.</span></div>
<div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;        <a class="code" href="engines_8inc.html#a04ee0e7019029ef27bc4e8f14341b2b4">drush_merge_engine_data</a>($command);</div>
<div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;</div>
<div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;        <span class="comment">// Translate command.</span></div>
<div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        <a class="code" href="includes_2command_8inc.html#aa89380abcf2e406ea2d6fe05d529f2b1">drush_command_translate</a>($command);</div>
<div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;</div>
<div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;        <span class="comment">// If the command callback is not &#39;drush_command&#39;, then</span></div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;        <span class="comment">// copy the callback function to an alternate element</span></div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;        <span class="comment">// of the command array that will be called when Drush</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        <span class="comment">// calls the command function hooks.  Then, set the</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        <span class="comment">// callback to drush_command so that the function hooks</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;        <span class="comment">// will be called.</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;        <span class="keywordflow">if</span> (($command[<span class="stringliteral">&#39;callback&#39;</span>] != <span class="stringliteral">&#39;drush_command&#39;</span>) &amp;&amp; $command[<span class="stringliteral">&#39;invoke hooks&#39;</span>]) {</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;          $command[<span class="stringliteral">&#39;primary function&#39;</span>] = $command[<span class="stringliteral">&#39;callback&#39;</span>];</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;          $command[<span class="stringliteral">&#39;callback&#39;</span>] = <span class="stringliteral">&#39;drush_command&#39;</span>;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;        }</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;        $commands[$key] = $command;</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;        <span class="comment">// For every alias, make a copy of the command and store it in the command list</span></div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;        <span class="comment">// using the alias as a key</span></div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;        <span class="keywordflow">if</span> (isset($command[<span class="stringliteral">&#39;aliases&#39;</span>]) &amp;&amp; count($command[<span class="stringliteral">&#39;aliases&#39;</span>])) {</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;          <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;aliases&#39;</span>] as $alias) {</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;            $commands[$alias] = $command;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;            $commands[$alias][<span class="stringliteral">&#39;is_alias&#39;</span>] = TRUE;</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;          }</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;        }</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;      }</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;    }</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;  }</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;  <span class="keywordflow">return</span> $commands;</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;}</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;<span class="keyword">function</span> drush_command_defaults($key, $commandfile, $path) {</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;  $defaults =  array(</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;    <span class="stringliteral">&#39;command&#39;</span> =&gt; $key,</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;    <span class="stringliteral">&#39;command-hook&#39;</span> =&gt; $key,</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;    <span class="stringliteral">&#39;invoke hooks&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    <span class="stringliteral">&#39;callback arguments&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    <span class="stringliteral">&#39;commandfile&#39;</span> =&gt; $commandfile,</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    <span class="stringliteral">&#39;path&#39;</span> =&gt; dirname($path),</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(), <span class="comment">// Helpful for drush_show_help().</span></div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;    <span class="stringliteral">&#39;callback&#39;</span> =&gt; <span class="stringliteral">&#39;drush_command&#39;</span>,</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;    <span class="stringliteral">&#39;primary function&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; NULL,</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;    <span class="stringliteral">&#39;sections&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;      <span class="stringliteral">&#39;examples&#39;</span> =&gt; <span class="stringliteral">&#39;Examples&#39;</span>,</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;      <span class="stringliteral">&#39;arguments&#39;</span> =&gt; <span class="stringliteral">&#39;Arguments&#39;</span>,</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; <span class="stringliteral">&#39;Options&#39;</span>,</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;    ),</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;    <span class="stringliteral">&#39;required-arguments&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    <span class="stringliteral">&#39;allow-additional-options&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;    <span class="stringliteral">&#39;core&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    <span class="stringliteral">&#39;scope&#39;</span> =&gt; <span class="stringliteral">&#39;site&#39;</span>,</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    <span class="stringliteral">&#39;drupal dependencies&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    <span class="stringliteral">&#39;drush dependencies&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    <span class="stringliteral">&#39;handle-remote-commands&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;    <span class="stringliteral">&#39;remote-tty&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;    <span class="stringliteral">&#39;strict-option-handling&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    <span class="stringliteral">&#39;bootstrap_errors&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    <span class="stringliteral">&#39;topics&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;    <span class="stringliteral">&#39;category&#39;</span> =&gt; $commandfile,</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;  );</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;  <span class="keywordflow">if</span> ($bootstrap = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_OBJECT&#39;</span>)) {</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    $defaults = array_merge($defaults, $bootstrap-&gt;command_defaults());</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;  }</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;  <span class="keywordflow">return</span> $defaults;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;}</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;<span class="comment"> * Translates description and other keys of a command definition.</span></div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;<span class="comment"> * @param $command</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;<span class="comment"> *   A command definition.</span></div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01074"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#aa89380abcf2e406ea2d6fe05d529f2b1"> 1074</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#aa89380abcf2e406ea2d6fe05d529f2b1">drush_command_translate</a>(&amp;$command) {</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;  $command[<span class="stringliteral">&#39;description&#39;</span>] = <a class="code" href="includes_2command_8inc.html#a643622feb3301c9b33e295e7f2bd7804">_drush_command_translate</a>($command[<span class="stringliteral">&#39;description&#39;</span>]);</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;  $keys = array(<span class="stringliteral">&#39;arguments&#39;</span>, <span class="stringliteral">&#39;options&#39;</span>, <span class="stringliteral">&#39;examples&#39;</span>, <span class="stringliteral">&#39;sections&#39;</span>);</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;  <span class="keywordflow">foreach</span> ($keys as $key) {</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    <span class="keywordflow">foreach</span> ($command[$key] as $k =&gt; $v) {</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;      <span class="keywordflow">if</span> (is_array($v)) {</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        $v[<span class="stringliteral">&#39;description&#39;</span>] = <a class="code" href="includes_2command_8inc.html#a643622feb3301c9b33e295e7f2bd7804">_drush_command_translate</a>($v[<span class="stringliteral">&#39;description&#39;</span>]);</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;      }</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        $v = <a class="code" href="includes_2command_8inc.html#a643622feb3301c9b33e295e7f2bd7804">_drush_command_translate</a>($v);</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;      }</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;      $command[$key][$k] = $v;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    }</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;  }</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;}</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="comment"> * Helper function for drush_command_translate().</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;<span class="comment"> * @param $source</span></div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;<span class="comment"> *   String or array.</span></div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01096"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a643622feb3301c9b33e295e7f2bd7804"> 1096</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a643622feb3301c9b33e295e7f2bd7804">_drush_command_translate</a>($source) {</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;  <span class="keywordflow">return</span> is_array($source) ? call_user_func_array(<span class="stringliteral">&#39;dt&#39;</span>, $source) : <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>($source);</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;}</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;<span class="comment"> * Matches a commands array, as returned by drush_get_arguments, with the</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;<span class="comment"> * current command table.</span></div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;<span class="comment"> * Note that not all commands may be discoverable at the point-of-call,</span></div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;<span class="comment"> * since Drupal modules can ship commands as well, and they are</span></div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;<span class="comment"> * not available until after bootstrapping.</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;<span class="comment"> * drush_parse_command returns a normalized command descriptor, which</span></div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;<span class="comment"> * is an associative array. Some of its entries are:</span></div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;<span class="comment"> * - callback arguments: an array of arguments to pass to the calback.</span></div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;<span class="comment"> * - callback: the function to run. Usually, this is &#39;drush_command&#39;, which</span></div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;<span class="comment"> *   will determine the primary hook for the function automatically.  Only</span></div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;<span class="comment"> *   specify a callback function if you need many commands to call the same</span></div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;<span class="comment"> *   function (e.g. drush_print_file).</span></div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;<span class="comment"> * - invoke hooks: If TRUE (the default), Drush will invoke all of the pre and</span></div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="comment"> *   post hooks for this command.  Set to FALSE to suppress hooks.  This setting</span></div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;<span class="comment"> *   is ignored unless the command &#39;callback&#39; is also set.</span></div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;<span class="comment"> * - primary function: Drush will copy the &#39;callback&#39; parameter here if</span></div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;<span class="comment"> *   necessary.  This value should not be set explicitly; use &#39;callback&#39; instead.</span></div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;<span class="comment"> * - description: description of the command.</span></div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;<span class="comment"> * - arguments: an array of arguments that are understood by the command. for help texts.</span></div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;<span class="comment"> * - required-arguments: The minimum number of arguments that are required, or TRUE if all are required.</span></div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;<span class="comment"> * - options: an array of options that are understood by the command. for help texts.</span></div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;<span class="comment"> * - examples: an array of examples that are understood by the command. for help texts.</span></div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;<span class="comment"> * - scope: one of &#39;system&#39;, &#39;project&#39;, &#39;site&#39;.</span></div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;<span class="comment"> * - bootstrap: drupal bootstrap level (depends on Drupal major version). -1=no_bootstrap.</span></div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="comment"> * - core: Drupal major version required.</span></div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;<span class="comment"> * - drupal dependencies: drupal modules required for this command.</span></div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;<span class="comment"> * - drush dependencies: other drush command files required for this command.</span></div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;<span class="comment"> * - handle-remote-commands: set to TRUE if `drush @remote mycommand` should be executed</span></div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;<span class="comment"> *   locally rather than remotely dispatched.  When this mode is set, the target site</span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;<span class="comment"> *   can be obtained via:</span></div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;<span class="comment"> *     drush_get_context(&#39;DRUSH_TARGET_SITE_ALIAS&#39;)</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;<span class="comment"> * - remote-tty: set to TRUE if Drush should force ssh to allocate a pseudo-tty</span></div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;<span class="comment"> *   when this command is being called remotely.  Important for interactive commands.</span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;<span class="comment"> *   Remote commands that allocate a psedo-tty always print &quot;Connection closed...&quot; when done.</span></div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;<span class="comment"> * - strict-option-handling: set to TRUE if drush should strictly separate local command</span></div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;<span class="comment"> *   cli options from the global options.  Usually, drush allows global cli options and</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;<span class="comment"> *   command cli options to be interspersed freely on the commandline.  For commands where</span></div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;<span class="comment"> *   this flag is set, options are separated, with global options comming before the</span></div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;<span class="comment"> *   command names, and command options coming after, like so:</span></div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;<span class="comment"> *     drush --global-options command --command-options</span></div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="comment"> *   In this mode, the command options are no longer available via drush_get_option();</span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="comment"> *   instead, they can be retrieved via:</span></div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;<span class="comment"> *     $args = drush_get_original_cli_args_and_options();</span></div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;<span class="comment"> *     $args = drush_get_context(&#39;DRUSH_COMMAND_ARGS&#39;, array());</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;<span class="comment"> *   In this case, $args will contain the command args and options literally, exactly as they</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;<span class="comment"> *   were entered on the command line, and in the same order as they appeared.</span></div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;<span class="comment"> * - &#39;outputformat&#39;: declares the data format to be used to render the</span></div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;<span class="comment"> *   command result.  In addition to the output format engine options</span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;<span class="comment"> *   listed below, each output format type can take additional metadata</span></div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;<span class="comment"> *   items that control the way that the output is rendered.  See the</span></div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;<span class="comment"> *   comment in each particular output format class for information. The</span></div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;<span class="comment"> *   Drush core output format engines can be found in commands/core/outputformat.</span></div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;<span class="comment"> *     - &#39;default&#39;: The default type to render output as. If declared, the</span></div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;<span class="comment"> *       command should not print any output on its own, but instead should</span></div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<span class="comment"> *       return a data structure (usually an associative array) that can</span></div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;<span class="comment"> *       be rendered by the output type selected.</span></div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;<span class="comment"> *     - &#39;pipe-format&#39;: When the command is executed in --pipe mode, the</span></div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;<span class="comment"> *       command output will be rendered by the format specified by the</span></div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;<span class="comment"> *       pipe-format item instead of the default format.  Note that in</span></div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;<span class="comment"> *       either event, the user may specify the format to use via the</span></div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;<span class="comment"> *       --format command-line option.</span></div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;<span class="comment"> *     - &#39;formatted-filter&#39;: specifies a function callback that will be</span></div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;<span class="comment"> *       used to filter the command result if the selected output formatter</span></div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;<span class="comment"> *       is NOT declared to be machine-parsable.  &quot;table&quot; is an example of</span></div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;<span class="comment"> *       an output format that is not machine-parsable.</span></div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;<span class="comment"> *     - &#39;parsable-filter&#39;: function callback that will be used to filter the</span></div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="comment"> *       command result if the selected output formatter is declared to be</span></div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;<span class="comment"> *       machine-parsable. &quot;var_export&quot; is an example of an output format that</span></div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;<span class="comment"> *       is machine-parsable.</span></div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;<span class="comment"> *     - &#39;output-data-type&#39;: An identifier representing the data structure that</span></div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;<span class="comment"> *       the command returns.  @see outputformat_drush_engine_outputformat() for</span></div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;<span class="comment"> *       a description of the supported values.</span></div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;<span class="comment"> *     - &#39;field-labels&#39;: A mapping from machine name to human-readable name</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;<span class="comment"> *       for all of the fields in a table-format command result.  All</span></div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;<span class="comment"> *       possible field names should appear in this list.</span></div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;<span class="comment"> *     - &#39;fields-default&#39;: A list of the machine names of the fields that</span></div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;<span class="comment"> *       should be displayed by default in tables.</span></div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;<span class="comment"> *     - &#39;private-fields&#39;: A list of any fields that contain sensitive</span></div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;<span class="comment"> *       information, such as passwords.  By default, Drush will hide private</span></div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;<span class="comment"> *       fields before printing the results to the console, but will include</span></div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;<span class="comment"> *       them in backend invoke results. Use --show-passwords to display.</span></div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="comment"> *     - &#39;column-widths&#39;: A mapping from field machine name to the column width</span></div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;<span class="comment"> *       that should be used in table output.  Drush will automatically</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;<span class="comment"> *       calculate the width of any field not listed here based on the length</span></div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;<span class="comment"> *       of the data items in it.</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;<span class="comment"> * - engines: declares information on Drush engines the command will load.</span></div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;<span class="comment"> *   Available engines can vary by command type.</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;<span class="comment"> * @return bool|array</span></div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;<span class="comment"> *   A command definition.</span></div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01194"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#aaf301462cb45c0da60e79ea868323858"> 1194</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#aaf301462cb45c0da60e79ea868323858">drush_parse_command</a>() {</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;  $args = <a class="code" href="context_8inc.html#afaf9361f1297f29d10402b075985985a">drush_get_arguments</a>();</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;  $command = FALSE;</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;  <span class="comment">// Get a list of all implemented commands.</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;  $implemented = <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;  <span class="keywordflow">if</span> (!empty($args) &amp;&amp; isset($implemented[$args[0]])) {</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    $command = $implemented[$args[0]];</div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;    $arguments = array_slice($args, 1);</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;  }</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;  <span class="comment">// We have found a command that matches. Set the appropriate values.</span></div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;  <span class="keywordflow">if</span> ($command) {</div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;    <span class="comment">// Special case. Force help command if --help option was specified.</span></div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;help&#39;</span>)) {</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;      $arguments = array($command[<span class="stringliteral">&#39;command&#39;</span>]);</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;      $command = $implemented[<span class="stringliteral">&#39;help&#39;</span>];</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;      $command[<span class="stringliteral">&#39;arguments&#39;</span>] = $arguments;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;    }</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;      <a class="code" href="includes_2command_8inc.html#a6a908a954cb96c0e4dadb715cd72cae4">_drush_prepare_command</a>($command, $arguments);</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;    }</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    <a class="code" href="context_8inc.html#af37b8df12a8fc3bf25b173d420a11203">drush_set_command</a>($command);</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;  }</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;  <span class="keywordflow">return</span> $command;</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;}</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;<span class="comment"> * Called by drush_parse_command().  If a command is dispatched</span></div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;<span class="comment"> * directly by drush_dispatch(), then drush_dispatch() will call</span></div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;<span class="comment"> * this function.</span></div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01226"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a6a908a954cb96c0e4dadb715cd72cae4"> 1226</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a6a908a954cb96c0e4dadb715cd72cae4">_drush_prepare_command</a>(&amp;$command, $arguments = array()) {</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;  <span class="comment">// Drush overloads $command[&#39;arguments&#39;]; save the argument description</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;  <span class="keywordflow">if</span> (!isset($command[<span class="stringliteral">&#39;argument-description&#39;</span>])) {</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;    $command[<span class="stringliteral">&#39;argument-description&#39;</span>] = $command[<span class="stringliteral">&#39;arguments&#39;</span>];</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;  }</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;  <span class="comment">// Merge specified callback arguments, which precede the arguments passed on the command line.</span></div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;  <span class="keywordflow">if</span> (isset($command[<span class="stringliteral">&#39;callback arguments&#39;</span>]) &amp;&amp; is_array($command[<span class="stringliteral">&#39;callback arguments&#39;</span>])) {</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    $arguments = array_merge($command[<span class="stringliteral">&#39;callback arguments&#39;</span>], $arguments);</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;  }</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;  $command[<span class="stringliteral">&#39;arguments&#39;</span>] = $arguments;</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;}</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;<span class="comment"> * Invoke a hook in all available command files that implement it.</span></div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;<span class="comment"> * @see drush_command_invoke_all_ref()</span></div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;<span class="comment"> * @param $hook</span></div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;<span class="comment"> *   The name of the hook to invoke.</span></div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;<span class="comment"> * @param ...</span></div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;<span class="comment"> *   Arguments to pass to the hook.</span></div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;<span class="comment"> *   An array of return values of the hook implementations. If commands return</span></div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="comment"> *   arrays from their implementations, those are merged into one array.</span></div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01251"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a19eba9666aba673a64fbd78a2c5ef4f9"> 1251</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a19eba9666aba673a64fbd78a2c5ef4f9">drush_command_invoke_all</a>() {</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;  $args = func_get_args();</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;  <span class="keywordflow">if</span> (count($args) == 1) {</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    $args[] = NULL;</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;  }</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;  $reference_value = $args[1];</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;  $args[1] = &amp;$reference_value;</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;</div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;  <span class="keywordflow">return</span> call_user_func_array(<span class="stringliteral">&#39;drush_command_invoke_all_ref&#39;</span>, $args);</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;}</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;<span class="comment"> * A drush_command_invoke_all() that wants the first parameter to be passed by reference.</span></div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;<span class="comment"> * @see drush_command_invoke_all()</span></div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01267"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a74995cc76034e90a39baee51111b20be"> 1267</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a74995cc76034e90a39baee51111b20be">drush_command_invoke_all_ref</a>($hook, &amp;$reference_parameter) {</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;  $args = func_get_args();</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;  array_shift($args);</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;  <span class="comment">// Insure that call_user_func_array can alter first parameter</span></div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;  $args[0] = &amp;$reference_parameter;</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;  $return = array();</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;  $modules = <a class="code" href="includes_2command_8inc.html#a385cd0ff47c30105f965722a81987809">drush_command_implements</a>($hook);</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;  <span class="keywordflow">if</span> ($hook != <span class="stringliteral">&#39;drush_invoke_alter&#39;</span>) {</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    <span class="comment">// Allow modules to control the order of hook invocations</span></div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    <a class="code" href="includes_2command_8inc.html#a74995cc76034e90a39baee51111b20be">drush_command_invoke_all_ref</a>(<span class="stringliteral">&#39;drush_invoke_alter&#39;</span>, $modules, $hook);</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;  }</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;  <span class="keywordflow">foreach</span> ($modules as $module) {</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;    $function = $module .<span class="charliteral">&#39;_&#39;</span>. $hook;</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;    $result = call_user_func_array($function, $args);</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    <span class="keywordflow">if</span> (isset($result) &amp;&amp; is_array($result)) {</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;      $return = array_merge_recursive($return, $result);</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    }</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isset($result)) {</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;      $return[] = $result;</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;    }</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;  }</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;  <span class="keywordflow">return</span> $return;</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;}</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;<span class="comment"> * Determine which command files are implementing a hook.</span></div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;<span class="comment"> * @param $hook</span></div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;<span class="comment"> *   The name of the hook (e.g. &quot;drush_help&quot; or &quot;drush_command&quot;).</span></div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;<span class="comment"> *   An array with the names of the command files which are implementing this hook.</span></div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01300"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a385cd0ff47c30105f965722a81987809"> 1300</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a385cd0ff47c30105f965722a81987809">drush_command_implements</a>($hook) {</div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;  $implementations[$hook] = array();</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;  $list = <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>();</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;  <span class="keywordflow">foreach</span> ($list as $commandfile =&gt; $file) {</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="includes_2command_8inc.html#a2ce77284c0002dda3a5d0527e583e017">drush_command_hook</a>($commandfile, $hook)) {</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;      $implementations[$hook][] = $commandfile;</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;    }</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;  }</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;  <span class="keywordflow">return</span> (array)$implementations[$hook];</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;}</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;<span class="comment"> * @param string</span></div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;<span class="comment"> *   name of command to check.</span></div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;<span class="comment"> * @return boolean</span></div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;<span class="comment"> *   TRUE if the given command has an implementation.</span></div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01318"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a727745c7eb5e69dedd5587146c0d0d98"> 1318</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a727745c7eb5e69dedd5587146c0d0d98">drush_is_command</a>($command) {</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;  $commands = <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;  <span class="keywordflow">return</span> isset($commands[$command]);</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;}</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;<span class="comment"> * @param string</span></div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;<span class="comment"> *   name of command or command alias.</span></div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;<span class="comment"> *   Primary name of command.</span></div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01330"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#ada5bfda5bb64c19886f7253e30a58de2"> 1330</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#ada5bfda5bb64c19886f7253e30a58de2">drush_command_normalize_name</a>($command_name) {</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;  $commands = <a class="code" href="includes_2command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;  <span class="keywordflow">return</span> isset($commands[$command_name]) ? $commands[$command_name][<span class="stringliteral">&#39;command&#39;</span>] : $command_name;</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;}</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;<span class="comment"> * Collect a list of all available drush command files.</span></div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;<span class="comment"> * Scans the following paths for drush command files:</span></div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;<span class="comment"> * - The &quot;/path/to/drush/commands&quot; folder.</span></div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;<span class="comment"> * - Folders listed in the &#39;include&#39; option (see example.drushrc.php).</span></div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;<span class="comment"> * - The system-wide drush commands folder, e.g. /usr/share/drush/commands</span></div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;<span class="comment"> * - The &quot;.drush&quot; folder in the user&#39;s HOME folder.</span></div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;<span class="comment"> * - /drush and sites/all/drush in current Drupal site.</span></div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;<span class="comment"> * - Folders belonging to enabled modules in the current Drupal site.</span></div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;<span class="comment"> * A Drush command file is a file that matches &quot;*.drush.inc&quot;.</span></div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;<span class="comment"> * @see drush_scan_directory()</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;<span class="comment"> *   An associative array whose keys and values are the names of all available</span></div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;<span class="comment"> *   command files.</span></div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01355"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444"> 1355</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>() {</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_COMMAND_FILES&#39;</span>, array());</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;}</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;<span class="keyword">function</span> _drush_add_commandfiles($searchpath, $phase = NULL, $reset = FALSE) {</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;  <span class="keyword">static</span> $evaluated = array();</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;  <span class="keyword">static</span> $deferred = array();</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;  $cache =&amp; <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_COMMAND_FILES&#39;</span>, array());</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;  <span class="keywordflow">if</span> (count($searchpath)) {</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;    <span class="keywordflow">if</span> (!$reset) {</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;      <span class="comment">// Assemble a cid specific to the bootstrap phase and searchpaths.</span></div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;      <span class="comment">// Bump $cf_version when making a change to a dev version of Drush</span></div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;      <span class="comment">// that invalidates the commandfile cache.</span></div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;      $cf_version = 4;</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;      $cid = <a class="code" href="includes_2cache_8inc.html#a70613777c5e1a0e258bd0d8e213e0156">drush_get_cid</a>(<span class="stringliteral">&#39;commandfiles-&#39;</span> . $phase, array(), array_merge($searchpath, array($cf_version)));</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;      $command_cache = <a class="code" href="includes_2cache_8inc.html#adc36ac3b562c67cbf1d7aab89c029694">drush_cache_get</a>($cid);</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;      <span class="keywordflow">if</span> (isset($command_cache-&gt;data)) {</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;        $cached_list = $command_cache-&gt;data;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;        <span class="comment">// If we want to temporarily ignore modules via &#39;ignored-modules&#39;,</span></div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;        <span class="comment">// then we need to take these out of the cache as well.</span></div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;        <span class="keywordflow">foreach</span> (<a class="code" href="context_8inc.html#ade60e65f76863ed34db22f5e7f83a150">drush_get_option_list</a>(<span class="stringliteral">&#39;ignored-modules&#39;</span>) as $ignored) {</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;          unset($cached_list[$ignored]);</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;        }</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;      }</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;    }</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;    <span class="comment">// Build a list of all of the modules to attempt to load.</span></div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;    <span class="comment">// Start with any modules deferred from a previous phase.</span></div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;    $list = $deferred;</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;    <span class="keywordflow">if</span> (isset($cached_list)) {</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;      $list = array_merge($list, $cached_list);</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;    }</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;      <span class="comment">// Scan for drush command files; add to list for consideration if found.</span></div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;      <span class="keywordflow">foreach</span> (array_unique($searchpath) as $path) {</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;        <span class="keywordflow">if</span> (is_dir($path)) {</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;          $nomask = array_merge(<a class="code" href="includes_2command_8inc.html#a835a66ae60ec33b87f477a6b3dd00547">drush_filename_blacklist</a>(), <a class="code" href="context_8inc.html#ade60e65f76863ed34db22f5e7f83a150">drush_get_option_list</a>(<span class="stringliteral">&#39;ignored-modules&#39;</span>));</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;          $dmv = DRUSH_MAJOR_VERSION;</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;          $files = <a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($path, <span class="stringliteral">&quot;/\.drush($dmv|)\.inc$/&quot;</span>, $nomask);</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;          <span class="keywordflow">foreach</span> ($files as $filename =&gt; $info) {</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;            $module = basename($filename);</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;            $module = preg_replace(<span class="stringliteral">&#39;/\.*drush[0-9]*\.inc/&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $module);</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;            <span class="comment">// Only try to bootstrap modules that we have never seen before.</span></div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;            <span class="keywordflow">if</span> (!array_key_exists($module, $evaluated) &amp;&amp; file_exists($filename)) {</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;              $evaluated[$module] = TRUE;</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;              $list[$module] = $filename;</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;            }</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;          }</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;        }</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;      }</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;      <span class="keywordflow">if</span> (isset($cid)) {</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;        <a class="code" href="includes_2cache_8inc.html#a27a40af68c2a61fdf94b980b953236bf">drush_cache_set</a>($cid, $list);</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;      }</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;    }</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    <span class="comment">// Check to see if the commandfile is valid for this version of Drupal</span></div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;    <span class="comment">// and is still present on filesystem (in case of cached commandfile list).</span></div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;    <span class="keywordflow">foreach</span> ($list as $module =&gt; $filename) {</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;      $load_command = TRUE;</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;      $module_versionless = preg_replace(<span class="stringliteral">&#39;/\.d([0-9]+)$/&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $module);</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;      <span class="keywordflow">if</span> (!isset($cache[$module_versionless])) {</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;        $drupal_version = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;        <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/\.d([0-9]+)$/&#39;</span>, $module, $matches)) {</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;          $drupal_version = $matches[1];</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;        }</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;        <span class="keywordflow">if</span> (!empty($drupal_version) &amp;&amp; ($drupal_version != <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>())) {</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;          $load_command = FALSE;</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;        }</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;        <span class="keywordflow">if</span> ($load_command) {</div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;          <span class="comment">// Only try to require if the file exists. If not, a file from the</span></div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;          <span class="comment">// command file cache may not be available anymore, in which case</span></div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;          <span class="comment">// we rebuild the cache for this phase.</span></div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;          <span class="keywordflow">if</span> ($filepath = realpath($filename)) {</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;            $cache[$module_versionless] = $filename;</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;            require_once $filepath;</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;            unset($deferred[$module]);</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;          }</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;          elseif (!$reset) {</div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;            _drush_add_commandfiles($searchpath, $phase, TRUE);</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;          }</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;        }</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;          unset($list[$module]);</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;          <span class="comment">// Signal that we should try again on</span></div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;          <span class="comment">// the next bootstrap phase.  We set</span></div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;          <span class="comment">// the flag to the filename of the first</span></div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;          <span class="comment">// module we find so that only that one</span></div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;          <span class="comment">// will be retried.</span></div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;          $deferred[$module] = $filename;</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;        }</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;      }</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;    }</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    <span class="keywordflow">if</span> (count($list)) {</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;      ksort($cache);</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;    }</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;  }</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;}</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;<span class="comment"> * Substrings to ignore during commandfile and site alias searching.</span></div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01458"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a835a66ae60ec33b87f477a6b3dd00547"> 1458</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a835a66ae60ec33b87f477a6b3dd00547">drush_filename_blacklist</a>() {</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;  $blacklist = array(<span class="charliteral">&#39;.&#39;</span>, <span class="stringliteral">&#39;..&#39;</span>, <span class="stringliteral">&#39;drush_make&#39;</span>, <span class="stringliteral">&#39;examples&#39;</span>, <span class="stringliteral">&#39;tests&#39;</span>, <span class="stringliteral">&#39;disabled&#39;</span>, <span class="stringliteral">&#39;gitcache&#39;</span>, <span class="stringliteral">&#39;cache&#39;</span>);</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;  <span class="keywordflow">for</span> ($v=4; $v&lt;=(DRUSH_MAJOR_VERSION)+3; ++$v) {</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;    <span class="keywordflow">if</span> ($v != DRUSH_MAJOR_VERSION) {</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;      $blacklist[] = <span class="stringliteral">&#39;drush&#39;</span> . $v;</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;    }</div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;  }</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;  $blacklist = array_merge($blacklist, <a class="code" href="context_8inc.html#ade60e65f76863ed34db22f5e7f83a150">drush_get_option_list</a>(<span class="stringliteral">&#39;exclude&#39;</span>));</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;  <span class="keywordflow">return</span> $blacklist;</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;}</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;<span class="comment"> * Conditionally include files based on the command used.</span></div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="comment"> * Steps through each of the currently loaded commandfiles and</span></div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="comment"> * loads an optional commandfile based on the key.</span></div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;<span class="comment"> * When a command such as &#39;pm-enable&#39; is called, this</span></div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;<span class="comment"> * function will find all &#39;enable.pm.inc&#39; files that</span></div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;<span class="comment"> * are present in each of the commandfile directories.</span></div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01479"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#abf0bb730c62cb31e3f74c36d5bc1d01a"> 1479</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#abf0bb730c62cb31e3f74c36d5bc1d01a">drush_command_include</a>($command) {</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;  $include_files = drush_command_get_includes($command);</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;  <span class="keywordflow">foreach</span>($include_files as $filename =&gt; $commandfile) {</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Including !filename&#39;</span>, array(<span class="stringliteral">&#39;!filename&#39;</span> =&gt; $filename)), <span class="stringliteral">&#39;bootstrap&#39;</span>);</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    include_once($filename);</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;  }</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;}</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="keyword">function</span> drush_command_get_includes($command) {</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;  $include_files = array();</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;  $parts = explode(<span class="charliteral">&#39;-&#39;</span>, $command);</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;  $command = implode(<span class="stringliteral">&quot;.&quot;</span>, array_reverse($parts));</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;  $commandfiles = <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>();</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;  $options = array();</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;  <span class="keywordflow">foreach</span> ($commandfiles as $commandfile =&gt; $file) {</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    $filename = sprintf(<span class="stringliteral">&quot;%s/%s.inc&quot;</span>, dirname($file), $command);</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    <span class="keywordflow">if</span> (file_exists($filename)) {</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;      $include_files[$filename] = $commandfile;</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;    }</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;  }</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;  <span class="keywordflow">return</span> $include_files;</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;}</div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;<span class="comment"> * Conditionally include default options based on the command used.</span></div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01506"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#ad5dd93fad069d6ba73b3546d26855071"> 1506</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#ad5dd93fad069d6ba73b3546d26855071">drush_command_default_options</a>($command = NULL) {</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;  $command_default_options = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;command-specific&#39;</span>);</div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;  drush_command_set_command_specific($command_default_options, $command);</div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;}</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;<span class="keyword">function</span> drush_sitealias_command_default_options($site_record, $prefix, $command = NULL) {</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;  <span class="keywordflow">if</span> (isset($site_record) &amp;&amp; array_key_exists($prefix . <span class="stringliteral">&#39;command-specific&#39;</span>, $site_record)) {</div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;    drush_command_set_command_specific($site_record[$prefix . <span class="stringliteral">&#39;command-specific&#39;</span>], $command);</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;  }</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;  <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;}</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;<span class="keyword">function</span> drush_command_set_command_specific_options($prefix, $command = NULL) {</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;  $command_default_options = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($prefix . <span class="stringliteral">&#39;command-specific&#39;</span>, array());</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;  drush_command_set_command_specific($command_default_options, $command);</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;}</div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;<span class="keyword">function</span> drush_command_set_command_specific($command_default_options, $command = NULL) {</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;  <span class="keywordflow">if</span> (!$command) {</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;    $command = <a class="code" href="context_8inc.html#a8fc57227375a540fea5314b154576354">drush_get_command</a>();</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;  }</div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;  <span class="keywordflow">if</span> ($command) {</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;    <span class="comment">// Look for command-specific options for this command</span></div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    <span class="comment">// keyed both on the command&#39;s primary name, and on each</span></div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    <span class="comment">// of its aliases.</span></div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    $options_were_set = _drush_command_set_default_options($command_default_options, $command[<span class="stringliteral">&#39;command&#39;</span>]);</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    <span class="keywordflow">if</span> (isset($command[<span class="stringliteral">&#39;aliases&#39;</span>]) &amp;&amp; count($command[<span class="stringliteral">&#39;aliases&#39;</span>])) {</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;      <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;aliases&#39;</span>] as $alias) {</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;        $options_were_set += _drush_command_set_default_options($command_default_options, $alias);</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;      }</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;    }</div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;    <span class="comment">// If we set or cleared any options, go back and re-bootstrap any global</span></div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;    <span class="comment">// options such as -y and -v.</span></div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;    <span class="keywordflow">if</span> (!empty($options_were_set)) {</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;      _drush_preflight_global_options();</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;    }</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;    <span class="comment">// If the command uses strict option handling, back out any global</span></div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;    <span class="comment">// options that were set.</span></div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;    <span class="keywordflow">if</span> ($command[<span class="stringliteral">&#39;strict-option-handling&#39;</span>]) {</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;      $global_options = <a class="code" href="drush_8inc.html#acb0a26e79bcbdd1152d59a6916a35aae">drush_get_global_options</a>();</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;      <span class="keywordflow">foreach</span> ($options_were_set as $key) {</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;        <span class="keywordflow">if</span> (array_key_exists($key, $global_options)) {</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;          <span class="keywordflow">if</span> (!array_key_exists(<span class="stringliteral">&#39;context&#39;</span>, $global_options[$key])) {</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;            $strict_options_warning =&amp; <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_STRICT_OPTIONS_WARNING&#39;</span>, array());</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;            <span class="keywordflow">if</span> (!array_key_exists($key, $strict_options_warning)) {</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;              <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Global option --!option not supported in command-specific options for command !command due to a limitation in strict option handling.&quot;</span>, array(<span class="stringliteral">&#39;!option&#39;</span> =&gt; $key, <span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>])), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;              $strict_options_warning[$key] = TRUE;</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;            }</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;          }</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;          <a class="code" href="context_8inc.html#a2d9c3fdcab304aaf56293d3881e98a9a">drush_unset_option</a>($key, <span class="stringliteral">&#39;specific&#39;</span>);</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;        }</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;      }</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;    }</div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;  }</div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;}</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;<span class="keyword">function</span> _drush_command_set_default_options($command_default_options, $command) {</div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;  $options_were_set = array();</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;  <span class="keywordflow">if</span> (array_key_exists($command, $command_default_options)) {</div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;    <span class="keywordflow">foreach</span> ($command_default_options[$command] as $key =&gt; $value) {</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;      <span class="comment">// We set command-specific options in their own context</span></div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;      <span class="comment">// that is higher precedence than the various config file</span></div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;      <span class="comment">// context, but lower than command-line options.</span></div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-&#39;</span> . $key, FALSE)) {</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;        <a class="code" href="context_8inc.html#aa4b55e2f6174c8b6efaa8f23a0f9e0af">drush_set_option</a>($key, $value, <span class="stringliteral">&#39;specific&#39;</span>);</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;        $options_were_set[] = $key;</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;      }</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;    }</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;  }</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;  <span class="keywordflow">return</span> $options_were_set;</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;}</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;<span class="comment"> * Return all of the command-specific options defined in the given</span></div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;<span class="comment"> * options set for the specified command name.  Note that it is valid</span></div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;<span class="comment"> * to use the command name alias rather than the primary command name,</span></div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;<span class="comment"> * both in the parameter to this function, and in the options set.</span></div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01584"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#aed341ec21a59c794b73f7ba031825632"> 1584</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#aed341ec21a59c794b73f7ba031825632">drush_command_get_command_specific_options</a>($options, $command_name, $prefix = <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;  $result = array();</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;  $command_name = <a class="code" href="includes_2command_8inc.html#ada5bfda5bb64c19886f7253e30a58de2">drush_command_normalize_name</a>($command_name);</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;  <span class="keywordflow">if</span> (isset($options[$prefix . <span class="stringliteral">&#39;command-specific&#39;</span>])) {</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;    <span class="keywordflow">foreach</span> ($options[$prefix . <span class="stringliteral">&#39;command-specific&#39;</span>] as $options_for_command =&gt; $values) {</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;      <span class="keywordflow">if</span> ($command_name == <a class="code" href="includes_2command_8inc.html#ada5bfda5bb64c19886f7253e30a58de2">drush_command_normalize_name</a>($options_for_command)) {</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;        $result = array_merge($result, $values);</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;      }</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;    }</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;  }</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;}</div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;<span class="comment"> * Return the original cli args and options, exactly as they</span></div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;<span class="comment"> * appeared on the command line, and in the same order.</span></div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;<span class="comment"> * Any command-specific options that were set will also</span></div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;<span class="comment"> * appear in this list, appended at the very end.</span></div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;<span class="comment"> * The args and options returned are raw, and must be</span></div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;<span class="comment"> * escaped as necessary before use.</span></div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01606"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a272d98da256f7ae2988f3aa7cb6b464b"> 1606</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a272d98da256f7ae2988f3aa7cb6b464b">drush_get_original_cli_args_and_options</a>($command = NULL) {</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;  $args = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_COMMAND_ARGS&#39;</span>, array());</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;  $command_specific_options = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;specific&#39;</span>);</div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;  <span class="keywordflow">if</span> ($command == NULL) {</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;    $command = <a class="code" href="context_8inc.html#a8fc57227375a540fea5314b154576354">drush_get_command</a>();</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;  }</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;  $command_options = ($command == NULL) ? array() : <a class="code" href="group__dispatching.html#ga0edaf347ba975a7743a81eb3d7a4e38c">_drush_get_command_options</a>($command);</div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;  <span class="keywordflow">foreach</span> ($command_specific_options as $key =&gt; $value) {</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;    <span class="keywordflow">if</span> (!array_key_exists($key, $command_options)) {</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;      <span class="keywordflow">if</span> (($value === TRUE) || (!isset($value))) {</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;        $args[] = <span class="stringliteral">&quot;--$key&quot;</span>;</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;      }</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;        $args[] = <span class="stringliteral">&quot;--$key=$value&quot;</span>;</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;      }</div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;    }</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;  }</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;  <span class="keywordflow">return</span> $args;</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;}</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;<span class="comment"> * Determine whether a command file implements a hook.</span></div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;<span class="comment"> * @param $module</span></div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;<span class="comment"> *   The name of the module (without the .module extension).</span></div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;<span class="comment"> * @param $hook</span></div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;<span class="comment"> *   The name of the hook (e.g. &quot;help&quot; or &quot;menu&quot;).</span></div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;<span class="comment"> *   TRUE if the the hook is implemented.</span></div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01636"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a2ce77284c0002dda3a5d0527e583e017"> 1636</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a2ce77284c0002dda3a5d0527e583e017">drush_command_hook</a>($commandfile, $hook) {</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;  <span class="keywordflow">return</span> function_exists($commandfile . <span class="charliteral">&#39;_&#39;</span> . $hook);</div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;}</div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;<span class="comment"> * Check that a command is valid for the current bootstrap phase.</span></div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;<span class="comment"> * @param $command</span></div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;<span class="comment"> *   Command to check. Any errors will be added to the &#39;bootstrap_errors&#39; element.</span></div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;<span class="comment"> *   TRUE if command is valid.</span></div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01649"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a43bed68a16ab6c68384132f83bed87d8"> 1649</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a43bed68a16ab6c68384132f83bed87d8">drush_enforce_requirement_bootstrap_phase</a>(&amp;$command) {</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;  $valid = array();</div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;  $current_phase = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>);</div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;  <span class="keywordflow">if</span> ($command[<span class="stringliteral">&#39;bootstrap&#39;</span>] &lt;= $current_phase) {</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;  }</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;  <span class="comment">// TODO: provide description text for each bootstrap level so we can give</span></div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;  <span class="comment">// the user something more helpful and specific here.</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;  $command[<span class="stringliteral">&#39;bootstrap_errors&#39;</span>][<span class="stringliteral">&#39;DRUSH_COMMAND_INSUFFICIENT_BOOTSTRAP&#39;</span>] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Command !command needs a higher bootstrap level to run - you will need to invoke drush from a more functional Drupal environment to run this command.&#39;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>]));</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;}</div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;<span class="comment"> * Check that a command has its declared drush dependencies available or have no</span></div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;<span class="comment"> * dependencies. Drush dependencies are helpful when a command is invoking</span></div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;<span class="comment"> * another command, or implementing its API.</span></div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;<span class="comment"> * @param $command</span></div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;<span class="comment"> *   Command to check. Any errors  will be added to the &#39;bootstrap_errors&#39; element.</span></div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;<span class="comment"> *   TRUE if dependencies are met.</span></div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01670"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#aecc91d49e1657c1ab4a8b657c2bc54f3"> 1670</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#aecc91d49e1657c1ab4a8b657c2bc54f3">drush_enforce_requirement_drush_dependencies</a>(&amp;$command) {</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;  <span class="comment">// If there are no drush dependencies, then do nothing.</span></div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;  <span class="keywordflow">if</span> (!empty($command[<span class="stringliteral">&#39;drush dependencies&#39;</span>])) {</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    $commandfiles = <a class="code" href="includes_2command_8inc.html#ad51d79509a4a134947703f3e58564444">drush_commandfile_list</a>();</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;    <span class="keywordflow">foreach</span> ($command[<span class="stringliteral">&#39;drush dependencies&#39;</span>] as $dependency) {</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;      <span class="keywordflow">if</span> (!isset($commandfiles[$dependency])) {</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;        $dt_args = array(</div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;          <span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>],</div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;          <span class="stringliteral">&#39;!dependency&#39;</span> =&gt; <span class="stringliteral">&quot;$dependency.drush.inc&quot;</span>,</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;        );</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;        $command[<span class="stringliteral">&#39;bootstrap_errors&#39;</span>][<span class="stringliteral">&#39;DRUSH_COMMANDFILE_DEPENDENCY_ERROR&#39;</span>] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Command !command needs the following drush command file to run: !dependency.&#39;</span>, $dt_args);</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;      }</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;    }</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;  }</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;}</div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;<span class="comment"> * Check that a command is valid for the current major version of core. Handles</span></div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;<span class="comment"> * explicit version numbers and &#39;plus&#39; numbers like 7+ (compatible with 7,8 ...).</span></div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;<span class="comment"> * @param $command</span></div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;<span class="comment"> *   Command to check. Any errors  will be added to the &#39;bootstrap_errors&#39; element.</span></div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;<span class="comment"> *   TRUE if command is valid.</span></div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01698"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#a70fb51b1b660ded588045e6fa4bda385"> 1698</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#a70fb51b1b660ded588045e6fa4bda385">drush_enforce_requirement_core</a>(&amp;$command) {</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;  $major = <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;  <span class="keywordflow">if</span> (!$core = $command[<span class="stringliteral">&#39;core&#39;</span>]) {</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;  }</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;  <span class="keywordflow">foreach</span> ($core as $compat) {</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;    <span class="keywordflow">if</span> ($compat == $major) {</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;      <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;    }</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    elseif (substr($compat, -1) == <span class="charliteral">&#39;+&#39;</span> &amp;&amp; $major &gt;= substr($compat, 0, strlen($compat)-1)) {</div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;      <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;    }</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;  }</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;  $versions = array_pop($core);</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;  <span class="keywordflow">if</span> (!empty($core)) {</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;    $versions = implode(<span class="stringliteral">&#39;, &#39;</span>, $core) . <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39; or &#39;</span>) . $versions;</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;  }</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;  $command[<span class="stringliteral">&#39;bootstrap_errors&#39;</span>][<span class="stringliteral">&#39;DRUSH_COMMAND_CORE_VERSION_ERROR&#39;</span>] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Command !command requires Drupal core version !versions to run.&#39;</span>, array(<span class="stringliteral">&#39;!command&#39;</span> =&gt; $command[<span class="stringliteral">&#39;command&#39;</span>], <span class="stringliteral">&#39;!versions&#39;</span> =&gt; $versions));</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;}</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;<span class="comment"> * Check if a shell alias exists for current request. If so, re-route to</span></div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;<span class="comment"> * core-execute and pass alias value along with rest of CLI arguments.</span></div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01722"></a><span class="lineno"><a class="code" href="includes_2command_8inc.html#af671cda00f17af8bc39ff470a3844bab"> 1722</a></span>&#160;<span class="keyword">function</span> <a class="code" href="includes_2command_8inc.html#af671cda00f17af8bc39ff470a3844bab">drush_shell_alias_replace</a>() {</div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;  $args = <a class="code" href="context_8inc.html#afaf9361f1297f29d10402b075985985a">drush_get_arguments</a>();</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;  $argv = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;argv&#39;</span>);</div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;  $first = current($args);</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;  <span class="comment">// @todo drush_get_option is awkward here.</span></div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;  $shell_aliases = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;shell-aliases&#39;</span>, array());</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;  <span class="keywordflow">if</span> (isset($shell_aliases[$first])) {</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;    <span class="comment">// Shell alias found for first argument in the request.</span></div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    $alias_value = $shell_aliases[$first];</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;    <span class="keywordflow">if</span> (!is_array($alias_value)) {</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;      <span class="comment">// Shell aliases can have embedded variables such as {{@target}} and {{%root}}</span></div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;      <span class="comment">// that are replaced with the name of the target site alias, or the value of a</span></div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;      <span class="comment">// path alias defined in the target site alias record.  We only support replacements</span></div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;      <span class="comment">// when the alias value is a string; if it is already broken out into an array,</span></div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;      <span class="comment">// then the values therein are used literally.</span></div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;      $alias_variables = array( <span class="stringliteral">&#39;{{@target}}&#39;</span> =&gt; <span class="stringliteral">&#39;@none&#39;</span> );</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;      $target_site_alias = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_TARGET_SITE_ALIAS&#39;</span>, FALSE);</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;      <span class="keywordflow">if</span> ($target_site_alias) {</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;        $alias_variables = array( <span class="stringliteral">&#39;{{@target}}&#39;</span> =&gt; $target_site_alias );</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;        $target = <a class="code" href="sitealias_8inc.html#ac2f57b80441374522c4e4cdc3b7e0c2b">drush_sitealias_get_record</a>($target_site_alias);</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;        <span class="keywordflow">foreach</span> ($target as $key =&gt; $value) {</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;          <span class="keywordflow">if</span> (!is_array($value)) {</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;            $alias_variables[<span class="stringliteral">&#39;{{&#39;</span> . $key . <span class="stringliteral">&#39;}}&#39;</span>] = $value;</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;          }</div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;        }</div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;        <span class="keywordflow">if</span> (array_key_exists(<span class="stringliteral">&#39;path-aliases&#39;</span>, $target)) {</div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;          <span class="keywordflow">foreach</span> ($target[<span class="stringliteral">&#39;path-aliases&#39;</span>] as $key =&gt; $value) {</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;            <span class="comment">// n.b. $key will contain something like &quot;%root&quot; or &quot;%files&quot;.</span></div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;            $alias_variables[<span class="stringliteral">&#39;{{&#39;</span> . $key . <span class="stringliteral">&#39;}}&#39;</span>] = $value;</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;          }</div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;        }</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;      }</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;      $alias_value = str_replace(array_keys($alias_variables), array_values($alias_variables), $alias_value);</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;      <span class="comment">// Check for unmatched replacements</span></div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;      $matches = array();</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;      $match_result = preg_match(<span class="stringliteral">&#39;/{{[%@#]*[a-z0-9.]*}}/&#39;</span>, $alias_value, $matches);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;      <span class="keywordflow">if</span> ($match_result) {</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;        $unmatched_replacements = implode(<span class="stringliteral">&#39;, &#39;</span>, $matches);</div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;        $unmatched_replacements = preg_replace(<span class="stringliteral">&#39;/[{}]/&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $unmatched_replacements);</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_SHELL_ALIAS_UNMATCHED_REPLACEMENTS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;The shell alias @alias-name uses replacements &quot;@unmatched&quot;. You must use this command with a site alias (e.g. `drush @myalias @alias-name ...`) that defines all of these variables.&#39;</span>, array(<span class="stringliteral">&#39;@alias-name&#39;</span> =&gt; $first, <span class="stringliteral">&#39;@unmatched&#39;</span> =&gt; $unmatched_replacements)));</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;      }</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;      <span class="comment">// Respect quoting. See http://stackoverflow.com/questions/2202435/php-explode-the-string-but-treat-words-in-quotes-as-a-single-word</span></div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;      $alias_value = str_getcsv($alias_value, <span class="charliteral">&#39; &#39;</span>);</div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;    }</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Shell alias found: !key =&gt; !value&#39;</span>, array(<span class="stringliteral">&#39;!key&#39;</span> =&gt; $first, <span class="stringliteral">&#39;!value&#39;</span> =&gt; implode(<span class="charliteral">&#39; &#39;</span>, $alias_value))), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    $replacement = $alias_value;</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    <span class="keywordflow">if</span> (substr($alias_value[0], 0, 1) == <span class="charliteral">&#39;!&#39;</span>) {</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;      $replacement[0] = ltrim($replacement[0], <span class="charliteral">&#39;!&#39;</span>);</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;      array_unshift($replacement, <span class="stringliteral">&#39;core-execute&#39;</span>);</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    }</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;    $pos = array_search($first, $argv);</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;    array_splice($argv, $pos, 1, $replacement);</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;    <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;argv&#39;</span>, $argv);</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;    <a class="code" href="includes_2command_8inc.html#a5c7d0d064d4cb56bfe2b2311e5643e11">drush_parse_args</a>();</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;    _drush_preflight_global_options();</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;  }</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Oct 8 2014 09:04:54 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>