Drush: commands/pm/pm.drush.inc Source File

  1. 7.x doxygen/html/pm_8drush_8inc_source.html
  2. master doxygen/html/pm_8drush_8inc_source.html
Go to the documentation of this file.
1 <?php
2 
3 /**
4  * @file
5  * The drush Project Manager
6  *
7  * Terminology:
8  * - Request: a requested project (string or keyed array), with a name and (optionally) version.
9  * - Project: a drupal.org project (i.e drupal.org/project/*), such as cck or zen.
10  * - Extension: a drupal.org module, theme or profile.
11  * - Version: a requested version, such as 1.0 or 1.x-dev.
12  * - Release: a specific release of a project, with associated metadata (from the drupal.org update service).
13  */
14 
16 
17 /**
18  * @defgroup update_status_constants Update Status Constants
19  * @{
20  * Represents update status of projects.
21  *
22  * The first set is a mapping of some constants declared in update.module.
23  * We only declare the ones we're interested in.
24  * The rest of the constants are used by pm-updatestatus to represent
25  * a status when the user asked for updates to specific versions or
26  * other circumstances not managed by Drupal.
27  */
28 
29 /**
30  * Project is missing security update(s).
31  *
32  * Maps UPDATE_NOT_SECURE.
33  */
35 
36 /**
37  * Current release has been unpublished and is no longer available.
38  *
39  * Maps UPDATE_REVOKED.
40  */
42 
43 /**
44  * Current release is no longer supported by the project maintainer.
45  *
46  * Maps UPDATE_NOT_SUPPORTED.
47  */
49 
50 /**
51  * Project has a new release available, but it is not a security release.
52  *
53  * Maps UPDATE_NOT_CURRENT.
54  */
56 
57 /**
58  * Project is up to date.
59  *
60  * Maps UPDATE_CURRENT.
61  */
63 
64 /**
65  * Project's status cannot be checked.
66  *
67  * Maps UPDATE_NOT_CHECKED.
68  */
70 
71 /**
72  * No available update data was found for project.
73  *
74  * Maps UPDATE_UNKNOWN.
75  */
77 
78 /**
79  * There was a failure fetching available update data for this project.
80  *
81  * Maps UPDATE_NOT_FETCHED.
82  */
84 
85 /**
86  * We need to (re)fetch available update data for this project.
87  *
88  * Maps UPDATE_FETCH_PENDING.
89  */
91 
92 /**
93  * Project was not packaged by drupal.org.
94  */
96 
97 /**
98  * Requested project is not updateable.
99  */
101 
102 /**
103  * Requested project not found.
104  */
106 
107 /**
108  * Requested version not found.
109  */
111 
112 /**
113  * Requested version available.
114  */
116 
117 /**
118  * Requested version already installed.
119  */
121 
122 /**
123  * @} End of "defgroup update_status_constants".
124  */
125 
126 /**
127  * Implementation of hook_drush_help().
128  */
129 function pm_drush_help($section) {
130  switch ($section) {
131  case 'meta:pm:title':
132  return dt('Project manager commands');
133  case 'meta:pm:summary':
134  return dt('Download, enable, examine and update your modules and themes.');
135  case 'drush:pm-enable':
136  return dt('Enable one or more extensions (modules or themes). Enable dependant extensions as well.');
137  case 'drush:pm-disable':
138  return dt('Disable one or more extensions (modules or themes). Disable dependant extensions as well.');
139  case 'drush:pm-updatecode':
140  case 'drush:pm-update':
141  $message = dt("Display available update information for Drupal core and all enabled projects and allow updating to latest recommended releases.");
142  if ($section == 'drush:pm-update') {
143  $message .= ' '.dt("Also apply any database updates required (same as pm-updatecode + updatedb).");
144  }
145  $message .= ' '.dt("Note: The user is asked to confirm before the actual update. Backups are performed unless directory is already under version control. Updated projects can potentially break your site. It is NOT recommended to update production sites without prior testing.");
146  return $message;
147  case 'drush:pm-updatecode-postupdate':
148  return dt("This is a helper command needed by updatecode. It is used to check for db updates in a backend process after code updated have been performed. We need to run this task in a separate process to not conflict with old code already in memory.");
149  case 'drush:pm-download':
150  return dt("Download Drupal core or projects from drupal.org (Drupal core, modules, themes or profiles) and other sources. It will automatically figure out which project version you want based on its recommended release, or you may specify a particular version.
151 
152 If no --destination is provided, then destination depends on the project type:
153  - Profiles will be downloaded to profiles/ in your Drupal root.
154  - Modules and themes will be downloaded to the site specific directory (sites/example.com/modules|themes) if available, or to the site wide directory otherwise.
155  - If you're downloading drupal core or you are not running the command within a bootstrapped drupal site, the default location is the current directory.
156  - Drush commands will be relocated to @site_wide_location (if available) or ~/.drush. Relocation is determined once the project is downloaded by examining its content. Note you can provide your own function in a commandfile to determine the relocation of any project.", array('@site_wide_location' => drush_get_context('DRUSH_SITE_WIDE_COMMANDFILES')));
157  }
158 }
159 
160 /**
161  * Implementation of hook_drush_command().
162  */
163 function pm_drush_command() {
164  $update_options = array(
165  'lock' => array(
166  'description' => 'Add a persistent lock to remove the specified projects from consideration during updates. Locks may be removed with the --unlock parameter, or overridden by specifically naming the project as a parameter to pm-update or pm-updatecode. The lock does not affect pm-download. See also the update_advanced project for similar and improved functionality.',
167  'example-value' => 'foo,bar',
168  ),
169  );
170  $update_suboptions = array(
171  'lock' => array(
172  'lock-message' => array(
173  'description' => 'A brief message explaining why a project is being locked; displayed during pm-updatecode. Optional.',
174  'example-value' => 'message',
175  ),
176  'unlock' => array(
177  'description' => 'Remove the persistent lock from the specified projects so that they may be updated again.',
178  'example-value' => 'foo,bar',
179  ),
180  ),
181  );
182 
183  $items['pm-enable'] = array(
184  'description' => 'Enable one or more extensions (modules or themes).',
185  'arguments' => array(
186  'extensions' => 'A list of modules or themes. You can use the * wildcard at the end of extension names to enable all matches.',
187  ),
188  'options' => array(
189  'resolve-dependencies' => 'Attempt to download any missing dependencies. At the moment, only works when the module name is the same as the project name.',
190  'skip' => 'Skip automatic downloading of libraries (c.f. devel).',
191  ),
192  'aliases' => array('en'),
193  'engines' => array(
194  'release_info' => array(
195  'add-options-to-command' => FALSE,
196  ),
197  ),
198  );
199  $items['pm-disable'] = array(
200  'description' => 'Disable one or more extensions (modules or themes).',
201  'arguments' => array(
202  'extensions' => 'A list of modules or themes. You can use the * wildcard at the end of extension names to disable multiple matches.',
203  ),
204  'aliases' => array('dis'),
205  'engines' => array(
206  'version_control',
207  'package_handler',
208  'release_info' => array(
209  'add-options-to-command' => FALSE,
210  ),
211  ),
212  );
213  $items['pm-info'] = array(
214  'description' => 'Show detailed info for one or more extensions (modules or themes).',
215  'arguments' => array(
216  'extensions' => 'A list of modules or themes. You can use the * wildcard at the end of extension names to show info for multiple matches. If no argument is provided it will show info for all available extensions.',
217  ),
218  'aliases' => array('pmi'),
219  'outputformat' => array(
220  'default' => 'key-value-list',
221  'pipe-format' => 'json',
222  'formatted-filter' => '_drush_pm_info_format_table_data',
223  'field-labels' => array(
224  'extension' => 'Extension',
225  'project' => 'Project',
226  'type' => 'Type',
227  'title' => 'Title',
228  'description' => 'Description',
229  'version' => 'Version',
230  'date' => 'Date',
231  'package' => 'Package',
232  'core' => 'Core',
233  'php' => 'PHP',
234  'status' => 'Status',
235  'path' => 'Path',
236  'schema_version' => 'Schema version',
237  'files' => 'Files',
238  'requires' => 'Requires',
239  'required_by' => 'Required by',
240  'permissions' => 'Permissions',
241  'config' => 'Configure',
242  'engine' => 'Engine',
243  'base_theme' => 'Base theme',
244  'regions' => 'Regions',
245  'features' => 'Features',
246  'stylesheets' => 'Stylesheets',
247  // 'media_' . $media => 'Media '. $media for each $info->info['stylesheets'] as $media => $files
248  'scripts' => 'Scripts',
249  ),
250  'output-data-type' => 'format-table',
251  ),
252  );
253 
254  $items['pm-projectinfo'] = array(
255  'description' => 'Show a report of available projects and their extensions.',
256  'arguments' => array(
257  'projects' => 'Optional. A list of installed projects to show.',
258  ),
259  'options' => array(
260  'drush' => 'Optional. Only incude projects that have one or more Drush commands.',
261  'status' => array(
262  'description' => 'Filter by project status. Choices: enabled, disabled. A project is considered enabled when at least one of its extensions is enabled.',
263  'example-value' => 'enabled',
264  ),
265  ),
266  'outputformat' => array(
267  'default' => 'key-value-list',
268  'pipe-format' => 'json',
269  'field-labels' => array(
270  'label' => 'Name',
271  'type' => 'Type',
272  'version' => 'Version',
273  'status' => 'Status',
274  'extensions' => 'Extensions',
275  'drush' => 'Drush Commands',
276  'datestamp' => 'Datestamp',
277  'path' => 'Path',
278  ),
279  'fields-default' => array('label', 'type', 'version', 'status', 'extensions', 'drush', 'datestamp', 'path'),
280  'fields-pipe' => array('label'),
281  'output-data-type' => 'format-table',
282  ),
283  'aliases' => array('pmpi'),
284  );
285 
286  // Install command is reserved for the download and enable of projects including dependencies.
287  // @see http://drupal.org/node/112692 for more information.
288  // $items['install'] = array(
289  // 'description' => 'Download and enable one or more modules',
290  // );
291  $items['pm-uninstall'] = array(
292  'description' => 'Uninstall one or more modules.',
293  'arguments' => array(
294  'modules' => 'A list of modules.',
295  ),
296  'aliases' => array('pmu'),
297  );
298  $items['pm-list'] = array(
299  'description' => 'Show a list of available extensions (modules and themes).',
300  'callback arguments' => array(array(), FALSE),
301  'options' => array(
302  'type' => array(
303  'description' => 'Filter by extension type. Choices: module, theme.',
304  'example-value' => 'module',
305  ),
306  'status' => array(
307  'description' => 'Filter by extension status. Choices: enabled, disabled and/or \'not installed\'. You can use multiple comma separated values. (i.e. --status="disabled,not installed").',
308  'example-value' => 'disabled',
309  ),
310  'package' => 'Filter by project packages. You can use multiple comma separated values. (i.e. --package="Core - required,Other").',
311  'core' => 'Filter out extensions that are not in drupal core.',
312  'no-core' => 'Filter out extensions that are provided by drupal core.',
313  ),
314  'outputformat' => array(
315  'default' => 'table',
316  'pipe-format' => 'list',
317  'field-labels' => array('package' => 'Package', 'name' => 'Name', 'type' => 'Type', 'status' => 'Status', 'version' => 'Version'),
318  'output-data-type' => 'format-table',
319  ),
320  'aliases' => array('pml'),
321  );
322  $items['pm-refresh'] = array(
323  'description' => 'Refresh update status information.',
324  'engines' => array(
325  'update_status' => array(
326  'add-options-to-command' => FALSE,
327  ),
328  ),
329  'aliases' => array('rf'),
330  );
331  $items['pm-updatestatus'] = array(
332  'description' => 'Show a report of available minor updates to Drupal core and contrib projects.',
333  'arguments' => array(
334  'projects' => 'Optional. A list of installed projects to show.',
335  ),
336  'options' => array(
337  'pipe' => 'Return a list of the projects with any extensions enabled that need updating, one project per line.',
338  ) + $update_options,
339  'sub-options' => $update_suboptions,
340  'engines' => array(
341  'update_status',
342  ),
343  'outputformat' => array(
344  'default' => 'table',
345  'pipe-format' => 'list',
346  'field-labels' => array('name' => 'Short Name', 'label' => 'Name', 'existing_version' => 'Installed Version', 'status' => 'Status', 'status_msg' => 'Message', 'candidate_version' => 'Proposed version'),
347  'fields-default' => array('label', 'existing_version', 'candidate_version', 'status_msg' ),
348  'fields-pipe' => array('name', 'existing_version', 'candidate_version', 'status_msg'),
349  'output-data-type' => 'format-table',
350  ),
351  'aliases' => array('ups'),
352  );
353  $items['pm-updatecode'] = array(
354  'description' => 'Update Drupal core and contrib projects to latest recommended releases.',
355  'examples' => array(
356  'drush pm-updatecode --no-core' => 'Update contrib projects, but skip core.',
357  'drush pm-updatestatus --format=csv --list-separator=" " --fields="name,existing_version,candidate_version,status_msg"' => 'To show a list of projects with their update status, use pm-updatestatus instead of pm-updatecode.',
358  ),
359  'arguments' => array(
360  'projects' => 'Optional. A list of installed projects to update.',
361  ),
362  'options' => array(
363  'notes' => 'Show release notes for each project to be updated.',
364  'no-core' => 'Only update modules and skip the core update.',
365  'check-updatedb' => 'Check to see if an updatedb is needed after updating the code. Default is on; use --check-updatedb=0 to disable.',
366  ) + $update_options,
367  'sub-options' => $update_suboptions,
368  'aliases' => array('upc'),
369  'topics' => array('docs-policy'),
370  'engines' => array(
371  'version_control',
372  'package_handler',
373  'release_info' => array(
374  'add-options-to-command' => FALSE,
375  ),
376  'update_status',
377  ),
378  );
379  // Merge all items from above.
380  $items['pm-update'] = array(
381  'description' => 'Update Drupal core and contrib projects and apply any pending database updates (Same as pm-updatecode + updatedb).',
382  'aliases' => array('up'),
383  'allow-additional-options' => array('pm-updatecode', 'updatedb'),
384  );
385  $items['pm-updatecode-postupdate'] = array(
386  'description' => 'Notify of pending db updates.',
387  'hidden' => TRUE,
388  );
389  $items['pm-releasenotes'] = array(
390  'description' => 'Print release notes for given projects.',
391  'arguments' => array(
392  'projects' => 'A list of project names, with optional version. Defaults to \'drupal\'',
393  ),
394  'options' => array(
395  'html' => dt('Display release notes in HTML rather than plain text.'),
396  ),
397  'examples' => array(
398  'drush rln cck' => 'Prints the release notes for the recommended version of CCK project.',
399  'drush rln token-1.13' => 'View release notes of a specfic version of the Token project for my version of Drupal.',
400  'drush rln pathauto zen' => 'View release notes for the recommended version of Pathauto and Zen projects.',
401  ),
402  'aliases' => array('rln'),
403  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
404  'engines' => array(
405  'release_info',
406  ),
407  );
408  $items['pm-releases'] = array(
409  'description' => 'Print release information for given projects.',
410  'arguments' => array(
411  'projects' => 'A list of drupal.org project names. Defaults to \'drupal\'',
412  ),
413  'examples' => array(
414  'drush pm-releases cck zen' => 'View releases for cck and Zen projects for your Drupal version.',
415  ),
416  'options' => array(
417  'default-major' => 'Show releases compatible with the specified major version of Drupal.',
418  ),
419  'aliases' => array('rl'),
420  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
421  'outputformat' => array(
422  'default' => 'table',
423  'pipe-format' => 'csv',
424  'field-labels' => array(
425  'project' => 'Project',
426  'version' => 'Release',
427  'date' => 'Date',
428  'status' => 'Status',
429  'release_link' => 'Release link',
430  'download_link' => 'Download link',
431  ),
432  'fields-default' => array('project', 'version', 'date', 'status'),
433  'fields-pipe' => array('project', 'version', 'date', 'status'),
434  'output-data-type' => 'format-table',
435  ),
436  'engines' => array(
437  'release_info',
438  ),
439  );
440  $items['pm-download'] = array(
441  'description' => 'Download projects from drupal.org or other sources.',
442  'examples' => array(
443  'drush dl drupal' => 'Download latest recommended release of Drupal core.',
444  'drush dl drupal-7.x' => 'Download latest 7.x development version of Drupal core.',
445  'drush dl drupal-6' => 'Download latest recommended release of Drupal 6.x.',
446  'drush dl cck zen' => 'Download latest versions of CCK and Zen projects.',
447  'drush dl og-1.3' => 'Download a specfic version of Organic groups module for my version of Drupal.',
448  'drush dl diff-6.x-2.x' => 'Download a specific development branch of diff module for a specific Drupal version.',
449  'drush dl views --select' => 'Show a list of recent releases of the views project, prompt for which one to download.',
450  'drush dl webform --dev' => 'Download the latest dev release of webform.',
451  'drush dl webform --cache' => 'Download webform. Fetch and populate the download cache as needed.',
452  ),
453  'arguments' => array(
454  'projects' => 'A comma delimited list of drupal.org project names, with optional version. Defaults to \'drupal\'',
455  ),
456  'options' => array(
457  'destination' => array(
458  'description' => 'Path to which the project will be copied. If you\'re providing a relative path, note it is relative to the drupal root (if bootstrapped).',
459  'example-value' => 'path',
460  ),
461  'use-site-dir' => 'Force to use the site specific directory. It will create the directory if it doesn\'t exist. If --destination is also present this option will be ignored.',
462  'notes' => 'Show release notes after each project is downloaded.',
463  'variant' => array(
464  'description' => "Only useful for install profiles. Possible values: 'full', 'projects', 'profile-only'.",
465  'example-value' => 'full',
466  ),
467  'select' => "Select the version to download interactively from a list of available releases.",
468  'drupal-project-rename' => 'Alternate name for "drupal-x.y" directory when downloading Drupal project. Defaults to "drupal".',
469  'default-major' => array(
470  'description' => 'Specify the default major version of modules to download when there is no bootstrapped Drupal site. Defaults to "8".',
471  'example-value' => '7',
472  ),
473  'skip' => 'Skip automatic downloading of libraries (c.f. devel).',
474  'pipe' => 'Returns a list of the names of the extensions (modules and themes) contained in the downloaded projects.',
475  ),
476  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
477  'aliases' => array('dl'),
478  'engines' => array(
479  'version_control',
480  'package_handler',
481  'release_info',
482  ),
483  );
484  return $items;
485 }
486 
487 /**
488  * @defgroup extensions Extensions management.
489  * @{
490  * Functions to manage extensions.
491  */
492 
493 /**
494  * Command argument complete callback.
495  */
497  return pm_complete_extensions();
498 }
499 
500 /**
501  * Command argument complete callback.
502  */
504  return pm_complete_extensions();
505 }
506 
507 /**
508  * Command argument complete callback.
509  */
511  return pm_complete_extensions();
512 }
513 
514 /**
515  * Command argument complete callback.
516  */
518  return pm_complete_extensions();
519 }
520 
521 /**
522  * Command argument complete callback.
523  */
525  return pm_complete_projects();
526 }
527 
528 /**
529  * Command argument complete callback.
530  */
532  return pm_complete_projects();
533 }
534 
535 /**
536  * Command argument complete callback.
537  */
539  return pm_complete_projects();
540 }
541 
542 /**
543  * Command argument complete callback.
544  */
546  return pm_complete_projects();
547 }
548 
549 /**
550  * List extensions for completion.
551  *
552  * @return
553  * Array of available extensions.
554  */
557  $extension_info = drush_get_extensions(FALSE);
558  return array('values' => array_keys($extension_info));
559  }
560 }
561 
562 /**
563  * List projects for completion.
564  *
565  * @return
566  * Array of installed projects.
567  */
570  return array('values' => array_keys(drush_get_projects()));
571  }
572 }
573 
574 /**
575  * Sort callback function for sorting extensions.
576  *
577  * It will sort first by type, second by package and third by name.
578  */
579 function _drush_pm_sort_extensions($a, $b) {
580  $a_type = drush_extension_get_type($a);
581  $b_type = drush_extension_get_type($b);
582  if ($a_type == 'module' && $b_type == 'theme') {
583  return -1;
584  }
585  if ($a_type == 'theme' && $b_type == 'module') {
586  return 1;
587  }
588  $cmp = strcasecmp($a->info['package'], $b->info['package']);
589  if ($cmp == 0) {
590  $cmp = strcasecmp($a->info['name'], $b->info['name']);
591  }
592  return $cmp;
593 }
594 
595 /**
596  * Calculate an extension status based on current status and schema version.
597  *
598  * @param $extension
599  * Object of a single extension info.
600  *
601  * @return
602  * String describing extension status. Values: enabled|disabled|not installed
603  */
604 function drush_get_extension_status($extension) {
605  if ((drush_extension_get_type($extension) == 'module') && ($extension->schema_version == -1)) {
606  $status = "not installed";
607  }
608  else {
609  $status = ($extension->status == 1)?'enabled':'disabled';
610  }
611 
612  return $status;
613 }
614 
615 /**
616  * Classify extensions as modules, themes or unknown.
617  *
618  * @param $extensions
619  * Array of extension names, by reference.
620  * @param $modules
621  * Empty array to be filled with modules in the provided extension list.
622  * @param $themes
623  * Empty array to be filled with themes in the provided extension list.
624  */
625 function drush_pm_classify_extensions(&$extensions, &$modules, &$themes, $extension_info) {
626  _drush_pm_expand_extensions($extensions, $extension_info);
627  foreach ($extensions as $extension) {
628  if (!isset($extension_info[$extension])) {
629  continue;
630  }
631  $type = drush_extension_get_type($extension_info[$extension]);
632  if ($type == 'module') {
633  $modules[$extension] = $extension;
634  }
635  else if ($type == 'theme') {
636  $themes[$extension] = $extension;
637  }
638  }
639 }
640 
641 /**
642  * Obtain an array of installed projects off the extensions available.
643  *
644  * A project is considered to be 'enabled' when any of its extensions is
645  * enabled.
646  * If any extension lacks project information and it is found that the
647  * extension was obtained from drupal.org's cvs or git repositories, a new
648  * 'vcs' attribute will be set on the extension. Example:
649  * $extensions[name]->vcs = 'cvs';
650  *
651  * @param array $extensions
652  * Array of extensions as returned by drush_get_extensions().
653  *
654  * @return
655  * Array of installed projects with info of version, status and provided
656  * extensions.
657  */
658 function drush_get_projects(&$extensions = NULL) {
659  if (!isset($extensions)) {
660  $extensions = drush_get_extensions();
661  }
662  $projects = array(
663  'drupal' => array(
664  'label' => 'Drupal',
665  'version' => drush_drupal_version(),
666  'type' => 'core',
667  'extensions' => array(),
668  )
669  );
670  if (isset($extensions['system']->info['datestamp'])) {
671  $projects['drupal']['datestamp'] = $extensions['system']->info['datestamp'];
672  }
673  foreach ($extensions as $extension) {
674  $extension_name = drush_extension_get_name($extension);
675  $extension_path = drush_extension_get_path($extension);
676 
677  // Obtain the project name. It is not available in this cases:
678  // 1. the extension is part of drupal core.
679  // 2. the project was checked out from CVS/git and cvs_deploy/git_deploy
680  // is not installed.
681  // 3. it is not a project hosted in drupal.org.
682  if (empty($extension->info['project'])) {
683  if (isset($extension->info['version']) && ($extension->info['version'] == drush_drupal_version())) {
684  $project = 'drupal';
685  }
686  else {
687  if (is_dir($extension_path . '/CVS') && (!drush_module_exists('cvs_deploy'))) {
688  $extension->vcs = 'cvs';
689  drush_log(dt('Extension !extension is fetched from cvs. Ignoring.', array('!extension' => $extension_name)), LogLevel::DEBUG);
690  }
691  elseif (is_dir($extension_path . '/.git') && (!drush_module_exists('git_deploy'))) {
692  $extension->vcs = 'git';
693  drush_log(dt('Extension !extension is fetched from git. Ignoring.', array('!extension' => $extension_name)), LogLevel::DEBUG);
694  }
695  continue;
696  }
697  }
698  else {
699  $project = $extension->info['project'];
700  }
701 
702  // Create/update the project in $projects with the project data.
703  if (!isset($projects[$project])) {
704  $projects[$project] = array(
705  // If there's an extension with matching name, pick its label.
706  // Otherwise use just the project name. We avoid $extension->label
707  // for the project label because the extension's label may have
708  // no direct relation with the project name. For example,
709  // "Text (text)" or "Number (number)" for the CCK project.
710  'label' => isset($extensions[$project]) ? $extensions[$project]->label : $project,
711  'type' => drush_extension_get_type($extension),
712  'version' => $extension->info['version'],
713  'status' => $extension->status,
714  'extensions' => array(),
715  );
716  if (isset($extension->info['datestamp'])) {
717  $projects[$project]['datestamp'] = $extension->info['datestamp'];
718  }
719  if (isset($extension->info['project status url'])) {
720  $projects[$project]['status url'] = $extension->info['project status url'];
721  }
722  }
723  else {
724  // If any of the extensions is enabled, consider the project is enabled.
725  if ($extension->status != 0) {
726  $projects[$project]['status'] = $extension->status;
727  }
728  }
729  $projects[$project]['extensions'][] = drush_extension_get_name($extension);
730  }
731 
732  // Obtain each project's path and try to provide a better label for ones
733  // with machine name.
734  $reserved = array('modules', 'sites', 'themes');
735  foreach ($projects as $name => $project) {
736  if ($name == 'drupal') {
737  continue;
738  }
739 
740  // If this project has no human label, see if we can find
741  // one "main" extension whose label we could use.
742  if ($project['label'] == $name) {
743  // If there is only one extension, construct a label based on
744  // the extension name.
745  if (count($project['extensions']) == 1) {
746  $extension = $extensions[$project['extensions'][0]];
747  $projects[$name]['label'] = $extension->info['name'] . ' (' . $name . ')';
748  }
749  else {
750  // Make a list of all of the extensions in this project
751  // that do not depend on any other extension in this
752  // project.
753  $candidates = array();
754  foreach ($project['extensions'] as $e) {
755  $has_project_dependency = FALSE;
756  if (isset($extensions[$e]->info['dependencies']) && is_array($extensions[$e]->info['dependencies'])) {
757  foreach ($extensions[$e]->info['dependencies'] as $dependent) {
758  if (in_array($dependent, $project['extensions'])) {
759  $has_project_dependency = TRUE;
760  }
761  }
762  }
763  if ($has_project_dependency === FALSE) {
764  $candidates[] = $extensions[$e]->info['name'];
765  }
766  }
767  // If only one of the modules is a candidate, use its name in the label
768  if (count($candidates) == 1) {
769  $projects[$name]['label'] = reset($candidates) . ' (' . $name . ')';
770  }
771  }
772  }
773 
774  drush_log(dt('Obtaining !project project path.', array('!project' => $name)), LogLevel::DEBUG);
775  $path = _drush_pm_find_common_path($project['type'], $project['extensions']);
776  // Prevent from setting a reserved path. For example it may happen in a case
777  // where a module and a theme are declared as part of a same project.
778  // There's a special case, a project called "sites", this is the reason for
779  // the second condition here.
780  if ($path == '.' || (in_array(basename($path), $reserved) && !in_array($name, $reserved))) {
781  drush_log(dt('Error while trying to find the common path for enabled extensions of project !project. Extensions are: !extensions.', array('!project' => $name, '!extensions' => implode(', ', $project['extensions']))), LogLevel::ERROR);
782  }
783  else {
784  $projects[$name]['path'] = $path;
785  }
786  }
787 
788  return $projects;
789 }
790 
791 /**
792  * Helper function to find the common path for a list of extensions in the aim to obtain the project name.
793  *
794  * @param $project_type
795  * Type of project we're trying to find. Valid values: module, theme.
796  * @param $extensions
797  * Array of extension names.
798  */
799 function _drush_pm_find_common_path($project_type, $extensions) {
800  // Select the first path as the candidate to be the common prefix.
801  $extension = array_pop($extensions);
802  while (!($path = drupal_get_path($project_type, $extension))) {
803  drush_log(dt('Unknown path for !extension !type.', array('!extension' => $extension, '!type' => $project_type)), LogLevel::WARNING);
804  $extension = array_pop($extensions);
805  }
806 
807  // If there's only one extension we are done. Otherwise, we need to find
808  // the common prefix for all of them.
809  if (count($extensions) > 0) {
810  // Iterate over the other projects.
811  while($extension = array_pop($extensions)) {
812  $path2 = drupal_get_path($project_type, $extension);
813  if (!$path2) {
814  drush_log(dt('Unknown path for !extension !type.', array('!extension' => $extension, '!type' => $project_type)), LogLevel::DEBUG);
815  continue;
816  }
817  // Option 1: same path.
818  if ($path == $path2) {
819  continue;
820  }
821  // Option 2: $path is a prefix of $path2.
822  if (strpos($path2, $path) === 0) {
823  continue;
824  }
825  // Option 3: $path2 is a prefix of $path.
826  if (strpos($path, $path2) === 0) {
827  $path = $path2;
828  continue;
829  }
830  // Option 4: no one is a prefix of the other. Find the common
831  // prefix by iteratively strip the rigthtmost piece of $path.
832  // We will iterate until a prefix is found or path = '.', that on the
833  // other hand is a condition theorically impossible to reach.
834  do {
835  $path = dirname($path);
836  if (strpos($path2, $path) === 0) {
837  break;
838  }
839  } while ($path != '.');
840  }
841  }
842 
843  return $path;
844 }
845 
846 /**
847  * @} End of "defgroup extensions".
848  */
849 
850 /**
851  * Command callback. Show a list of extensions with type and status.
852  */
853 function drush_pm_list() {
854  //--package
855  $package_filter = array();
856  $package = strtolower(drush_get_option('package'));
857  if (!empty($package)) {
858  $package_filter = explode(',', $package);
859  }
860  if (!empty($package_filter) && (count($package_filter) == 1)) {
861  drush_hide_output_fields('package');
862  }
863 
864  //--type
865  $all_types = array('module', 'theme');
866  $type_filter = strtolower(drush_get_option('type'));
867  if (!empty($type_filter)) {
868  $type_filter = explode(',', $type_filter);
869  }
870  else {
871  $type_filter = $all_types;
872  }
873 
874  if (count($type_filter) == 1) {
875  drush_hide_output_fields('type');
876  }
877  foreach ($type_filter as $type) {
878  if (!in_array($type, $all_types)) { //TODO: this kind of check can be implemented drush-wide
879  return drush_set_error('DRUSH_PM_INVALID_PROJECT_TYPE', dt('!type is not a valid project type.', array('!type' => $type)));
880  }
881  }
882 
883  //--status
884  $all_status = array('enabled', 'disabled', 'not installed');
885  $status_filter = strtolower(drush_get_option('status'));
886  if (!empty($status_filter)) {
887  $status_filter = explode(',', $status_filter);
888  }
889  else {
890  $status_filter = $all_status;
891  }
892  if (count($status_filter) == 1) {
893  drush_hide_output_fields('status');
894  }
895 
896  foreach ($status_filter as $status) {
897  if (!in_array($status, $all_status)) { //TODO: this kind of check can be implemented drush-wide
898  return drush_set_error('DRUSH_PM_INVALID_PROJECT_STATUS', dt('!status is not a valid project status.', array('!status' => $status)));
899  }
900  }
901 
902  $result = array();
903  $extension_info = drush_get_extensions(FALSE);
904  uasort($extension_info, '_drush_pm_sort_extensions');
905 
906  $major_version = drush_drupal_major_version();
907  foreach ($extension_info as $key => $extension) {
908  if (!in_array(drush_extension_get_type($extension), $type_filter)) {
909  unset($extension_info[$key]);
910  continue;
911  }
912  $status = drush_get_extension_status($extension);
913  if (!in_array($status, $status_filter)) {
914  unset($extension_info[$key]);
915  continue;
916  }
917 
918  // Filter out core if --no-core specified.
919  if (drush_get_option('no-core', FALSE)) {
920  if ((($major_version >= 8) && ($extension->origin == 'core')) || (($major_version <= 7) && (strpos($extension->info['package'], 'Core') === 0))) {
921  unset($extension_info[$key]);
922  continue;
923  }
924  }
925 
926  // Filter out non-core if --core specified.
927  if (drush_get_option('core', FALSE)) {
928  if ((($major_version >= 8) && ($extension->origin != 'core')) || (($major_version <= 7) && (strpos($extension->info['package'], 'Core') !== 0))) {
929  unset($extension_info[$key]);
930  continue;
931  }
932  }
933 
934  // Filter by package.
935  if (!empty($package_filter)) {
936  if (!in_array(strtolower($extension->info['package']), $package_filter)) {
937  unset($extension_info[$key]);
938  continue;
939  }
940  }
941 
942  $row['package'] = $extension->info['package'];
943  $row['name'] = $extension->label;
944  $row['type'] = ucfirst(drush_extension_get_type($extension));
945  $row['status'] = ucfirst($status);
946  // Suppress notice when version is not present.
947  $row['version'] = @$extension->info['version'];
948 
949  $result[$key] = $row;
950  unset($row);
951  }
952  // In Drush-5, we used to return $extension_info here.
953  return $result;
954 }
955 
956 /**
957  * Helper function for pm-enable.
958  */
960  $result = drush_pm_lookup_extension_in_cache($extension);
961 
962  if (!isset($result)) {
963  $release_info = drush_get_engine('release_info');
964 
965  // If we can find info on a project that has the same name
966  // as the requested extension, then we'll call that a match.
967  $request = pm_parse_request($extension);
968  if ($release_info->checkProject($request)) {
969  $result = $extension;
970  }
971  }
972 
973  return $result;
974 }
975 
976 /**
977  * Validate callback. Determine the modules and themes that the user would like enabled.
978  */
981 
982  $extension_info = drush_get_extensions();
983 
984  $recheck = TRUE;
985  while ($recheck) {
986  $recheck = FALSE;
987 
988  // Classify $args in themes, modules or unknown.
989  $modules = array();
990  $themes = array();
991  $download = array();
992  drush_pm_classify_extensions($args, $modules, $themes, $extension_info);
993  $extensions = array_merge($modules, $themes);
994  $unknown = array_diff($args, $extensions);
995 
996  // If there're unknown extensions, try and download projects
997  // with matching names.
998  if (!empty($unknown)) {
999  $found = array();
1000  foreach ($unknown as $name) {
1001  drush_log(dt('!extension was not found.', array('!extension' => $name)), LogLevel::WARNING);
1003  if (!empty($project)) {
1004  $found[] = $project;
1005  }
1006  }
1007  if (!empty($found)) {
1008  drush_log(dt("The following projects provide some or all of the extensions not found:\n@list", array('@list' => implode("\n", $found))), LogLevel::OK);
1009  if (drush_get_option('resolve-dependencies')) {
1010  drush_log(dt("They are being downloaded."), LogLevel::OK);
1011  }
1012  if ((drush_get_option('resolve-dependencies')) || (drush_confirm("Would you like to download them?"))) {
1013  $download = $found;
1014  }
1015  }
1016  }
1017 
1018  // Discard already enabled and incompatible extensions.
1019  foreach ($extensions as $name) {
1020  if ($extension_info[$name]->status) {
1021  drush_log(dt('!extension is already enabled.', array('!extension' => $name)), LogLevel::OK);
1022  }
1023  // Check if the extension is compatible with Drupal core and php version.
1024  if ($component = drush_extension_check_incompatibility($extension_info[$name])) {
1025  drush_set_error('DRUSH_PM_ENABLE_MODULE_INCOMPATIBLE', dt('!name is incompatible with the !component version.', array('!name' => $name, '!component' => $component)));
1026  if (drush_extension_get_type($extension_info[$name]) == 'module') {
1027  unset($modules[$name]);
1028  }
1029  else {
1030  unset($themes[$name]);
1031  }
1032  }
1033  }
1034 
1035  if (!empty($modules)) {
1036  // Check module dependencies.
1037  $dependencies = drush_check_module_dependencies($modules, $extension_info);
1038  $unmet_dependencies = array();
1039  foreach ($dependencies as $module => $info) {
1040  if (!empty($info['unmet-dependencies'])) {
1041  foreach ($info['unmet-dependencies'] as $unmet) {
1042  $unmet_project = (!empty($info['dependencies'][$unmet]['project'])) ? $info['dependencies'][$unmet]['project'] : drush_pm_enable_find_project_from_extension($unmet);
1043  if (!empty($unmet_project)) {
1044  $unmet_dependencies[$module][$unmet_project] = $unmet_project;
1045  }
1046  }
1047  }
1048  }
1049  if (!empty($unmet_dependencies)) {
1050  $msgs = array();
1051  $unmet_project_list = array();
1052  foreach ($unmet_dependencies as $module => $unmet_projects) {
1053  $unmet_project_list = array_merge($unmet_project_list, $unmet_projects);
1054  $msgs[] = dt("!module requires !unmet-projects", array('!unmet-projects' => implode(', ', $unmet_projects), '!module' => $module));
1055  }
1056  drush_log(dt("The following projects have unmet dependencies:\n!list", array('!list' => implode("\n", $msgs))), LogLevel::OK);
1057  if (drush_get_option('resolve-dependencies')) {
1058  drush_log(dt("They are being downloaded."), LogLevel::OK);
1059  }
1060  if (drush_get_option('resolve-dependencies') || drush_confirm(dt("Would you like to download them?"))) {
1061  $download = array_merge($download, $unmet_project_list);
1062  }
1063  }
1064  }
1065 
1066  if (!empty($download)) {
1067  // Disable DRUSH_AFFIRMATIVE context temporarily.
1068  $drush_affirmative = drush_get_context('DRUSH_AFFIRMATIVE');
1069  drush_set_context('DRUSH_AFFIRMATIVE', FALSE);
1070  // Invoke a new process to download dependencies.
1071  $result = drush_invoke_process('@self', 'pm-download', $download, array(), array('interactive' => TRUE));
1072  // Restore DRUSH_AFFIRMATIVE context.
1073  drush_set_context('DRUSH_AFFIRMATIVE', $drush_affirmative);
1074  // Refresh module cache after downloading the new modules.
1075  if (drush_drupal_major_version() >= 8) {
1077  system_list_reset();
1078  }
1079  $extension_info = drush_get_extensions();
1080  $recheck = TRUE;
1081  }
1082  }
1083 
1084  if (!empty($modules)) {
1085  $all_dependencies = array();
1086  $dependencies_ok = TRUE;
1087  foreach ($dependencies as $key => $info) {
1088  if (isset($info['error'])) {
1089  unset($modules[$key]);
1090  $dependencies_ok = drush_set_error($info['error']['code'], $info['error']['message']);
1091  }
1092  elseif (!empty($info['dependencies'])) {
1093  // Make sure we have an assoc array.
1094  $dependencies_list = array_keys($info['dependencies']);
1095  $assoc = array_combine($dependencies_list, $dependencies_list);
1096  $all_dependencies = array_merge($all_dependencies, $assoc);
1097  }
1098  }
1099  if (!$dependencies_ok) {
1100  return FALSE;
1101  }
1102  $modules = array_diff(array_merge($modules, $all_dependencies), drush_module_list());
1103  // Discard modules which doesn't meet requirements.
1104  require_once DRUSH_DRUPAL_CORE . '/includes/install.inc';
1105  foreach ($modules as $key => $module) {
1106  // Check to see if the module can be installed/enabled (hook_requirements).
1107  // See @system_modules_submit
1108  if (!drupal_check_module($module)) {
1109  unset($modules[$key]);
1110  drush_set_error('DRUSH_PM_ENABLE_MODULE_UNMEET_REQUIREMENTS', dt('Module !module doesn\'t meet the requirements to be enabled.', array('!module' => $module)));
1112  return FALSE;
1113  }
1114  }
1115  }
1116 
1117  $searchpath = array();
1118  foreach (array_merge($modules, $themes) as $name) {
1119  $searchpath[] = drush_extension_get_path($extension_info[$name]);
1120  }
1121  // Add all modules that passed validation to the drush
1122  // list of commandfiles (if they have any). This
1123  // will allow these newly-enabled modules to participate
1124  // in the pre-pm_enable and post-pm_enable hooks.
1125  if (!empty($searchpath)) {
1126  _drush_add_commandfiles($searchpath);
1127  }
1128 
1129  drush_set_context('PM_ENABLE_EXTENSION_INFO', $extension_info);
1130  drush_set_context('PM_ENABLE_MODULES', $modules);
1131  drush_set_context('PM_ENABLE_THEMES', $themes);
1132 
1133  return TRUE;
1134 }
1135 
1136 /**
1137  * Command callback. Enable one or more extensions from downloaded projects.
1138  * Note that the modules and themes to be enabled were evaluated during the
1139  * pm-enable validate hook, above.
1140  */
1141 function drush_pm_enable() {
1142  // Get the data built during the validate phase
1143  $extension_info = drush_get_context('PM_ENABLE_EXTENSION_INFO');
1144  $modules = drush_get_context('PM_ENABLE_MODULES');
1145  $themes = drush_get_context('PM_ENABLE_THEMES');
1146 
1147  // Inform the user which extensions will finally be enabled.
1148  $extensions = array_merge($modules, $themes);
1149  if (empty($extensions)) {
1150  return drush_log(dt('There were no extensions that could be enabled.'), LogLevel::OK);
1151  }
1152  else {
1153  drush_print(dt('The following extensions will be enabled: !extensions', array('!extensions' => implode(', ', $extensions))));
1154  if(!drush_confirm(dt('Do you really want to continue?'))) {
1155  return drush_user_abort();
1156  }
1157  }
1158 
1159  // Enable themes.
1160  if (!empty($themes)) {
1161  drush_theme_enable($themes);
1162  }
1163 
1164  // Enable modules and pass dependency validation in form submit.
1165  if (!empty($modules)) {
1166  drush_include_engine('drupal', 'environment');
1167  drush_module_enable($modules);
1168  }
1169 
1170  // Inform the user of final status.
1171  $result_extensions = drush_get_named_extensions_list($extensions);
1172  $problem_extensions = array();
1173  $role = drush_role_get_class();
1174  foreach ($result_extensions as $name => $extension) {
1175  if ($extension->status) {
1176  drush_log(dt('!extension was enabled successfully.', array('!extension' => $name)), LogLevel::OK);
1177  $perms = $role->getModulePerms($name);
1178  if (!empty($perms)) {
1179  drush_print(dt('!extension defines the following permissions: !perms', array('!extension' => $name, '!perms' => implode(', ', $perms))));
1180  }
1181  }
1182  else {
1183  $problem_extensions[] = $name;
1184  }
1185  }
1186  if (!empty($problem_extensions)) {
1187  return drush_set_error('DRUSH_PM_ENABLE_EXTENSION_ISSUE', dt('There was a problem enabling !extension.', array('!extension' => implode(',', $problem_extensions))));
1188  }
1189  // Return the list of extensions enabled
1190  return $extensions;
1191 }
1192 
1193 /**
1194  * Command callback. Disable one or more extensions.
1195  */
1196 function drush_pm_disable() {
1197  $args = pm_parse_arguments(func_get_args());
1198  drush_include_engine('drupal', 'pm');
1199  _drush_pm_disable($args);
1200 }
1201 
1202 /**
1203  * Add extensions that match extension_name*.
1204  *
1205  * A helper function for commands that take a space separated list of extension
1206  * names. It will identify extensions that have been passed in with a
1207  * trailing * and add all matching extensions to the array that is returned.
1208  *
1209  * @param $extensions
1210  * An array of extensions, by reference.
1211  * @param $extension_info
1212  * Optional. An array of extension info as returned by drush_get_extensions().
1213  */
1214 function _drush_pm_expand_extensions(&$extensions, $extension_info = array()) {
1215  if (empty($extension_info)) {
1216  $extension_info = drush_get_extensions();
1217  }
1218  foreach ($extensions as $key => $extension) {
1219  if (($wildcard = rtrim($extension, '*')) !== $extension) {
1220  foreach (array_keys($extension_info) as $extension_name) {
1221  if (substr($extension_name, 0, strlen($wildcard)) == $wildcard) {
1222  $extensions[] = $extension_name;
1223  }
1224  }
1225  unset($extensions[$key]);
1226  continue;
1227  }
1228  }
1229 }
1230 
1231 /**
1232  * Command callback. Uninstall one or more modules.
1233  */
1235  $args = pm_parse_arguments(func_get_args());
1236  drush_include_engine('drupal', 'pm');
1237  _drush_pm_uninstall($args);
1238 }
1239 
1240 /**
1241  * Command callback. Show available releases for given project(s).
1242  */
1243 function drush_pm_releases() {
1244  $release_info = drush_get_engine('release_info');
1245 
1246  // Obtain requests.
1247  $requests = pm_parse_arguments(func_get_args(), FALSE);
1248  if (!$requests) {
1249  $requests = array('drupal');
1250  }
1251 
1252  // Get installed projects.
1253  if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_FULL) {
1254  $projects = drush_get_projects();
1255  }
1256  else {
1257  $projects = array();
1258  }
1259 
1260  // Select the filter to apply based on cli options.
1261  if (drush_get_option('dev', FALSE)) {
1262  $filter = 'dev';
1263  }
1264  elseif (drush_get_option('all', FALSE)) {
1265  $filter = 'all';
1266  }
1267  else {
1268  $filter = '';
1269  }
1270 
1271  $status_url = drush_get_option('source');
1272 
1273  $output = array();
1274  foreach ($requests as $request) {
1275  $request = pm_parse_request($request, $status_url, $projects);
1276  $project_name = $request['name'];
1277  $project_release_info = $release_info->get($request);
1278  if ($project_release_info) {
1279  $version = isset($projects[$project_name]) ? $projects[$project_name]['version'] : NULL;
1280  $releases = $project_release_info->filterReleases($filter, $version);
1281  foreach ($releases as $key => $release) {
1282  $output["${project_name}-${key}"] = array(
1283  'project' => $project_name,
1284  'version' => $release['version'],
1285  'date' => gmdate('Y-M-d', $release['date']),
1286  'status' => implode(', ', $release['release_status']),
1287  ) + $release;
1288  }
1289  }
1290  }
1291  if (empty($output)) {
1292  return drush_log(dt('No valid projects given.'), LogLevel::OK);
1293  }
1294 
1295  return $output;
1296 }
1297 
1298 /**
1299  * Command callback. Show release notes for given project(s).
1300  */
1302  $release_info = drush_get_engine('release_info');
1303 
1304  // Obtain requests.
1305  if (!$requests = pm_parse_arguments(func_get_args(), FALSE)) {
1306  $requests = array('drupal');
1307  }
1308 
1309  // Get installed projects.
1310  if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_FULL) {
1311  $projects = drush_get_projects();
1312  }
1313  else {
1314  $projects = array();
1315  }
1316 
1317  $status_url = drush_get_option('source');
1318 
1319  $output = '';
1320  foreach($requests as $request) {
1321  $request = pm_parse_request($request, $status_url, $projects);
1322  $project_release_info = $release_info->get($request);
1323  if ($project_release_info) {
1324  $version = empty($request['version']) ? NULL : $request['version'];
1325  $output .= $project_release_info->getReleaseNotes($version);
1326  }
1327  }
1328  return $output;
1329 }
1330 
1331 /**
1332  * Command callback. Refresh update status information.
1333  */
1334 function drush_pm_refresh() {
1335  $update_status = drush_get_engine('update_status');
1336  drush_print(dt("Refreshing update status information ..."));
1337  $update_status->refresh();
1338  drush_print(dt("Done."));
1339 }
1340 
1341 /**
1342  * Command callback. Execute pm-update.
1343  */
1344 function drush_pm_update() {
1345  // Call pm-updatecode. updatedb will be called in the post-update process.
1346  $args = pm_parse_arguments(func_get_args(), FALSE);
1347  drush_set_option('check-updatedb', FALSE);
1348  return drush_invoke('pm-updatecode', $args);
1349 }
1350 
1351 /**
1352  * Post-command callback.
1353  * Execute updatedb command after an updatecode - user requested `update`.
1354  */
1356  // Use drush_invoke_process to start a subprocess. Cleaner that way.
1357  if (drush_get_context('DRUSH_PM_UPDATED', FALSE) !== FALSE) {
1358  drush_invoke_process('@self', 'updatedb');
1359  }
1360 }
1361 
1362 /**
1363  * Validate callback for updatecode command. Abort if 'backup' directory exists.
1364  */
1366  $path = drush_get_context('DRUSH_DRUPAL_ROOT') . '/backup';
1367  if (is_dir($path) && (realpath(drush_get_option('backup-dir', FALSE)) != $path)) {
1368  return drush_set_error('', dt('Backup directory !path found. It\'s a security risk to store backups inside the Drupal tree. Drush now uses by default ~/drush-backups. You need to move !path out of the Drupal tree to proceed. Note: if you know what you\'re doing you can explicitly set --backup-dir to !path and continue.', array('!path' => $path)));
1369  }
1370 }
1371 
1372 /**
1373  * Post-command callback for updatecode.
1374  *
1375  * Execute pm-updatecode-postupdate in a backend process to not conflict with
1376  * old code already in memory.
1377  */
1379  // Skip if updatecode was invoked by pm-update.
1380  // This way we avoid being noisy, as updatedb is to be executed.
1381  if (drush_get_option('check-updatedb', TRUE)) {
1382  if (drush_get_context('DRUSH_PM_UPDATED', FALSE)) {
1383  drush_invoke_process('@self', 'pm-updatecode-postupdate');
1384  }
1385  }
1386 }
1387 
1388 /**
1389  * Command callback. Execute updatecode-postupdate.
1390  */
1392  // Clear the cache, since some projects could have moved around.
1394 
1395  // Notify of pending database updates.
1396  // Make sure the installation API is available
1397  require_once DRUSH_DRUPAL_CORE . '/includes/install.inc';
1398 
1399  // Load all .install files.
1400  drupal_load_updates();
1401 
1402  // @see system_requirements().
1403  foreach (drush_module_list() as $module) {
1404  $updates = drupal_get_schema_versions($module);
1405  if ($updates !== FALSE) {
1406  $default = drupal_get_installed_schema_version($module);
1407  if (max($updates) > $default) {
1408  drush_log(dt("You have pending database updates. Run `drush updatedb` or visit update.php in your browser."), LogLevel::WARNING);
1409  break;
1410  }
1411  }
1412  }
1413 }
1414 
1415 /**
1416  * Sanitize user provided arguments to several pm commands.
1417  *
1418  * Return an array of arguments off a space and/or comma separated values.
1419  */
1420 function pm_parse_arguments($args, $dashes_to_underscores = TRUE) {
1421  $arguments = _convert_csv_to_array($args);
1422  foreach ($arguments as $key => $argument) {
1423  $argument = ($dashes_to_underscores) ? strtr($argument, '-', '_') : $argument;
1424  }
1425  return $arguments;
1426 }
1427 
1428 /**
1429  * Decompound a version string and returns major, minor, patch and extra parts.
1430  *
1432  * @see pm_parse_version()
1433  *
1434  * @param string $version
1435  * A version string like X.Y-Z, X.Y.Z-W or a subset.
1436  *
1437  * @return array
1438  * Array with major, patch and extra keys.
1439  */
1440 function _pm_parse_version_decompound($version) {
1441  $pattern = '/^(\d+)(?:.(\d+))?(?:\.(x|\d+))?(?:-([a-z0-9\.-]*))?(?:\+(\d+)-dev)?$/';
1442 
1443  $matches = array();
1444  preg_match($pattern, $version, $matches);
1445 
1446  $parts = array(
1447  'major' => '',
1448  'minor' => '',
1449  'patch' => '',
1450  'extra' => '',
1451  'offset' => '',
1452  );
1453  if (isset($matches[1])) {
1454  $parts['major'] = $matches[1];
1455  if (isset($matches[2])) {
1456  if (isset($matches[3]) && $matches[3] != '') {
1457  $parts['minor'] = $matches[2];
1458  $parts['patch'] = $matches[3];
1459  }
1460  else {
1461  $parts['patch'] = $matches[2];
1462  }
1463  }
1464  if (!empty($matches[4])) {
1465  $parts['extra'] = $matches[4];
1466  }
1467  if (!empty($matches[5])) {
1468  $parts['offset'] = $matches[5];
1469  }
1470  }
1471 
1472  return $parts;
1473 }
1474 
1475 /**
1476  * Build a version string from an array of major, minor and extra parts.
1477  *
1479  * @see pm_parse_version()
1480  *
1481  * @param array $parts
1482  * Array of parts.
1483  *
1484  * @return string
1485  * A Version string.
1486  */
1487 function _pm_parse_version_compound($parts) {
1488  $project_version = '';
1489  if ($parts['patch'] != '') {
1490  $project_version = $parts['major'];
1491  if ($parts['minor'] != '') {
1492  $project_version = $project_version . '.' . $parts['minor'];
1493  }
1494  if ($parts['patch'] == 'x') {
1495  $project_version = $project_version . '.x-dev';
1496  }
1497  else {
1498  $project_version = $project_version . '.' . $parts['patch'];
1499  if ($parts['extra'] != '') {
1500  $project_version = $project_version . '-' . $parts['extra'];
1501  }
1502  }
1503  if ($parts['offset'] != '') {
1504  $project_version = $project_version . '+' . $parts['offset'] . '-dev';
1505  }
1506  }
1507 
1508  return $project_version;
1509 }
1510 
1511 /**
1512  * Parses a version string and returns its components.
1513  *
1514  * It parses both core and contrib version strings.
1515  *
1516  * Core (semantic versioning):
1517  * - 8.0.0-beta3+252-dev
1518  * - 8.0.0-beta2
1519  * - 8.0.x-dev
1520  * - 8.1.x
1521  * - 8.0.1
1522  * - 8
1523  *
1524  * Core (classic drupal scheme):
1525  * - 7.x-dev
1526  * - 7.x
1527  * - 7.33
1528  * - 7.34+3-dev
1529  * - 7
1530  *
1531  * Contrib:
1532  * - 7.x-1.0-beta1+30-dev
1533  * - 7.x-1.0-beta1
1534  * - 7.x-1.0+30-dev
1535  * - 7.x-1.0
1536  * - 1.0-beta1
1537  * - 1.0
1538  * - 7.x-1.x
1539  * - 7.x-1.x-dev
1540  * - 1.x
1541  *
1542  * @see pm_parse_request()
1543  *
1544  * @param string $version
1545  * A core or project version string.
1546  *
1547  * @param bool $is_core
1548  * Whether this is a core version or a project version.
1549  *
1550  * @return array
1551  * Version string in parts.
1552  * Example for a contrib version (ex: 7.x-3.2-beta1):
1553  * - version : Fully qualified version string.
1554  * - drupal_version : Core compatibility version (ex: 7.x).
1555  * - version_major : Major version (ex: 3).
1556  * - version_minor : Minor version. Not applicable. Always empty.
1557  * - version_patch : Patch version (ex: 2).
1558  * - version_extra : Extra version (ex: beta1).
1559  * - project_version : Project specific part of the version (ex: 3.2-beta1).
1560  *
1561  * Example for a core version (ex: 8.1.2-beta2 or 7.0-beta2):
1562  * - version : Fully qualified version string.
1563  * - drupal_version : Core compatibility version (ex: 8.x).
1564  * - version_major : Major version (ex: 8).
1565  * - version_minor : Minor version (ex: 1). Empty if not a semver.
1566  * - version_patch : Patch version (ex: 2).
1567  * - version_extra : Extra version (ex: beta2).
1568  * - project_version : Same as 'version'.
1569  */
1570 function pm_parse_version($version, $is_core = FALSE) {
1571  $core_parts = _pm_parse_version_decompound($version);
1572 
1573  // If no major version, we have no version at all. Pick a default.
1574  $drupal_version_default = drush_drupal_major_version();
1575  if ($core_parts['major'] == '') {
1576  $core_parts['major'] = ($drupal_version_default) ? $drupal_version_default : drush_get_option('default-major', 8);
1577  }
1578 
1579  if ($is_core) {
1580  $project_version = _pm_parse_version_compound($core_parts);
1581  $version_parts = array(
1582  'version' => $project_version,
1583  'drupal_version' => $core_parts['major'] . '.x',
1584  'project_version' => $project_version,
1585  'version_major' => $core_parts['major'],
1586  'version_minor' => $core_parts['minor'],
1587  'version_patch' => ($core_parts['patch'] == 'x') ? '' : $core_parts['patch'],
1588  'version_extra' => ($core_parts['patch'] == 'x') ? 'dev' : $core_parts['extra'],
1589  'version_offset' => $core_parts['offset'],
1590  );
1591  }
1592  else {
1593  // If something as 7.x-1.0-beta1, the project specific version is
1594  // in $version['extra'] and we need to parse it.
1595  if (strpbrk($core_parts['extra'], '.-')) {
1596  $nocore_parts = _pm_parse_version_decompound($core_parts['extra']);
1597  $nocore_parts['offset'] = $core_parts['offset'];
1598  $project_version = _pm_parse_version_compound($nocore_parts);
1599  $version_parts = array(
1600  'version' => $core_parts['major'] . '.x-' . $project_version,
1601  'drupal_version' => $core_parts['major'] . '.x',
1602  'project_version' => $project_version,
1603  'version_major' => $nocore_parts['major'],
1604  'version_minor' => $core_parts['minor'],
1605  'version_patch' => ($nocore_parts['patch'] == 'x') ? '' : $nocore_parts['patch'],
1606  'version_extra' => ($nocore_parts['patch'] == 'x') ? 'dev' : $nocore_parts['extra'],
1607  'version_offset' => $core_parts['offset'],
1608  );
1609  }
1610  // At this point we have half a version and must decide if this is a drupal major or a project.
1611  else {
1612  // If working on a bootstrapped site, core_parts has the project version.
1613  if ($drupal_version_default) {
1614  $project_version = _pm_parse_version_compound($core_parts);
1615  $version = ($project_version) ? $drupal_version_default . '.x-' . $project_version : '';
1616  $version_parts = array(
1617  'version' => $version,
1618  'drupal_version' => $drupal_version_default . '.x',
1619  'project_version' => $project_version,
1620  'version_major' => $core_parts['major'],
1621  'version_minor' => $core_parts['minor'],
1622  'version_patch' => ($core_parts['patch'] == 'x') ? '' : $core_parts['patch'],
1623  'version_extra' => ($core_parts['patch'] == 'x') ? 'dev' : $core_parts['extra'],
1624  'version_offset' => $core_parts['offset'],
1625  );
1626  }
1627  // Not working on a bootstrapped site, core_parts is core version.
1628  else {
1629  $version_parts = array(
1630  'version' => '',
1631  'drupal_version' => $core_parts['major'] . '.x',
1632  'project_version' => '',
1633  'version_major' => '',
1634  'version_minor' => '',
1635  'version_patch' => '',
1636  'version_extra' => '',
1637  'version_offset' => '',
1638  );
1639  }
1640  }
1641  }
1642 
1643  return $version_parts;
1644 }
1645 
1646 /**
1647  * Parse out the project name and version and return as a structured array.
1648  *
1649  * @see pm_parse_version()
1650  *
1651  * @param string $request_string
1652  * Project name with optional version. Examples: 'ctools-7.x-1.0-beta1'
1653  *
1654  * @return array
1655  * Array with all parts of the request info.
1656  */
1657 function pm_parse_request($request_string, $status_url = NULL, &$projects = array()) {
1658  // Split $request_string in project name and version. Note that hyphens (-)
1659  // are permitted in project names (ex: field-conditional-state).
1660  // We use a regex to split the string. The pattern used matches a string
1661  // starting with hyphen, followed by one or more numbers, any of the valid
1662  // symbols in version strings (.x-) and a catchall for the rest of the
1663  // version string.
1664  $parts = preg_split('/-(?:([\d+\.x].*))?$/', $request_string, NULL, PREG_SPLIT_DELIM_CAPTURE);
1665 
1666  if (count($parts) == 1) {
1667  // No version in the request string.
1668  $project = $request_string;
1669  $version = '';
1670  }
1671  else {
1672  $project = $parts[0];
1673  $version = $parts[1];
1674  }
1675 
1676  $is_core = ($project == 'drupal');
1677  $request = array(
1678  'name' => $project,
1679  ) + pm_parse_version($version, $is_core);
1680 
1681  // Set the status url if provided or available in project's info file.
1682  if ($status_url) {
1683  $request['status url'] = $status_url;
1684  }
1685  elseif (!empty($projects[$project]['status url'])) {
1686  $request['status url'] = $projects[$project]['status url'];
1687  }
1688 
1689  return $request;
1690 }
1691 
1692 /**
1693  * @defgroup engines Engine types
1694  * @{
1695  */
1696 
1697 /**
1698  * Implementation of hook_drush_engine_type_info().
1699  */
1701  return array(
1702  'package_handler' => array(
1703  'option' => 'package-handler',
1704  'description' => 'Determine how to fetch projects from update service.',
1705  'default' => 'wget',
1706  'options' => array(
1707  'cache' => 'Cache release XML and tarballs or git clones. Git clones use git\'s --reference option. Defaults to 1 for downloads, and 0 for git.',
1708  ),
1709  ),
1710  'release_info' => array(
1711  'add-options-to-command' => TRUE,
1712  ),
1713  'update_status' => array(
1714  'option' => 'update-backend',
1715  'description' => 'Determine how to fetch update status information.',
1716  'default' => 'drush',
1717  'add-options-to-command' => TRUE,
1718  'options' => array(
1719  'update-backend' => 'Backend to obtain available updates.',
1720  'check-disabled' => 'Check for updates of disabled modules and themes.',
1721  'security-only' => 'Only update modules that have security updates available.',
1722  ),
1723  'combine-help' => TRUE,
1724  ),
1725  'version_control' => array(
1726  'option' => 'version-control',
1727  'default' => 'backup',
1728  'description' => 'Integrate with version control systems.',
1729  ),
1730  );
1731 }
1732 
1733 /**
1734  * Implements hook_drush_engine_ENGINE_TYPE().
1735  *
1736  * Package handler engine is used by pm-download and
1737  * pm-updatecode commands to determine how to download/checkout
1738  * new projects and acquire updates to projects.
1739  */
1741  return array(
1742  'wget' => array(
1743  'description' => 'Download project packages using wget or curl.',
1744  'options' => array(
1745  'no-md5' => 'Skip md5 validation of downloads.',
1746  ),
1747  ),
1748  'git_drupalorg' => array(
1749  'description' => 'Use git.drupal.org to checkout and update projects.',
1750  'options' => array(
1751  'gitusername' => 'Your git username as shown on user/[uid]/edit/git. Typically, this is set this in drushrc.php. Omitting this prevents users from pushing changes back to git.drupal.org.',
1752  'gitsubmodule' => 'Use git submodules for checking out new projects. Existing git checkouts are unaffected, and will continue to (not) use submodules regardless of this setting.',
1753  'gitcheckoutparams' => 'Add options to the `git checkout` command.',
1754  'gitcloneparams' => 'Add options to the `git clone` command.',
1755  'gitfetchparams' => 'Add options to the `git fetch` command.',
1756  'gitpullparams' => 'Add options to the `git pull` command.',
1757  'gitinfofile' => 'Inject version info into each .info file.',
1758  ),
1759  'sub-options' => array(
1760  'gitsubmodule' => array(
1761  'gitsubmoduleaddparams' => 'Add options to the `git submodule add` command.',
1762  ),
1763  ),
1764  ),
1765  );
1766 }
1767 
1768 /**
1769  * Implements hook_drush_engine_ENGINE_TYPE().
1770  *
1771  * Release info engine is used by several pm commands to obtain
1772  * releases info from Drupal's update service or external sources.
1773  */
1775  return array(
1776  'updatexml' => array(
1777  'description' => 'Drush release info engine for update.drupal.org and compatible services.',
1778  'options' => array(
1779  'source' => 'The base URL which provides project release history in XML. Defaults to http://updates.drupal.org/release-history.',
1780  'dev' => 'Work with development releases solely.',
1781  ),
1782  'sub-options' => array(
1783  'cache' => array(
1784  'cache-duration-releasexml' => 'Expire duration (in seconds) for release XML. Defaults to 86400 (24 hours).',
1785  ),
1786  'select' => array(
1787  'all' => 'Shows all available releases instead of a short list of recent releases.',
1788  ),
1789  ),
1790  'class' => 'Drush\UpdateService\ReleaseInfo',
1791  ),
1792  );
1793 }
1794 
1795 /**
1796  * Implements hook_drush_engine_ENGINE_TYPE().
1797  *
1798  * Update status engine is used to check available updates for
1799  * the projects in a Drupal site.
1800  */
1802  return array(
1803  'drupal' => array(
1804  'description' => 'Check available updates with update.module.',
1805  'drupal dependencies' => array('update'),
1806  'class' => 'Drush\UpdateService\StatusInfoDrupal',
1807  ),
1808  'drush' => array(
1809  'description' => 'Check available updates without update.module.',
1810  'class' => 'Drush\UpdateService\StatusInfoDrush',
1811  ),
1812  );
1813 }
1814 
1815 /**
1816  * Implements hook_drush_engine_ENGINE_TYPE().
1817  *
1818  * Integration with VCS in order to easily commit your changes to projects.
1819  */
1821  return array(
1822  'backup' => array(
1823  'description' => 'Backup all project files before updates.',
1824  'options' => array(
1825  'no-backup' => 'Do not perform backups. WARNING: Will result in non-core files/dirs being deleted (e.g. .git)',
1826  'backup-dir' => 'Specify a directory to backup projects into. Defaults to drush-backups within the home directory of the user running the command. It is forbidden to specify a directory inside your drupal root.',
1827  ),
1828  ),
1829  'bzr' => array(
1830  'signature' => 'bzr root %s',
1831  'description' => 'Quickly add/remove/commit your project changes to Bazaar.',
1832  'options' => array(
1833  'bzrsync' => 'Automatically add new files to the Bazaar repository and remove deleted files. Caution.',
1834  'bzrcommit' => 'Automatically commit changes to Bazaar repository. You must also use the --bzrsync option.',
1835  ),
1836  'sub-options' => array(
1837  'bzrcommit' => array(
1838  'bzrmessage' => 'Override default commit message which is: Drush automatic commit. Project <name> <type> Command: <the drush command line used>',
1839  ),
1840  ),
1841  'examples' => array(
1842  'drush dl cck --version-control=bzr --bzrsync --bzrcommit' => 'Download the cck project and then add it and commit it to Bazaar.'
1843  ),
1844  ),
1845  'svn' => array(
1846  'signature' => 'svn info %s',
1847  'description' => 'Quickly add/remove/commit your project changes to Subversion.',
1848  'options' => array(
1849  'svnsync' => 'Automatically add new files to the SVN repository and remove deleted files. Caution.',
1850  'svncommit' => 'Automatically commit changes to SVN repository. You must also using the --svnsync option.',
1851  'svnstatusparams' => "Add options to the 'svn status' command",
1852  'svnaddparams' => 'Add options to the `svn add` command',
1853  'svnremoveparams' => 'Add options to the `svn remove` command',
1854  'svnrevertparams' => 'Add options to the `svn revert` command',
1855  'svncommitparams' => 'Add options to the `svn commit` command',
1856  ),
1857  'sub-options' => array(
1858  'svncommit' => array(
1859  'svnmessage' => 'Override default commit message which is: Drush automatic commit: <the drush command line used>',
1860  ),
1861  ),
1862  'examples' => array(
1863  'drush [command] cck --svncommitparams=\"--username joe\"' => 'Commit changes as the user \'joe\' (Quotes are required).'
1864  ),
1865  ),
1866  );
1867 }
1868 
1869 /**
1870  * @} End of "Engine types".
1871  */
1872 
1873 /**
1874  * Interface for version control systems.
1875  * We use a simple object layer because we conceivably need more than one
1876  * loaded at a time.
1877  */
1879  function pre_update(&$project);
1880  function rollback($project);
1881  function post_update($project);
1882  function post_download($project);
1883  static function reserved_files();
1884 }
1885 
1886 /**
1887  * A simple factory function that tests for version control systems, in a user
1888  * specified order, and returns the one that appears to be appropriate for a
1889  * specific directory.
1890  */
1891 function drush_pm_include_version_control($directory = '.') {
1892  $engine_info = drush_get_engines('version_control');
1893  $version_controls = drush_get_option('version-control', FALSE);
1894  // If no version control was given, use a list of defaults.
1895  if (!$version_controls) {
1896  // Backup engine is the last option.
1897  $version_controls = array_reverse(array_keys($engine_info['engines']));
1898  }
1899  else {
1900  $version_controls = array($version_controls);
1901  }
1902 
1903  // Find the first valid engine in the list, checking signatures if needed.
1904  $engine = FALSE;
1905  while (!$engine && count($version_controls)) {
1906  $version_control = array_shift($version_controls);
1907  if (isset($engine_info['engines'][$version_control])) {
1908  if (!empty($engine_info['engines'][$version_control]['signature'])) {
1909  drush_log(dt('Verifying signature for !vcs version control engine.', array('!vcs' => $version_control)), LogLevel::DEBUG);
1910  if (drush_shell_exec($engine_info['engines'][$version_control]['signature'], $directory)) {
1911  $engine = $version_control;
1912  }
1913  }
1914  else {
1915  $engine = $version_control;
1916  }
1917  }
1918  }
1919  if (!$engine) {
1920  return drush_set_error('DRUSH_PM_NO_VERSION_CONTROL', dt('No valid version control or backup engine found (the --version-control option was set to "!version-control").', array('!version-control' => $version_control)));
1921  }
1922 
1923  $instance = drush_include_engine('version_control', $engine);
1924  return $instance;
1925 }
1926 
1927 /**
1928  * Update the locked status of all of the candidate projects
1929  * to be updated.
1930  *
1931  * @param array &$projects
1932  * The projects array from pm_updatecode. $project['locked'] will
1933  * be set for every file where a persistent lockfile can be found.
1934  * The 'lock' and 'unlock' operations are processed first.
1935  * @param array $projects_to_lock
1936  * A list of projects to create peristent lock files for
1937  * @param array $projects_to_unlock
1938  * A list of projects to clear the persistent lock on
1939  * @param string $lock_message
1940  * The reason the project is being locked; stored in the lockfile.
1941  *
1942  * @return array
1943  * A list of projects that are locked.
1944  */
1945 function drush_pm_update_lock(&$projects, $projects_to_lock, $projects_to_unlock, $lock_message = NULL) {
1946  $locked_result = array();
1947 
1948  // Warn about ambiguous lock / unlock values
1949  if ($projects_to_lock == array('1')) {
1950  $projects_to_lock = array();
1951  drush_log(dt('Ignoring --lock with no value.'), LogLevel::WARNING);
1952  }
1953  if ($projects_to_unlock == array('1')) {
1954  $projects_to_unlock = array();
1955  drush_log(dt('Ignoring --unlock with no value.'), LogLevel::WARNING);
1956  }
1957 
1958  // Log if we are going to lock or unlock anything
1959  if (!empty($projects_to_unlock)) {
1960  drush_log(dt('Unlocking !projects', array('!projects' => implode(',', $projects_to_unlock))), LogLevel::OK);
1961  }
1962  if (!empty($projects_to_lock)) {
1963  drush_log(dt('Locking !projects', array('!projects' => implode(',', $projects_to_lock))), LogLevel::OK);
1964  }
1965 
1966  $drupal_root = drush_get_context('DRUSH_DRUPAL_ROOT');
1967  foreach ($projects as $name => $project) {
1968  $message = NULL;
1969  if (isset($project['path'])) {
1970  if ($name == 'drupal') {
1971  $lockfile = $drupal_root . '/.drush-lock-update';
1972  }
1973  else {
1974  $lockfile = $drupal_root . '/' . $project['path'] . '/.drush-lock-update';
1975  }
1976 
1977  // Remove the lock file if the --unlock option was specified
1978  if (((in_array($name, $projects_to_unlock)) || (in_array('all', $projects_to_unlock))) && (file_exists($lockfile))) {
1979  drush_op('unlink', $lockfile);
1980  }
1981 
1982  // Create the lock file if the --lock option was specified
1983  if ((in_array($name, $projects_to_lock)) || (in_array('all', $projects_to_lock))) {
1984  drush_op('file_put_contents', $lockfile, $lock_message != NULL ? $lock_message : "Locked via drush.");
1985  // Note that the project is locked. This will work even if we are simulated,
1986  // or if we get permission denied from the file_put_contents.
1987  // If the lock is -not- simulated or transient, then the lock message will be
1988  // read from the lock file below.
1989  $message = drush_get_context('DRUSH_SIMULATE') ? 'Simulated lock.' : 'Transient lock.';
1990  }
1991 
1992  // If the persistent lock file exists, then mark the project as locked.
1993  if (file_exists($lockfile)) {
1994  $message = trim(file_get_contents($lockfile));
1995  }
1996  }
1997 
1998  // If there is a message set, then mark the project as locked.
1999  if (isset($message)) {
2000  $projects[$name]['locked'] = !empty($message) ? $message : "Locked.";
2001  $locked_result[$name] = $project;
2002  }
2003  }
2004 
2005  return $locked_result;
2006 }
2007 
2008 /**
2009  * Returns the path to the extensions cache file.
2010  */
2012  return drush_get_context('DRUSH_PER_USER_CONFIGURATION') . "/drush-extension-cache.inc";
2013 }
2014 
2015 /**
2016  * Load the extensions cache.
2017  */
2019  $extension_cache = array();
2020  $cache_file = _drush_pm_extension_cache_file();
2021 
2022  if (file_exists($cache_file)) {
2023  include $cache_file;
2024  }
2025  if (!array_key_exists('extension-map', $extension_cache)) {
2026  $extension_cache['extension-map'] = array();
2027  }
2028  return $extension_cache;
2029 }
2030 
2031 /**
2032  * Lookup an extension in the extensions cache.
2033  */
2035  $result = NULL;
2036  $extension_cache = _drush_pm_get_extension_cache();
2037  if (!empty($extension_cache) && array_key_exists($extension, $extension_cache)) {
2038  $result = $extension_cache[$extension];
2039  }
2040  return $result;
2041 }
2042 
2043 /**
2044  * Persists extensions cache.
2045  *
2046  * #TODO# not implemented.
2047  */
2048 function drush_pm_put_extension_cache($extension_cache) {
2049 }
2050 
2051 /**
2052  * Store extensions founds within a project in extensions cache.
2053  */
2054 function drush_pm_cache_project_extensions($project, $found) {
2055  $extension_cache = _drush_pm_get_extension_cache();
2056  foreach($found as $extension) {
2057  // Simple cache does not handle conflicts
2058  // We could keep an array of projects, and count
2059  // how many times each one has been seen...
2060  $extension_cache[$extension] = $project['name'];
2061  }
2062  drush_pm_put_extension_cache($extension_cache);
2063 }
2064 
2065 /**
2066  * Print out all extensions (modules/themes/profiles) found in specified project.
2067  *
2068  * Find .info.yml files in the project path and identify modules, themes and
2069  * profiles. It handles two kind of projects: drupal core/profiles and
2070  * modules/themes.
2071  * It does nothing with theme engine projects.
2072  */
2074  // Mask for drush_scan_directory, to match .info.yml files.
2075  $mask = $project['drupal_version'][0] >= 8 ? '/(.*)\.info\.yml$/' : '/(.*)\.info$/';
2076 
2077  // Mask for drush_scan_directory, to avoid tests directories.
2078  $nomask = array('.', '..', 'CVS', 'tests');
2079 
2080  // Drupal core and profiles can contain modules, themes and profiles.
2081  if (in_array($project['project_type'], array('core', 'profile'))) {
2082  $found = array('profile' => array(), 'theme' => array(), 'module' => array());
2083  // Find all of the .info files
2084  foreach (drush_scan_directory($project['full_project_path'], $mask, $nomask) as $filename => $info) {
2085  // Extract extension name from filename.
2086  $matches = array();
2087  preg_match($mask, $info->basename, $matches);
2088  $name = $matches[1];
2089 
2090  // Find the project type corresponding the .info file.
2091  // (Only drupal >=7.x has .info for .profile)
2092  $base = dirname($filename) . '/' . $name;
2093  if (is_file($base . '.module')) {
2094  $found['module'][] = $name;
2095  }
2096  else if (is_file($base . '.profile')) {
2097  $found['profile'][] = $name;
2098  }
2099  else {
2100  $found['theme'][] = $name;
2101  }
2102  }
2103  // Special case: find profiles for drupal < 7.x (no .info)
2104  if ($project['drupal_version'][0] < 7) {
2105  foreach (drush_find_profiles($project['full_project_path']) as $filename => $info) {
2106  $found['profile'][] = $info->name;
2107  }
2108  }
2109  // Log results.
2110  $msg = "Project !project contains:\n";
2111  $args = array('!project' => $project['name']);
2112  foreach (array_keys($found) as $type) {
2113  if ($count = count($found[$type])) {
2114  $msg .= " - !count_$type !type_$type: !found_$type\n";
2115  $args += array("!count_$type" => $count, "!type_$type" => $type, "!found_$type" => implode(', ', $found[$type]));
2116  if ($count > 1) {
2117  $args["!type_$type"] = $type.'s';
2118  }
2119  }
2120  }
2121  drush_log(dt($msg, $args), LogLevel::SUCCESS);
2122  drush_print_pipe(call_user_func_array('array_merge', array_values($found)));
2123  }
2124  // Modules and themes can only contain other extensions of the same type.
2125  elseif (in_array($project['project_type'], array('module', 'theme'))) {
2126  $found = array();
2127  foreach (drush_scan_directory($project['full_project_path'], $mask, $nomask) as $filename => $info) {
2128  // Extract extension name from filename.
2129  $matches = array();
2130  preg_match($mask, $info->basename, $matches);
2131  $found[] = $matches[1];
2132  }
2133  // If there is only one module / theme in the project, only print out
2134  // the message if is different than the project name.
2135  if (count($found) == 1) {
2136  if ($found[0] != $project['name']) {
2137  $msg = "Project !project contains a !type named !found.";
2138  }
2139  }
2140  // If there are multiple modules or themes in the project, list them all.
2141  else {
2142  $msg = "Project !project contains !count !types: !found.";
2143  }
2144  if (isset($msg)) {
2145  drush_print(dt($msg, array('!project' => $project['name'], '!count' => count($found), '!type' => $project['project_type'], '!found' => implode(', ', $found))));
2146  }
2147  drush_print_pipe($found);
2148  // Cache results.
2149  drush_pm_cache_project_extensions($project, $found);
2150  }
2151 }
2152 
2153 /**
2154  * Return an array of empty directories.
2155  *
2156  * Walk a directory and return an array of subdirectories that are empty. Will
2157  * return the given directory if it's empty.
2158  * If a list of items to exclude is provided, subdirectories will be condidered
2159  * empty even if they include any of the items in the list.
2160  *
2161  * @param string $dir
2162  * Path to the directory to work in.
2163  * @param array $exclude
2164  * Array of files or directory to exclude in the check.
2165  *
2166  * @return array
2167  * A list of directory paths that are empty. A directory is deemed to be empty
2168  * if it only contains excluded files or directories.
2169  */
2170 function drush_find_empty_directories($dir, $exclude = array()) {
2171  // Skip files.
2172  if (!is_dir($dir)) {
2173  return array();
2174  }
2175  $to_exclude = array_merge(array('.', '..'), $exclude);
2176  $empty_dirs = array();
2177  $dir_is_empty = TRUE;
2178  foreach (scandir($dir) as $file) {
2179  // Skip excluded directories.
2180  if (in_array($file, $to_exclude)) {
2181  continue;
2182  }
2183  // Recurse into sub-directories to find potentially empty ones.
2184  $subdir = $dir . '/' . $file;
2185  $empty_dirs += drush_find_empty_directories($subdir, $exclude);
2186  // $empty_dir will not contain $subdir, if it is a file or if the
2187  // sub-directory is not empty. $subdir is only set if it is empty.
2188  if (!isset($empty_dirs[$subdir])) {
2189  $dir_is_empty = FALSE;
2190  }
2191  }
2192 
2193  if ($dir_is_empty) {
2194  $empty_dirs[$dir] = $dir;
2195  }
2196  return $empty_dirs;
2197 }
2198 
2199 /**
2200  * Inject metadata into all .info files for a given project.
2201  *
2202  * @param string $project_dir
2203  * The full path to the root directory of the project to operate on.
2204  * @param string $project_name
2205  * The project machine name (AKA shortname).
2206  * @param string $version
2207  * The version string to inject into the .info file(s).
2208  * @param int $datestamp
2209  * The datestamp of the last commit.
2210  *
2211  * @return boolean
2212  * TRUE on success, FALSE on any failures appending data to .info files.
2213  */
2214 function drush_pm_inject_info_file_metadata($project_dir, $project_name, $version, $datestamp) {
2215  // `drush_drupal_major_version()` cannot be used here because this may be running
2216  // outside of a Drupal context.
2217  $yaml_format = substr($version, 0, 1) >= 8;
2218  $pattern = preg_quote($yaml_format ? '.info.yml' : '.info');
2219  $info_files = drush_scan_directory($project_dir, '/.*' . $pattern . '$/');
2220  if (!empty($info_files)) {
2221  // Construct the string of metadata to append to all the .info files.
2222  if ($yaml_format) {
2223  $info = _drush_pm_generate_info_yaml_metadata($version, $project_name, $datestamp);
2224  }
2225  else {
2226  $info = _drush_pm_generate_info_ini_metadata($version, $project_name, $datestamp);
2227  }
2228  foreach ($info_files as $info_file) {
2229  if (!drush_file_append_data($info_file->filename, $info)) {
2230  return FALSE;
2231  }
2232  }
2233  }
2234  return TRUE;
2235 }
2236 
2237 /**
2238  * Generate version information for `.info` files in ini format.
2239  *
2240  * Taken with some modifications from:
2242  */
2243 function _drush_pm_generate_info_ini_metadata($version, $project_name, $datestamp) {
2244  $matches = array();
2245  $extra = '';
2246  if (preg_match('/^((\d+)\.x)-.*/', $version, $matches) && $matches[2] >= 6) {
2247  $extra .= "\ncore = \"$matches[1]\"";
2248  }
2249  if (!drush_get_option('no-gitprojectinfo', FALSE)) {
2250  $extra = "\nproject = \"$project_name\"";
2251  }
2252  $date = date('Y-m-d', $datestamp);
2253  $info = <<<METADATA
2254 
2255 ; Information added by drush on {$date}
2256 version = "{$version}"{$extra}
2257 datestamp = "{$datestamp}"
2258 METADATA;
2259  return $info;
2260 }
2261 
2262 /**
2263  * Generate version information for `.info` files in YAML format.
2264  */
2265 function _drush_pm_generate_info_yaml_metadata($version, $project_name, $datestamp) {
2266  $matches = array();
2267  $extra = '';
2268  if (preg_match('/^((\d+)\.x)-.*/', $version, $matches) && $matches[2] >= 6) {
2269  $extra .= "\ncore: '$matches[1]'";
2270  }
2271  if (!drush_get_option('no-gitprojectinfo', FALSE)) {
2272  $extra = "\nproject: '$project_name'";
2273  }
2274  $date = date('Y-m-d', $datestamp);
2275  $info = <<<METADATA
2276 
2277 # Information added by drush on {$date}
2278 version: '{$version}'{$extra}
2279 datestamp: {$datestamp}
2280 METADATA;
2281  return $info;
2282 }

File

doxygen/html/pm_8drush_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: commands/pm/pm.drush.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="namespaces.html"><span>Namespaces</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><a href="examples.html"><span>Examples</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>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><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_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_15591510fc66414792ea8adada328324.html">pm</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">pm.drush.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="pm_8drush_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"> * @file</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *  The drush Project Manager</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"> * Terminology:</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * - Request: a requested project (string or keyed array), with a name and (optionally) version.</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> * - Project: a drupal.org project (i.e drupal.org/project/*), such as cck or zen.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * - Extension: a drupal.org module, theme or profile.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> * - Version: a requested version, such as 1.0 or 1.x-dev.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * - Release: a specific release of a project, with associated metadata (from the drupal.org update service).</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;use <a class="code" href="classDrush_1_1Log_1_1LogLevel.html">Drush\Log\LogLevel</a>;</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * @defgroup update_status_constants Update Status Constants</span></div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * @{</span></div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * Represents update status of projects.</span></div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * The first set is a mapping of some constants declared in update.module.</span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * We only declare the ones we&#39;re interested in.</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * The rest of the constants are used by pm-updatestatus to represent</span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * a status when the user asked for updates to specific versions or</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * other circumstances not managed by Drupal.</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"></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"> * Project is missing security update(s).</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> * Maps UPDATE_NOT_SECURE.</span></div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga918cb5889628bfe19f89994fe783d316">   34</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga918cb5889628bfe19f89994fe783d316">DRUSH_UPDATESTATUS_NOT_SECURE</a> = 1;</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="comment"> * Current release has been unpublished and is no longer available.</span></div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="comment"> * Maps UPDATE_REVOKED.</span></div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga7001366d29fd9e6850adfc7a50268d43">   41</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga7001366d29fd9e6850adfc7a50268d43">DRUSH_UPDATESTATUS_REVOKED</a> = 2;</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment"> * Current release is no longer supported by the project maintainer.</span></div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment"> * Maps UPDATE_NOT_SUPPORTED.</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#gae537168de4ff82cdf56935069308a76e">   48</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#gae537168de4ff82cdf56935069308a76e">DRUSH_UPDATESTATUS_NOT_SUPPORTED</a> = 3;</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="comment"> * Project has a new release available, but it is not a security release.</span></div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="comment"> * Maps UPDATE_NOT_CURRENT.</span></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"><a class="code" href="group__update__status__constants.html#ga116eef4eb91f5de04d202001a3ec2434">   55</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga116eef4eb91f5de04d202001a3ec2434">DRUSH_UPDATESTATUS_NOT_CURRENT</a> = 4;</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="comment"> * Project is up to date.</span></div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment"> * Maps UPDATE_CURRENT.</span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga8defa0fa7ad8fca45092fc38ea4827f2">   62</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga8defa0fa7ad8fca45092fc38ea4827f2">DRUSH_UPDATESTATUS_CURRENT</a> = 5;</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="comment"> * Project&#39;s status cannot be checked.</span></div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="comment"> * Maps UPDATE_NOT_CHECKED.</span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga0377766d554ff53106013ff33f4c4d4f">   69</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga0377766d554ff53106013ff33f4c4d4f">DRUSH_UPDATESTATUS_NOT_CHECKED</a> = -1;</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment"> * No available update data was found for project.</span></div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;<span class="comment"> * Maps UPDATE_UNKNOWN.</span></div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#gadc68fb204f7cf9b617bc535b186bf52b">   76</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#gadc68fb204f7cf9b617bc535b186bf52b">DRUSH_UPDATESTATUS_UNKNOWN</a> = -2;</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="comment"> * There was a failure fetching available update data for this project.</span></div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="comment"> * Maps UPDATE_NOT_FETCHED.</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga464080d1388055cc83603a2af90e5fcf">   83</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga464080d1388055cc83603a2af90e5fcf">DRUSH_UPDATESTATUS_NOT_FETCHED</a> = -3;</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment"> * We need to (re)fetch available update data for this project.</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment"> * Maps UPDATE_FETCH_PENDING.</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga268ae4eb606a8037187935ffbca3487d">   90</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga268ae4eb606a8037187935ffbca3487d">DRUSH_UPDATESTATUS_FETCH_PENDING</a> = -4;</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="comment"></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"> * Project was not packaged by drupal.org.</span></div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga316e3a19b62311a8f08dcc80d9ac5831">   95</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga316e3a19b62311a8f08dcc80d9ac5831">DRUSH_UPDATESTATUS_PROJECT_NOT_PACKAGED</a> = 101;</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment"> * Requested project is not updateable.</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga7821938e154beee37aa66cc318968758">  100</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga7821938e154beee37aa66cc318968758">DRUSH_UPDATESTATUS_REQUESTED_PROJECT_NOT_UPDATEABLE</a> = 102;</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">  102</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="comment"> * Requested project not found.</span></div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga71d58397456e772fc7c07509d6ee56a8">  105</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga71d58397456e772fc7c07509d6ee56a8">DRUSH_UPDATESTATUS_REQUESTED_PROJECT_NOT_FOUND</a> = 103;</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;<span class="comment"> * Requested version not found.</span></div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga4b9fafd134b17977395dbed65ab78a23">  110</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga4b9fafd134b17977395dbed65ab78a23">DRUSH_UPDATESTATUS_REQUESTED_VERSION_NOT_FOUND</a> = 104;</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<span class="comment"> * Requested version available.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#ga03dc2bd26265472251e963ff39287976">  115</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#ga03dc2bd26265472251e963ff39287976">DRUSH_UPDATESTATUS_REQUESTED_VERSION_NOT_CURRENT</a> = 105;</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="comment"> * Requested version already installed.</span></div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"><a class="code" href="group__update__status__constants.html#gabef5f885e3daf49efed8339b0f6c39ec">  120</a></span>&#160;<span class="keyword">const</span> <a class="code" href="group__update__status__constants.html#gabef5f885e3daf49efed8339b0f6c39ec">DRUSH_UPDATESTATUS_REQUESTED_VERSION_CURRENT</a> = 106;</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment"> * @} End of &quot;defgroup update_status_constants&quot;.</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="comment"> * Implementation of hook_drush_help().</span></div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1c1a16dd9ec4745047ca003805ee10f6">  129</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a1c1a16dd9ec4745047ca003805ee10f6">pm_drush_help</a>($section) {</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  <span class="keywordflow">switch</span> ($section) {</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:pm:title&#39;</span>:</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Project manager commands&#39;</span>);</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:pm:summary&#39;</span>:</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Download, enable, examine and update your modules and themes.&#39;</span>);</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-enable&#39;</span>:</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Enable one or more extensions (modules or themes). Enable dependant extensions as well.&#39;</span>);</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-disable&#39;</span>:</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Disable one or more extensions (modules or themes). Disable dependant extensions as well.&#39;</span>);</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-updatecode&#39;</span>:</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-update&#39;</span>:</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;      $message = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Display available update information for Drupal core and all enabled projects and allow updating to latest recommended releases.&quot;</span>);</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;      <span class="keywordflow">if</span> ($section == <span class="stringliteral">&#39;drush:pm-update&#39;</span>) {</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        $message .= <span class="charliteral">&#39; &#39;</span>.dt(<span class="stringliteral">&quot;Also apply any database updates required (same as pm-updatecode + updatedb).&quot;</span>);</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;      }</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;      $message .= <span class="charliteral">&#39; &#39;</span>.dt(<span class="stringliteral">&quot;Note: The user is asked to confirm before the actual update. Backups are performed unless directory is already under version control. Updated projects can potentially break your site. It is NOT recommended to update production sites without prior testing.&quot;</span>);</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;      <span class="keywordflow">return</span> $message;</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-updatecode-postupdate&#39;</span>:</div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;This is a helper command needed by updatecode. It is used to check for db updates in a backend process after code updated have been performed. We need to run this task in a separate process to not conflict with old code already in memory.&quot;</span>);</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-download&#39;</span>:</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Download Drupal core or projects from drupal.org (Drupal core, modules, themes or profiles) and other sources. It will automatically figure out which project version you want based on its recommended release, or you may specify a particular version.</span></div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="stringliteral"></span></div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="stringliteral">If no --destination is provided, then destination depends on the project type:</span></div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="stringliteral">  - Profiles will be downloaded to profiles/ in your Drupal root.</span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="stringliteral">  - Modules and themes will be downloaded to the site specific directory (sites/example.com/modules|themes) if available, or to the site wide directory otherwise.</span></div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="stringliteral">  - If you&#39;re downloading drupal core or you are not running the command within a bootstrapped drupal site, the default location is the current directory.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="stringliteral">  - Drush commands will be relocated to @site_wide_location (if available) or ~/.drush. Relocation is determined once the project is downloaded by examining its content. Note you can provide your own function in a commandfile to determine the relocation of any project.&quot;</span>, array(<span class="stringliteral">&#39;@site_wide_location&#39;</span> =&gt; <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SITE_WIDE_COMMANDFILES&#39;</span>)));</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;  }</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;<span class="comment"></span></div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;<span class="comment"> * Implementation of hook_drush_command().</span></div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a9f267e6ae37b4f67eccab48af016ef2d">  163</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a9f267e6ae37b4f67eccab48af016ef2d">pm_drush_command</a>() {</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;  $update_options = array(</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="stringliteral">&#39;lock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Add a persistent lock to remove the specified projects from consideration during updates.  Locks may be removed with the --unlock parameter, or overridden by specifically naming the project as a parameter to pm-update or pm-updatecode.  The lock does not affect pm-download.  See also the update_advanced project for similar and improved functionality.&#39;</span>,</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;      <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;foo,bar&#39;</span>,</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;  );</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;  $update_suboptions = array(</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="stringliteral">&#39;lock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;      <span class="stringliteral">&#39;lock-message&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;A brief message explaining why a project is being locked; displayed during pm-updatecode.  Optional.&#39;</span>,</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;message&#39;</span>,</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;      <span class="stringliteral">&#39;unlock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Remove the persistent lock from the specified projects so that they may be updated again.&#39;</span>,</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;foo,bar&#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;  );</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;  $items[<span class="stringliteral">&#39;pm-enable&#39;</span>] = array(</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Enable one or more extensions (modules or themes).&#39;</span>,</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      <span class="stringliteral">&#39;extensions&#39;</span> =&gt; <span class="stringliteral">&#39;A list of modules or themes. You can use the * wildcard at the end of extension names to enable all matches.&#39;</span>,</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    ),</div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;      <span class="stringliteral">&#39;resolve-dependencies&#39;</span> =&gt; <span class="stringliteral">&#39;Attempt to download any missing dependencies. At the moment, only works when the module name is the same as the project name.&#39;</span>,</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;      <span class="stringliteral">&#39;skip&#39;</span> =&gt; <span class="stringliteral">&#39;Skip automatic downloading of libraries (c.f. devel).&#39;</span>,</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    ),</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;en&#39;</span>),</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;      ),</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    ),</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;  );</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;  $items[<span class="stringliteral">&#39;pm-disable&#39;</span>] = array(</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Disable one or more extensions (modules or themes).&#39;</span>,</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;      <span class="stringliteral">&#39;extensions&#39;</span> =&gt; <span class="stringliteral">&#39;A list of modules or themes. You can use the * wildcard at the end of extension names to disable multiple matches.&#39;</span>,</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    ),</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;dis&#39;</span>),</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;      ),</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;  $items[<span class="stringliteral">&#39;pm-info&#39;</span>] = array(</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Show detailed info for one or more extensions (modules or themes).&#39;</span>,</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;      <span class="stringliteral">&#39;extensions&#39;</span> =&gt; <span class="stringliteral">&#39;A list of modules or themes. You can use the * wildcard at the end of extension names to show info for multiple matches. If no argument is provided it will show info for all available extensions.&#39;</span>,</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    ),</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pmi&#39;</span>),</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;key-value-list&#39;</span>,</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;json&#39;</span>,</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;      <span class="stringliteral">&#39;formatted-filter&#39;</span> =&gt; <span class="stringliteral">&#39;_drush_pm_info_format_table_data&#39;</span>,</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;        <span class="stringliteral">&#39;extension&#39;</span> =&gt; <span class="stringliteral">&#39;Extension&#39;</span>,</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;        <span class="stringliteral">&#39;project&#39;</span> =&gt; <span class="stringliteral">&#39;Project&#39;</span>,</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;        <span class="stringliteral">&#39;type&#39;</span> =&gt; <span class="stringliteral">&#39;Type&#39;</span>,</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;        <span class="stringliteral">&#39;title&#39;</span> =&gt; <span class="stringliteral">&#39;Title&#39;</span>,</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Description&#39;</span>,</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;        <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;Version&#39;</span>,</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;        <span class="stringliteral">&#39;date&#39;</span> =&gt; <span class="stringliteral">&#39;Date&#39;</span>,</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        <span class="stringliteral">&#39;package&#39;</span> =&gt; <span class="stringliteral">&#39;Package&#39;</span>,</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;        <span class="stringliteral">&#39;core&#39;</span> =&gt; <span class="stringliteral">&#39;Core&#39;</span>,</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        <span class="stringliteral">&#39;php&#39;</span> =&gt; <span class="stringliteral">&#39;PHP&#39;</span>,</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;        <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>,</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;        <span class="stringliteral">&#39;path&#39;</span> =&gt; <span class="stringliteral">&#39;Path&#39;</span>,</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;        <span class="stringliteral">&#39;schema_version&#39;</span> =&gt; <span class="stringliteral">&#39;Schema version&#39;</span>,</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;        <span class="stringliteral">&#39;files&#39;</span> =&gt; <span class="stringliteral">&#39;Files&#39;</span>,</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;        <span class="stringliteral">&#39;requires&#39;</span> =&gt; <span class="stringliteral">&#39;Requires&#39;</span>,</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        <span class="stringliteral">&#39;required_by&#39;</span> =&gt; <span class="stringliteral">&#39;Required by&#39;</span>,</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;        <span class="stringliteral">&#39;permissions&#39;</span> =&gt; <span class="stringliteral">&#39;Permissions&#39;</span>,</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        <span class="stringliteral">&#39;config&#39;</span> =&gt; <span class="stringliteral">&#39;Configure&#39;</span>,</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;        <span class="stringliteral">&#39;engine&#39;</span> =&gt; <span class="stringliteral">&#39;Engine&#39;</span>,</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;        <span class="stringliteral">&#39;base_theme&#39;</span> =&gt; <span class="stringliteral">&#39;Base theme&#39;</span>,</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        <span class="stringliteral">&#39;regions&#39;</span> =&gt; <span class="stringliteral">&#39;Regions&#39;</span>,</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;        <span class="stringliteral">&#39;features&#39;</span> =&gt; <span class="stringliteral">&#39;Features&#39;</span>,</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;        <span class="stringliteral">&#39;stylesheets&#39;</span> =&gt; <span class="stringliteral">&#39;Stylesheets&#39;</span>,</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;        <span class="comment">// &#39;media_&#39; . $media  =&gt; &#39;Media &#39;. $media for each $info-&gt;info[&#39;stylesheets&#39;] as $media =&gt; $files</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;        <span class="stringliteral">&#39;scripts&#39;</span> =&gt; <span class="stringliteral">&#39;Scripts&#39;</span>,</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;      ),</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;      <span class="stringliteral">&#39;output-data-type&#39;</span> =&gt; <span class="stringliteral">&#39;format-table&#39;</span>,</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    ),</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  );</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;  $items[<span class="stringliteral">&#39;pm-projectinfo&#39;</span>] = array(</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Show a report of available projects and their extensions.&#39;</span>,</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;Optional. A list of installed projects to show.&#39;</span>,</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    ),</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;      <span class="stringliteral">&#39;drush&#39;</span> =&gt; <span class="stringliteral">&#39;Optional. Only incude projects that have one or more Drush commands.&#39;</span>,</div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;      <span class="stringliteral">&#39;status&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Filter by project status. Choices: enabled, disabled. A project is considered enabled when at least one of its extensions is enabled.&#39;</span>,</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;enabled&#39;</span>,</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;      ),</div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;    ),</div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;key-value-list&#39;</span>,</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;json&#39;</span>,</div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        <span class="stringliteral">&#39;label&#39;</span>      =&gt; <span class="stringliteral">&#39;Name&#39;</span>,</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;        <span class="stringliteral">&#39;type&#39;</span>       =&gt; <span class="stringliteral">&#39;Type&#39;</span>,</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        <span class="stringliteral">&#39;version&#39;</span>    =&gt; <span class="stringliteral">&#39;Version&#39;</span>,</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        <span class="stringliteral">&#39;status&#39;</span>     =&gt; <span class="stringliteral">&#39;Status&#39;</span>,</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        <span class="stringliteral">&#39;extensions&#39;</span> =&gt; <span class="stringliteral">&#39;Extensions&#39;</span>,</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;        <span class="stringliteral">&#39;drush&#39;</span>      =&gt; <span class="stringliteral">&#39;Drush Commands&#39;</span>,</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;        <span class="stringliteral">&#39;datestamp&#39;</span>  =&gt; <span class="stringliteral">&#39;Datestamp&#39;</span>,</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;        <span class="stringliteral">&#39;path&#39;</span>       =&gt; <span class="stringliteral">&#39;Path&#39;</span>,</div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;      ),</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;      <span class="stringliteral">&#39;fields-default&#39;</span> =&gt; array(<span class="stringliteral">&#39;label&#39;</span>, <span class="stringliteral">&#39;type&#39;</span>, <span class="stringliteral">&#39;version&#39;</span>, <span class="stringliteral">&#39;status&#39;</span>, <span class="stringliteral">&#39;extensions&#39;</span>, <span class="stringliteral">&#39;drush&#39;</span>, <span class="stringliteral">&#39;datestamp&#39;</span>, <span class="stringliteral">&#39;path&#39;</span>),</div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;      <span class="stringliteral">&#39;fields-pipe&#39;</span> =&gt; array(<span class="stringliteral">&#39;label&#39;</span>),</div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;      <span class="stringliteral">&#39;output-data-type&#39;</span> =&gt; <span class="stringliteral">&#39;format-table&#39;</span>,</div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    ),</div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pmpi&#39;</span>),</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;  );</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;  <span class="comment">// Install command is reserved for the download and enable of projects including dependencies.</span></div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;  <span class="comment">// @see http://drupal.org/node/112692 for more information.</span></div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  <span class="comment">// $items[&#39;install&#39;] = array(</span></div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  <span class="comment">//     &#39;description&#39; =&gt; &#39;Download and enable one or more modules&#39;,</span></div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;  <span class="comment">//   );</span></div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;  $items[<span class="stringliteral">&#39;pm-uninstall&#39;</span>] = array(</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Uninstall one or more modules.&#39;</span>,</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;      <span class="stringliteral">&#39;modules&#39;</span> =&gt; <span class="stringliteral">&#39;A list of modules.&#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="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pmu&#39;</span>),</div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;  );</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;  $items[<span class="stringliteral">&#39;pm-list&#39;</span>] = array(</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Show a list of available extensions (modules and themes).&#39;</span>,</div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    <span class="stringliteral">&#39;callback arguments&#39;</span> =&gt; array(array(), FALSE),</div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;      <span class="stringliteral">&#39;type&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Filter by extension type. Choices: module, theme.&#39;</span>,</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;module&#39;</span>,</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;      ),</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;      <span class="stringliteral">&#39;status&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Filter by extension status. Choices: enabled, disabled and/or \&#39;not installed\&#39;. You can use multiple comma separated values. (i.e. --status=&quot;disabled,not installed&quot;).&#39;</span>,</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;disabled&#39;</span>,</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;      <span class="stringliteral">&#39;package&#39;</span> =&gt; <span class="stringliteral">&#39;Filter by project packages. You can use multiple comma separated values. (i.e. --package=&quot;Core - required,Other&quot;).&#39;</span>,</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;      <span class="stringliteral">&#39;core&#39;</span> =&gt; <span class="stringliteral">&#39;Filter out extensions that are not in drupal core.&#39;</span>,</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;      <span class="stringliteral">&#39;no-core&#39;</span> =&gt; <span class="stringliteral">&#39;Filter out extensions that are provided by drupal core.&#39;</span>,</div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    ),</div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;list&#39;</span>,</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(<span class="stringliteral">&#39;package&#39;</span> =&gt; <span class="stringliteral">&#39;Package&#39;</span>, <span class="stringliteral">&#39;name&#39;</span> =&gt; <span class="stringliteral">&#39;Name&#39;</span>, <span class="stringliteral">&#39;type&#39;</span> =&gt; <span class="stringliteral">&#39;Type&#39;</span>, <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>, <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;Version&#39;</span>),</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;      <span class="stringliteral">&#39;output-data-type&#39;</span> =&gt; <span class="stringliteral">&#39;format-table&#39;</span>,</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    ),</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pml&#39;</span>),</div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;  );</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;  $items[<span class="stringliteral">&#39;pm-refresh&#39;</span>] = array(</div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Refresh update status information.&#39;</span>,</div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;      <span class="stringliteral">&#39;update_status&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</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;    ),</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rf&#39;</span>),</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;  );</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;  $items[<span class="stringliteral">&#39;pm-updatestatus&#39;</span>] = array(</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Show a report of available minor updates to Drupal core and contrib projects.&#39;</span>,</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;Optional. A list of installed projects to show.&#39;</span>,</div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    ),</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;      <span class="stringliteral">&#39;pipe&#39;</span> =&gt; <span class="stringliteral">&#39;Return a list of the projects with any extensions enabled that need updating, one project per line.&#39;</span>,</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    ) + $update_options,</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; $update_suboptions,</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;      <span class="stringliteral">&#39;update_status&#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="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;list&#39;</span>,</div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(<span class="stringliteral">&#39;name&#39;</span> =&gt; <span class="stringliteral">&#39;Short Name&#39;</span>, <span class="stringliteral">&#39;label&#39;</span> =&gt; <span class="stringliteral">&#39;Name&#39;</span>, <span class="stringliteral">&#39;existing_version&#39;</span> =&gt; <span class="stringliteral">&#39;Installed Version&#39;</span>, <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>, <span class="stringliteral">&#39;status_msg&#39;</span> =&gt; <span class="stringliteral">&#39;Message&#39;</span>, <span class="stringliteral">&#39;candidate_version&#39;</span> =&gt; <span class="stringliteral">&#39;Proposed version&#39;</span>),</div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;      <span class="stringliteral">&#39;fields-default&#39;</span> =&gt; array(<span class="stringliteral">&#39;label&#39;</span>, <span class="stringliteral">&#39;existing_version&#39;</span>, <span class="stringliteral">&#39;candidate_version&#39;</span>, <span class="stringliteral">&#39;status_msg&#39;</span> ),</div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;      <span class="stringliteral">&#39;fields-pipe&#39;</span> =&gt; array(<span class="stringliteral">&#39;name&#39;</span>, <span class="stringliteral">&#39;existing_version&#39;</span>, <span class="stringliteral">&#39;candidate_version&#39;</span>, <span class="stringliteral">&#39;status_msg&#39;</span>),</div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;      <span class="stringliteral">&#39;output-data-type&#39;</span> =&gt; <span class="stringliteral">&#39;format-table&#39;</span>,</div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    ),</div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;ups&#39;</span>),</div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;  );</div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;  $items[<span class="stringliteral">&#39;pm-updatecode&#39;</span>] = array(</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Update Drupal core and contrib projects to latest recommended releases.&#39;</span>,</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;      <span class="stringliteral">&#39;drush pm-updatecode --no-core&#39;</span> =&gt; <span class="stringliteral">&#39;Update contrib projects, but skip core.&#39;</span>,</div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;      <span class="stringliteral">&#39;drush pm-updatestatus --format=csv --list-separator=&quot; &quot; --fields=&quot;name,existing_version,candidate_version,status_msg&quot;&#39;</span> =&gt; <span class="stringliteral">&#39;To show a list of projects with their update status, use pm-updatestatus instead of pm-updatecode.&#39;</span>,</div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    ),</div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;Optional. A list of installed projects to update.&#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="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;      <span class="stringliteral">&#39;notes&#39;</span> =&gt; <span class="stringliteral">&#39;Show release notes for each project to be updated.&#39;</span>,</div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;      <span class="stringliteral">&#39;no-core&#39;</span> =&gt; <span class="stringliteral">&#39;Only update modules and skip the core update.&#39;</span>,</div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;      <span class="stringliteral">&#39;check-updatedb&#39;</span> =&gt; <span class="stringliteral">&#39;Check to see if an updatedb is needed after updating the code. Default is on; use --check-updatedb=0 to disable.&#39;</span>,</div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;    ) + $update_options,</div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; $update_suboptions,</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;upc&#39;</span>),</div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    <span class="stringliteral">&#39;topics&#39;</span> =&gt; array(<span class="stringliteral">&#39;docs-policy&#39;</span>),</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</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="stringliteral">&#39;update_status&#39;</span>,</div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    ),</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;  <span class="comment">// Merge all items from above.</span></div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;  $items[<span class="stringliteral">&#39;pm-update&#39;</span>] = array(</div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Update Drupal core and contrib projects and apply any pending database updates (Same as pm-updatecode + updatedb).&#39;</span>,</div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;up&#39;</span>),</div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    <span class="stringliteral">&#39;allow-additional-options&#39;</span> =&gt; array(<span class="stringliteral">&#39;pm-updatecode&#39;</span>, <span class="stringliteral">&#39;updatedb&#39;</span>),</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;  $items[<span class="stringliteral">&#39;pm-updatecode-postupdate&#39;</span>] = array(</div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Notify of pending db updates.&#39;</span>,</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;  );</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;  $items[<span class="stringliteral">&#39;pm-releasenotes&#39;</span>] = array(</div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Print release notes for given projects.&#39;</span>,</div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;A list of project names, with optional version. Defaults to \&#39;drupal\&#39;&#39;</span>,</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="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;      <span class="stringliteral">&#39;html&#39;</span> =&gt; <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Display release notes in HTML rather than plain text.&#39;</span>),</div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    ),</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;      <span class="stringliteral">&#39;drush rln cck&#39;</span> =&gt; <span class="stringliteral">&#39;Prints the release notes for the recommended version of CCK project.&#39;</span>,</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;      <span class="stringliteral">&#39;drush rln token-1.13&#39;</span> =&gt; <span class="stringliteral">&#39;View release notes of a specfic version of the Token project for my version of Drupal.&#39;</span>,</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;      <span class="stringliteral">&#39;drush rln pathauto zen&#39;</span> =&gt; <span class="stringliteral">&#39;View release notes for the recommended version of Pathauto and Zen projects.&#39;</span>,</div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    ),</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rln&#39;</span>),</div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; DRUSH_BOOTSTRAP_MAX,</div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span>,</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;  );</div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;  $items[<span class="stringliteral">&#39;pm-releases&#39;</span>] = array(</div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Print release information for given projects.&#39;</span>,</div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;A list of drupal.org project names. Defaults to \&#39;drupal\&#39;&#39;</span>,</div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    ),</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;      <span class="stringliteral">&#39;drush pm-releases cck zen&#39;</span> =&gt; <span class="stringliteral">&#39;View releases for cck and Zen projects for your Drupal version.&#39;</span>,</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    ),</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;      <span class="stringliteral">&#39;default-major&#39;</span> =&gt; <span class="stringliteral">&#39;Show releases compatible with the specified major version of Drupal.&#39;</span>,</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    ),</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rl&#39;</span>),</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; DRUSH_BOOTSTRAP_MAX,</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;csv&#39;</span>,</div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;        <span class="stringliteral">&#39;project&#39;</span> =&gt; <span class="stringliteral">&#39;Project&#39;</span>,</div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;        <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;Release&#39;</span>,</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        <span class="stringliteral">&#39;date&#39;</span> =&gt; <span class="stringliteral">&#39;Date&#39;</span>,</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;        <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>,</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;        <span class="stringliteral">&#39;release_link&#39;</span> =&gt; <span class="stringliteral">&#39;Release link&#39;</span>,</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        <span class="stringliteral">&#39;download_link&#39;</span> =&gt; <span class="stringliteral">&#39;Download link&#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;      <span class="stringliteral">&#39;fields-default&#39;</span> =&gt; array(<span class="stringliteral">&#39;project&#39;</span>, <span class="stringliteral">&#39;version&#39;</span>, <span class="stringliteral">&#39;date&#39;</span>, <span class="stringliteral">&#39;status&#39;</span>),</div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;      <span class="stringliteral">&#39;fields-pipe&#39;</span> =&gt; array(<span class="stringliteral">&#39;project&#39;</span>, <span class="stringliteral">&#39;version&#39;</span>, <span class="stringliteral">&#39;date&#39;</span>, <span class="stringliteral">&#39;status&#39;</span>),</div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;      <span class="stringliteral">&#39;output-data-type&#39;</span> =&gt; <span class="stringliteral">&#39;format-table&#39;</span>,</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;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span>,</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    ),</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;  $items[<span class="stringliteral">&#39;pm-download&#39;</span>] = array(</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Download projects from drupal.org or other sources.&#39;</span>,</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;      <span class="stringliteral">&#39;drush dl drupal&#39;</span> =&gt; <span class="stringliteral">&#39;Download latest recommended release of Drupal core.&#39;</span>,</div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;      <span class="stringliteral">&#39;drush dl drupal-7.x&#39;</span> =&gt; <span class="stringliteral">&#39;Download latest 7.x development version of Drupal core.&#39;</span>,</div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;      <span class="stringliteral">&#39;drush dl drupal-6&#39;</span> =&gt; <span class="stringliteral">&#39;Download latest recommended release of Drupal 6.x.&#39;</span>,</div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;      <span class="stringliteral">&#39;drush dl cck zen&#39;</span> =&gt; <span class="stringliteral">&#39;Download latest versions of CCK and Zen projects.&#39;</span>,</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;      <span class="stringliteral">&#39;drush dl og-1.3&#39;</span> =&gt; <span class="stringliteral">&#39;Download a specfic version of Organic groups module for my version of Drupal.&#39;</span>,</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;      <span class="stringliteral">&#39;drush dl diff-6.x-2.x&#39;</span> =&gt; <span class="stringliteral">&#39;Download a specific development branch of diff module for a specific Drupal version.&#39;</span>,</div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;      <span class="stringliteral">&#39;drush dl views --select&#39;</span> =&gt; <span class="stringliteral">&#39;Show a list of recent releases of the views project, prompt for which one to download.&#39;</span>,</div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;      <span class="stringliteral">&#39;drush dl webform --dev&#39;</span> =&gt; <span class="stringliteral">&#39;Download the latest dev release of webform.&#39;</span>,</div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;      <span class="stringliteral">&#39;drush dl webform --cache&#39;</span> =&gt; <span class="stringliteral">&#39;Download webform. Fetch and populate the download cache as needed.&#39;</span>,</div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    ),</div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;      <span class="stringliteral">&#39;projects&#39;</span> =&gt; <span class="stringliteral">&#39;A comma delimited list of drupal.org project names, with optional version. Defaults to \&#39;drupal\&#39;&#39;</span>,</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    ),</div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;      <span class="stringliteral">&#39;destination&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Path to which the project will be copied. If you\&#39;re providing a relative path, note it is relative to the drupal root (if bootstrapped).&#39;</span>,</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;path&#39;</span>,</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;      ),</div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;      <span class="stringliteral">&#39;use-site-dir&#39;</span> =&gt; <span class="stringliteral">&#39;Force to use the site specific directory. It will create the directory if it doesn\&#39;t exist. If --destination is also present this option will be ignored.&#39;</span>,</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;      <span class="stringliteral">&#39;notes&#39;</span> =&gt; <span class="stringliteral">&#39;Show release notes after each project is downloaded.&#39;</span>,</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;      <span class="stringliteral">&#39;variant&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&quot;Only useful for install profiles. Possible values: &#39;full&#39;, &#39;projects&#39;, &#39;profile-only&#39;.&quot;</span>,</div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;full&#39;</span>,</div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;      ),</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;      <span class="stringliteral">&#39;select&#39;</span> =&gt; <span class="stringliteral">&quot;Select the version to download interactively from a list of available releases.&quot;</span>,</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;      <span class="stringliteral">&#39;drupal-project-rename&#39;</span> =&gt; <span class="stringliteral">&#39;Alternate name for &quot;drupal-x.y&quot; directory when downloading Drupal project. Defaults to &quot;drupal&quot;.&#39;</span>,</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;      <span class="stringliteral">&#39;default-major&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Specify the default major version of modules to download when there is no bootstrapped Drupal site.  Defaults to &quot;8&quot;.&#39;</span>,</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="charliteral">&#39;7&#39;</span>,</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;      ),</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;      <span class="stringliteral">&#39;skip&#39;</span> =&gt; <span class="stringliteral">&#39;Skip automatic downloading of libraries (c.f. devel).&#39;</span>,</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;      <span class="stringliteral">&#39;pipe&#39;</span> =&gt; <span class="stringliteral">&#39;Returns a list of the names of the extensions (modules and themes) contained in the downloaded projects.&#39;</span>,</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    ),</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; DRUSH_BOOTSTRAP_MAX,</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;dl&#39;</span>),</div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span>,</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    ),</div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;  );</div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;  <span class="keywordflow">return</span> $items;</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="comment"></span></div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;<span class="comment"> * @defgroup extensions Extensions management.</span></div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;<span class="comment"> * @{</span></div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;<span class="comment"> * Functions to manage extensions.</span></div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"><a class="code" href="group__extensions.html#gaa73b0927e4816cee72525c0cd11806cf">  496</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gaa73b0927e4816cee72525c0cd11806cf">pm_pm_enable_complete</a>() {</div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">pm_complete_extensions</a>();</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;}</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"><a class="code" href="group__extensions.html#gaf6c3c4950e28ca5c42a1acea642dc4dc">  503</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gaf6c3c4950e28ca5c42a1acea642dc4dc">pm_pm_disable_complete</a>() {</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">pm_complete_extensions</a>();</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="comment"></span></div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00510"></a><span class="lineno"><a class="code" href="group__extensions.html#gab04aadc8b47dfaea519eb7ba8a1f5987">  510</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gab04aadc8b47dfaea519eb7ba8a1f5987">pm_pm_uninstall_complete</a>() {</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">pm_complete_extensions</a>();</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;<span class="comment"></span></div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00517"></a><span class="lineno"><a class="code" href="group__extensions.html#ga18cd171a0bb29c28004db2ed171d2ad1">  517</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga18cd171a0bb29c28004db2ed171d2ad1">pm_pm_info_complete</a>() {</div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">pm_complete_extensions</a>();</div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;}</div>
<div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00524"></a><span class="lineno"><a class="code" href="group__extensions.html#ga670a170ad2562529d58573ec2ed1ebe4">  524</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga670a170ad2562529d58573ec2ed1ebe4">pm_pm_releasenotes_complete</a>() {</div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">pm_complete_projects</a>();</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;<span class="comment"></span></div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;<span class="comment"> * Command argument complete callback.</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"><a class="code" href="group__extensions.html#ga78c34201d4460b12e4d9147016148a15">  531</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga78c34201d4460b12e4d9147016148a15">pm_pm_releases_complete</a>() {</div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">pm_complete_projects</a>();</div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;}</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">  535</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00538"></a><span class="lineno"><a class="code" href="group__extensions.html#gaade766269d76ac34bc95d778f52bbc94">  538</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gaade766269d76ac34bc95d778f52bbc94">pm_pm_updatecode_complete</a>() {</div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">pm_complete_projects</a>();</div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;}</div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00545"></a><span class="lineno"><a class="code" href="group__extensions.html#gac730d5229aef78e026d8383eeb0af375">  545</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gac730d5229aef78e026d8383eeb0af375">pm_pm_update_complete</a>() {</div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">pm_complete_projects</a>();</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;}</div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;<span class="comment"> * List extensions for completion.</span></div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;<span class="comment"> *  Array of available extensions.</span></div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00555"></a><span class="lineno"><a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">  555</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">pm_complete_extensions</a>() {</div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;  <span class="keywordflow">if</span> (drush_bootstrap_max(DRUSH_BOOTSTRAP_DRUPAL_FULL)) {</div>
<div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>(FALSE);</div>
<div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    <span class="keywordflow">return</span> array(<span class="stringliteral">&#39;values&#39;</span> =&gt; array_keys($extension_info));</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;}</div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;<span class="comment"> * List projects for completion.</span></div>
<div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;<span class="comment"> *  Array of installed projects.</span></div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"><a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">  568</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">pm_complete_projects</a>() {</div>
<div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;  <span class="keywordflow">if</span> (drush_bootstrap_max(DRUSH_BOOTSTRAP_DRUPAL_FULL)) {</div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;    <span class="keywordflow">return</span> array(<span class="stringliteral">&#39;values&#39;</span> =&gt; array_keys(<a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>()));</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;<span class="comment"></span></div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;<span class="comment"> * Sort callback function for sorting extensions.</span></div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;<span class="comment"> * It will sort first by type, second by package and third by name.</span></div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00579"></a><span class="lineno"><a class="code" href="group__extensions.html#ga293092b949a0837e3208f57ddb837c3c">  579</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga293092b949a0837e3208f57ddb837c3c">_drush_pm_sort_extensions</a>($a, $b) {</div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;  $a_type = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($a);</div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;  $b_type = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($b);</div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;  <span class="keywordflow">if</span> ($a_type == <span class="stringliteral">&#39;module&#39;</span> &amp;&amp; $b_type == <span class="stringliteral">&#39;theme&#39;</span>) {</div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    <span class="keywordflow">return</span> -1;</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">if</span> ($a_type == <span class="stringliteral">&#39;theme&#39;</span> &amp;&amp; $b_type == <span class="stringliteral">&#39;module&#39;</span>) {</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    <span class="keywordflow">return</span> 1;</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;  $cmp = strcasecmp($a-&gt;info[<span class="stringliteral">&#39;package&#39;</span>], $b-&gt;info[<span class="stringliteral">&#39;package&#39;</span>]);</div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;  <span class="keywordflow">if</span> ($cmp == 0) {</div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    $cmp = strcasecmp($a-&gt;info[<span class="stringliteral">&#39;name&#39;</span>], $b-&gt;info[<span class="stringliteral">&#39;name&#39;</span>]);</div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;  }</div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;  <span class="keywordflow">return</span> $cmp;</div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;}</div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;<span class="comment"> * Calculate an extension status based on current status and schema version.</span></div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;<span class="comment"> * @param $extension</span></div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;<span class="comment"> *   Object of a single extension info.</span></div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;<span class="comment"> *   String describing extension status. Values: enabled|disabled|not installed</span></div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00604"></a><span class="lineno"><a class="code" href="group__extensions.html#gad7c908db0c414731d0933c93c4b083ea">  604</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gad7c908db0c414731d0933c93c4b083ea">drush_get_extension_status</a>($extension) {</div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;  <span class="keywordflow">if</span> ((<a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension) == <span class="stringliteral">&#39;module&#39;</span>) &amp;&amp; ($extension-&gt;schema_version == -1)) {</div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    $status = <span class="stringliteral">&quot;not installed&quot;</span>;</div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;  }</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    $status = ($extension-&gt;status == 1)?<span class="stringliteral">&#39;enabled&#39;</span>:<span class="stringliteral">&#39;disabled&#39;</span>;</div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;  }</div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;</div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;  <span class="keywordflow">return</span> $status;</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;<span class="comment"></span></div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;<span class="comment"> * Classify extensions as modules, themes or unknown.</span></div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;<span class="comment"> * @param $extensions</span></div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;<span class="comment"> *   Array of extension names, by reference.</span></div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;<span class="comment"> * @param $modules</span></div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;<span class="comment"> *   Empty array to be filled with modules in the provided extension list.</span></div>
<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;<span class="comment"> * @param $themes</span></div>
<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;<span class="comment"> *   Empty array to be filled with themes in the provided extension list.</span></div>
<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00625"></a><span class="lineno"><a class="code" href="group__extensions.html#ga703ad4f08aba6c5246dad9407119cc17">  625</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga703ad4f08aba6c5246dad9407119cc17">drush_pm_classify_extensions</a>(&amp;$extensions, &amp;$modules, &amp;$themes, $extension_info) {</div>
<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;  <a class="code" href="pm_8drush_8inc.html#a5f41049d5b474b8d5bbbe9f161ac1c90">_drush_pm_expand_extensions</a>($extensions, $extension_info);</div>
<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $extension) {</div>
<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;    <span class="keywordflow">if</span> (!isset($extension_info[$extension])) {</div>
<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    }</div>
<div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;    $type = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension_info[$extension]);</div>
<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;module&#39;</span>) {</div>
<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;      $modules[$extension] = $extension;</div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    }</div>
<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;theme&#39;</span>) {</div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;      $themes[$extension] = $extension;</div>
<div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;    }</div>
<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;  }</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="comment"></span></div>
<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;<span class="comment"> * Obtain an array of installed projects off the extensions available.</span></div>
<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;<span class="comment"> * A project is considered to be &#39;enabled&#39; when any of its extensions is</span></div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;<span class="comment"> * enabled.</span></div>
<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;<span class="comment"> * If any extension lacks project information and it is found that the</span></div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;<span class="comment"> * extension was obtained from drupal.org&#39;s cvs or git repositories, a new</span></div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;<span class="comment"> * &#39;vcs&#39; attribute will be set on the extension. Example:</span></div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;<span class="comment"> *   $extensions[name]-&gt;vcs = &#39;cvs&#39;;</span></div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;<span class="comment"> * @param array $extensions</span></div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;<span class="comment"> *   Array of extensions as returned by drush_get_extensions().</span></div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;<span class="comment"> *   Array of installed projects with info of version, status and provided</span></div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;<span class="comment"> * extensions.</span></div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"><a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">  658</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>(&amp;$extensions = NULL) {</div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;  <span class="keywordflow">if</span> (!isset($extensions)) {</div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    $extensions = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;  }</div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;  $projects = array(</div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    <span class="stringliteral">&#39;drupal&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;      <span class="stringliteral">&#39;label&#39;</span>      =&gt; <span class="stringliteral">&#39;Drupal&#39;</span>,</div>
<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;      <span class="stringliteral">&#39;version&#39;</span>    =&gt; <a class="code" href="drupal_8inc.html#a203e989fd043d054d774954e2b2dff21">drush_drupal_version</a>(),</div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;      <span class="stringliteral">&#39;type&#39;</span>       =&gt; <span class="stringliteral">&#39;core&#39;</span>,</div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;      <span class="stringliteral">&#39;extensions&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;    )</div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  );</div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  <span class="keywordflow">if</span> (isset($extensions[<span class="stringliteral">&#39;system&#39;</span>]-&gt;info[<span class="stringliteral">&#39;datestamp&#39;</span>])) {</div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    $projects[<span class="stringliteral">&#39;drupal&#39;</span>][<span class="stringliteral">&#39;datestamp&#39;</span>] = $extensions[<span class="stringliteral">&#39;system&#39;</span>]-&gt;info[<span class="stringliteral">&#39;datestamp&#39;</span>];</div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;  }</div>
<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $extension) {</div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    $extension_name = <a class="code" href="includes_2environment_8inc.html#a317a284967256e1c0452a13462388c21">drush_extension_get_name</a>($extension);</div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    $extension_path = <a class="code" href="includes_2environment_8inc.html#a62a951f395505ed28ea3f0a5a108419c">drush_extension_get_path</a>($extension);</div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;    <span class="comment">// Obtain the project name. It is not available in this cases:</span></div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    <span class="comment">//   1. the extension is part of drupal core.</span></div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;    <span class="comment">//   2. the project was checked out from CVS/git and cvs_deploy/git_deploy</span></div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;    <span class="comment">//      is not installed.</span></div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    <span class="comment">//   3. it is not a project hosted in drupal.org.</span></div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <span class="keywordflow">if</span> (empty($extension-&gt;info[<span class="stringliteral">&#39;project&#39;</span>])) {</div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;      <span class="keywordflow">if</span> (isset($extension-&gt;info[<span class="stringliteral">&#39;version&#39;</span>]) &amp;&amp; ($extension-&gt;info[<span class="stringliteral">&#39;version&#39;</span>] == <a class="code" href="drupal_8inc.html#a203e989fd043d054d774954e2b2dff21">drush_drupal_version</a>())) {</div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;        $project = <span class="stringliteral">&#39;drupal&#39;</span>;</div>
<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;      }</div>
<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;        <span class="keywordflow">if</span> (is_dir($extension_path . <span class="stringliteral">&#39;/CVS&#39;</span>) &amp;&amp; (!<a class="code" href="commands_2core_2drupal_2environment_8inc.html#a643d851fd8dc63ea2ce8cf67aa33098c">drush_module_exists</a>(<span class="stringliteral">&#39;cvs_deploy&#39;</span>))) {</div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;          $extension-&gt;vcs = <span class="stringliteral">&#39;cvs&#39;</span>;</div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;          <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Extension !extension is fetched from cvs. Ignoring.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension_name)), LogLevel::DEBUG);</div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;        }</div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;        elseif (is_dir($extension_path . <span class="stringliteral">&#39;/.git&#39;</span>) &amp;&amp; (!<a class="code" href="commands_2core_2drupal_2environment_8inc.html#a643d851fd8dc63ea2ce8cf67aa33098c">drush_module_exists</a>(<span class="stringliteral">&#39;git_deploy&#39;</span>))) {</div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;          $extension-&gt;vcs = <span class="stringliteral">&#39;git&#39;</span>;</div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;          <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Extension !extension is fetched from git. Ignoring.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension_name)), LogLevel::DEBUG);</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;        <span class="keywordflow">continue</span>;</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;    }</div>
<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;      $project = $extension-&gt;info[<span class="stringliteral">&#39;project&#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;</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;    <span class="comment">// Create/update the project in $projects with the project data.</span></div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    <span class="keywordflow">if</span> (!isset($projects[$project])) {</div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;      $projects[$project] = array(</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;        <span class="comment">// If there&#39;s an extension with matching name, pick its label.</span></div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;        <span class="comment">// Otherwise use just the project name. We avoid $extension-&gt;label</span></div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;        <span class="comment">// for the project label because the extension&#39;s label may have</span></div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;        <span class="comment">// no direct relation with the project name. For example,</span></div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;        <span class="comment">// &quot;Text (text)&quot; or &quot;Number (number)&quot; for the CCK project.</span></div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;        <span class="stringliteral">&#39;label&#39;</span>      =&gt; isset($extensions[$project]) ? $extensions[$project]-&gt;label : $project,</div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;        <span class="stringliteral">&#39;type&#39;</span>       =&gt; <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension),</div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;        <span class="stringliteral">&#39;version&#39;</span>    =&gt; $extension-&gt;info[<span class="stringliteral">&#39;version&#39;</span>],</div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;        <span class="stringliteral">&#39;status&#39;</span>     =&gt; $extension-&gt;status,</div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;        <span class="stringliteral">&#39;extensions&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;      );</div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;      <span class="keywordflow">if</span> (isset($extension-&gt;info[<span class="stringliteral">&#39;datestamp&#39;</span>])) {</div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;        $projects[$project][<span class="stringliteral">&#39;datestamp&#39;</span>] = $extension-&gt;info[<span class="stringliteral">&#39;datestamp&#39;</span>];</div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;      }</div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;      <span class="keywordflow">if</span> (isset($extension-&gt;info[<span class="stringliteral">&#39;project status url&#39;</span>])) {</div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;        $projects[$project][<span class="stringliteral">&#39;status url&#39;</span>] = $extension-&gt;info[<span class="stringliteral">&#39;project status url&#39;</span>];</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;      }</div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    }</div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;      <span class="comment">// If any of the extensions is enabled, consider the project is enabled.</span></div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;      <span class="keywordflow">if</span> ($extension-&gt;status != 0) {</div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;        $projects[$project][<span class="stringliteral">&#39;status&#39;</span>] = $extension-&gt;status;</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;      }</div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    }</div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    $projects[$project][<span class="stringliteral">&#39;extensions&#39;</span>][] = <a class="code" href="includes_2environment_8inc.html#a317a284967256e1c0452a13462388c21">drush_extension_get_name</a>($extension);</div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;  }</div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;</div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;  <span class="comment">// Obtain each project&#39;s path and try to provide a better label for ones</span></div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;  <span class="comment">// with machine name.</span></div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  $reserved = array(<span class="stringliteral">&#39;modules&#39;</span>, <span class="stringliteral">&#39;sites&#39;</span>, <span class="stringliteral">&#39;themes&#39;</span>);</div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;  <span class="keywordflow">foreach</span> ($projects as $name =&gt; $project) {</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    <span class="keywordflow">if</span> ($name == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;    }</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">// If this project has no human label, see if we can find</span></div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    <span class="comment">// one &quot;main&quot; extension whose label we could use.</span></div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;    <span class="keywordflow">if</span> ($project[<span class="stringliteral">&#39;label&#39;</span>] == $name)  {</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;      <span class="comment">// If there is only one extension, construct a label based on</span></div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;      <span class="comment">// the extension name.</span></div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;      <span class="keywordflow">if</span> (count($project[<span class="stringliteral">&#39;extensions&#39;</span>]) == 1) {</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;        $extension = $extensions[$project[<span class="stringliteral">&#39;extensions&#39;</span>][0]];</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;        $projects[$name][<span class="stringliteral">&#39;label&#39;</span>] = $extension-&gt;info[<span class="stringliteral">&#39;name&#39;</span>] .  <span class="stringliteral">&#39; (&#39;</span> . $name . <span class="charliteral">&#39;)&#39;</span>;</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;      }</div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;        <span class="comment">// Make a list of all of the extensions in this project</span></div>
<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;        <span class="comment">// that do not depend on any other extension in this</span></div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        <span class="comment">// project.</span></div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;        $candidates = array();</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;        <span class="keywordflow">foreach</span> ($project[<span class="stringliteral">&#39;extensions&#39;</span>] as $e) {</div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;          $has_project_dependency = FALSE;</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;          <span class="keywordflow">if</span> (isset($extensions[$e]-&gt;info[<span class="stringliteral">&#39;dependencies&#39;</span>]) &amp;&amp; is_array($extensions[$e]-&gt;info[<span class="stringliteral">&#39;dependencies&#39;</span>])) {</div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;            <span class="keywordflow">foreach</span> ($extensions[$e]-&gt;info[<span class="stringliteral">&#39;dependencies&#39;</span>] as $dependent) {</div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;              <span class="keywordflow">if</span> (in_array($dependent, $project[<span class="stringliteral">&#39;extensions&#39;</span>])) {</div>
<div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;                $has_project_dependency = TRUE;</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;            }</div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;          }</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;          <span class="keywordflow">if</span> ($has_project_dependency === FALSE) {</div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;            $candidates[] = $extensions[$e]-&gt;info[<span class="stringliteral">&#39;name&#39;</span>];</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;        }</div>
<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;        <span class="comment">// If only one of the modules is a candidate, use its name in the label</span></div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;        <span class="keywordflow">if</span> (count($candidates) == 1) {</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;          $projects[$name][<span class="stringliteral">&#39;label&#39;</span>] = reset($candidates) .  <span class="stringliteral">&#39; (&#39;</span> . $name . <span class="charliteral">&#39;)&#39;</span>;</div>
<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;        }</div>
<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;      }</div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;    }</div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;</div>
<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Obtaining !project project path.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name)), LogLevel::DEBUG);</div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    $path = <a class="code" href="group__extensions.html#ga1d2b7b533a453be8eac7d6fd78512ddb">_drush_pm_find_common_path</a>($project[<span class="stringliteral">&#39;type&#39;</span>], $project[<span class="stringliteral">&#39;extensions&#39;</span>]);</div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    <span class="comment">// Prevent from setting a reserved path. For example it may happen in a case</span></div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    <span class="comment">// where a module and a theme are declared as part of a same project.</span></div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    <span class="comment">// There&#39;s a special case, a project called &quot;sites&quot;, this is the reason for</span></div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    <span class="comment">// the second condition here.</span></div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    <span class="keywordflow">if</span> ($path == <span class="charliteral">&#39;.&#39;</span> || (in_array(basename($path), $reserved) &amp;&amp; !in_array($name, $reserved))) {</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;      <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Error while trying to find the common path for enabled extensions of project !project. Extensions are: !extensions.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!extensions&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $project[<span class="stringliteral">&#39;extensions&#39;</span>]))), LogLevel::ERROR);</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;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;      $projects[$name][<span class="stringliteral">&#39;path&#39;</span>] = $path;</div>
<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    }</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;  }</div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;</div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;  <span class="keywordflow">return</span> $projects;</div>
<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;}</div>
<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;<span class="comment"> * Helper function to find the common path for a list of extensions in the aim to obtain the project name.</span></div>
<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;<span class="comment"> * @param $project_type</span></div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;<span class="comment"> *  Type of project we&#39;re trying to find. Valid values: module, theme.</span></div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;<span class="comment"> * @param $extensions</span></div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;<span class="comment"> *  Array of extension names.</span></div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00799"></a><span class="lineno"><a class="code" href="group__extensions.html#ga1d2b7b533a453be8eac7d6fd78512ddb">  799</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__extensions.html#ga1d2b7b533a453be8eac7d6fd78512ddb">_drush_pm_find_common_path</a>($project_type, $extensions) {</div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;  <span class="comment">// Select the first path as the candidate to be the common prefix.</span></div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;  $extension = array_pop($extensions);</div>
<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;  <span class="keywordflow">while</span> (!($path = drupal_get_path($project_type, $extension))) {</div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unknown path for !extension !type.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension, <span class="stringliteral">&#39;!type&#39;</span> =&gt; $project_type)), LogLevel::WARNING);</div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    $extension = array_pop($extensions);</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;  <span class="comment">// If there&#39;s only one extension we are done. Otherwise, we need to find</span></div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;  <span class="comment">// the common prefix for all of them.</span></div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  <span class="keywordflow">if</span> (count($extensions) &gt; 0) {</div>
<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    <span class="comment">// Iterate over the other projects.</span></div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;    <span class="keywordflow">while</span>($extension = array_pop($extensions)) {</div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;      $path2 = drupal_get_path($project_type, $extension);</div>
<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;      <span class="keywordflow">if</span> (!$path2) {</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unknown path for !extension !type.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension, <span class="stringliteral">&#39;!type&#39;</span> =&gt; $project_type)), LogLevel::DEBUG);</div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;        <span class="keywordflow">continue</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="comment">// Option 1: same path.</span></div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;      <span class="keywordflow">if</span> ($path == $path2) {</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;        <span class="keywordflow">continue</span>;</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="comment">// Option 2: $path is a prefix of $path2.</span></div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;      <span class="keywordflow">if</span> (strpos($path2, $path) === 0) {</div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;      }</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;      <span class="comment">// Option 3: $path2 is a prefix of $path.</span></div>
<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;      <span class="keywordflow">if</span> (strpos($path, $path2) === 0) {</div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;        $path = $path2;</div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;      }</div>
<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;      <span class="comment">// Option 4: no one is a prefix of the other. Find the common</span></div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;      <span class="comment">// prefix by iteratively strip the rigthtmost piece of $path.</span></div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;      <span class="comment">// We will iterate until a prefix is found or path = &#39;.&#39;, that on the</span></div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;      <span class="comment">// other hand is a condition theorically impossible to reach.</span></div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;      <span class="keywordflow">do</span> {</div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;        $path = dirname($path);</div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;        <span class="keywordflow">if</span> (strpos($path2, $path) === 0) {</div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;          <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;        }</div>
<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;      } <span class="keywordflow">while</span> ($path != <span class="charliteral">&#39;.&#39;</span>);</div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    }</div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;  }</div>
<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div>
<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;  <span class="keywordflow">return</span> $path;</div>
<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;}</div>
<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;<span class="comment"> * @} End of &quot;defgroup extensions&quot;.</span></div>
<div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;<span class="comment"> * Command callback. Show a list of extensions with type and status.</span></div>
<div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00853"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a61ebecaa80b51380169ddd81f751f0df">  853</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a61ebecaa80b51380169ddd81f751f0df">drush_pm_list</a>() {</div>
<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;  <span class="comment">//--package</span></div>
<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;  $package_filter = array();</div>
<div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;  $package = strtolower(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;package&#39;</span>));</div>
<div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;  <span class="keywordflow">if</span> (!empty($package)) {</div>
<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    $package_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $package);</div>
<div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;  }</div>
<div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;  <span class="keywordflow">if</span> (!empty($package_filter) &amp;&amp; (count($package_filter) == 1)) {</div>
<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    <a class="code" href="outputformat_8drush_8inc.html#aa114eb117d61d2a796e638caf91f92d6">drush_hide_output_fields</a>(<span class="stringliteral">&#39;package&#39;</span>);</div>
<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;  }</div>
<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;</div>
<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;  <span class="comment">//--type</span></div>
<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;  $all_types = array(<span class="stringliteral">&#39;module&#39;</span>, <span class="stringliteral">&#39;theme&#39;</span>);</div>
<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;  $type_filter = strtolower(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;type&#39;</span>));</div>
<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;  <span class="keywordflow">if</span> (!empty($type_filter)) {</div>
<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    $type_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $type_filter);</div>
<div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;  }</div>
<div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    $type_filter = $all_types;</div>
<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;  }</div>
<div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;</div>
<div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;  <span class="keywordflow">if</span> (count($type_filter) == 1) {</div>
<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    <a class="code" href="outputformat_8drush_8inc.html#aa114eb117d61d2a796e638caf91f92d6">drush_hide_output_fields</a>(<span class="stringliteral">&#39;type&#39;</span>);</div>
<div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;  }</div>
<div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;  <span class="keywordflow">foreach</span> ($type_filter as $type) {</div>
<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;    <span class="keywordflow">if</span> (!in_array($type, $all_types)) { <span class="comment">//TODO: this kind of check can be implemented drush-wide</span></div>
<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_INVALID_PROJECT_TYPE&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!type is not a valid project type.&#39;</span>, array(<span class="stringliteral">&#39;!type&#39;</span> =&gt; $type)));</div>
<div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;    }</div>
<div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;  }</div>
<div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;</div>
<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;  <span class="comment">//--status</span></div>
<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;  $all_status = array(<span class="stringliteral">&#39;enabled&#39;</span>, <span class="stringliteral">&#39;disabled&#39;</span>, <span class="stringliteral">&#39;not installed&#39;</span>);</div>
<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;  $status_filter = strtolower(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;status&#39;</span>));</div>
<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;  <span class="keywordflow">if</span> (!empty($status_filter)) {</div>
<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    $status_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $status_filter);</div>
<div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;  }</div>
<div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    $status_filter = $all_status;</div>
<div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;  }</div>
<div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;  <span class="keywordflow">if</span> (count($status_filter) == 1) {</div>
<div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;    <a class="code" href="outputformat_8drush_8inc.html#aa114eb117d61d2a796e638caf91f92d6">drush_hide_output_fields</a>(<span class="stringliteral">&#39;status&#39;</span>);</div>
<div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;  }</div>
<div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;</div>
<div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;  <span class="keywordflow">foreach</span> ($status_filter as $status) {</div>
<div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    <span class="keywordflow">if</span> (!in_array($status, $all_status)) { <span class="comment">//TODO: this kind of check can be implemented drush-wide</span></div>
<div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_INVALID_PROJECT_STATUS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!status is not a valid project status.&#39;</span>, array(<span class="stringliteral">&#39;!status&#39;</span> =&gt; $status)));</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;  }</div>
<div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;</div>
<div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;  $result = array();</div>
<div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;  $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>(FALSE);</div>
<div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;  uasort($extension_info, <span class="stringliteral">&#39;_drush_pm_sort_extensions&#39;</span>);</div>
<div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;</div>
<div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;  $major_version = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;  <span class="keywordflow">foreach</span> ($extension_info as $key =&gt; $extension) {</div>
<div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    <span class="keywordflow">if</span> (!in_array(<a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension), $type_filter)) {</div>
<div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;      unset($extension_info[$key]);</div>
<div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    }</div>
<div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    $status = <a class="code" href="group__extensions.html#gad7c908db0c414731d0933c93c4b083ea">drush_get_extension_status</a>($extension);</div>
<div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    <span class="keywordflow">if</span> (!in_array($status, $status_filter)) {</div>
<div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;      unset($extension_info[$key]);</div>
<div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;    }</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;    <span class="comment">// Filter out core if --no-core specified.</span></div>
<div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-core&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;      <span class="keywordflow">if</span> ((($major_version &gt;= 8) &amp;&amp; ($extension-&gt;origin == <span class="stringliteral">&#39;core&#39;</span>)) || (($major_version &lt;= 7) &amp;&amp; (strpos($extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>], <span class="stringliteral">&#39;Core&#39;</span>) === 0))) {</div>
<div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;      }</div>
<div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    }</div>
<div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;</div>
<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    <span class="comment">// Filter out non-core if --core specified.</span></div>
<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;core&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;      <span class="keywordflow">if</span> ((($major_version &gt;= 8) &amp;&amp; ($extension-&gt;origin != <span class="stringliteral">&#39;core&#39;</span>)) || (($major_version &lt;= 7) &amp;&amp; (strpos($extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>], <span class="stringliteral">&#39;Core&#39;</span>) !== 0))) {</div>
<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;      }</div>
<div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    }</div>
<div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;</div>
<div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    <span class="comment">// Filter by package.</span></div>
<div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    <span class="keywordflow">if</span> (!empty($package_filter)) {</div>
<div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;      <span class="keywordflow">if</span> (!in_array(strtolower($extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>]), $package_filter)) {</div>
<div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;      }</div>
<div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    }</div>
<div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;</div>
<div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    $row[<span class="stringliteral">&#39;package&#39;</span>] = $extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>];</div>
<div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    $row[<span class="stringliteral">&#39;name&#39;</span>] = $extension-&gt;label;</div>
<div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;    $row[<span class="stringliteral">&#39;type&#39;</span>] = ucfirst(<a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension));</div>
<div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;    $row[<span class="stringliteral">&#39;status&#39;</span>] = ucfirst($status);</div>
<div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;    <span class="comment">// Suppress notice when version is not present.</span></div>
<div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    $row[<span class="stringliteral">&#39;version&#39;</span>] = @$extension-&gt;info[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;</div>
<div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;    $result[$key] = $row;</div>
<div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;    unset($row);</div>
<div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;  }</div>
<div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;  <span class="comment">// In Drush-5, we used to return $extension_info here.</span></div>
<div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;}</div>
<div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;<span class="comment"> * Helper function for pm-enable.</span></div>
<div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00959"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a9fb7c75ce62e288900a2d53eba3664fa">  959</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a9fb7c75ce62e288900a2d53eba3664fa">drush_pm_enable_find_project_from_extension</a>($extension) {</div>
<div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;  $result =  <a class="code" href="pm_8drush_8inc.html#a62bdee36bea9dd3ce5edfd4efe81e375">drush_pm_lookup_extension_in_cache</a>($extension);</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;  <span class="keywordflow">if</span> (!isset($result)) {</div>
<div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    $release_info = <a class="code" href="engines_8inc.html#a34ff5c6bb43688e04d0647eddf48d553">drush_get_engine</a>(<span class="stringliteral">&#39;release_info&#39;</span>);</div>
<div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;</div>
<div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    <span class="comment">// If we can find info on a project that has the same name</span></div>
<div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;    <span class="comment">// as the requested extension, then we&#39;ll call that a match.</span></div>
<div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;    $request = <a class="code" href="pm_8drush_8inc.html#a8db73b8d3d5ca0b0ab31dc9976d5c5d5">pm_parse_request</a>($extension);</div>
<div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;    <span class="keywordflow">if</span> ($release_info-&gt;checkProject($request)) {</div>
<div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;      $result = $extension;</div>
<div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;    }</div>
<div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;  }</div>
<div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;</div>
<div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;}</div>
<div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;<span class="comment"> * Validate callback. Determine the modules and themes that the user would like enabled.</span></div>
<div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00979"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#af9a0b321cd245d1e1f3424ae5c9acde9">  979</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#af9a0b321cd245d1e1f3424ae5c9acde9">drush_pm_enable_validate</a>() {</div>
<div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;  $args = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args());</div>
<div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;</div>
<div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;  $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</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;  $recheck = TRUE;</div>
<div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;  <span class="keywordflow">while</span> ($recheck) {</div>
<div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    $recheck = FALSE;</div>
<div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;</div>
<div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;    <span class="comment">// Classify $args in themes, modules or unknown.</span></div>
<div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    $modules = array();</div>
<div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    $themes = array();</div>
<div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;    $download = array();</div>
<div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    <a class="code" href="group__extensions.html#ga703ad4f08aba6c5246dad9407119cc17">drush_pm_classify_extensions</a>($args, $modules, $themes, $extension_info);</div>
<div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    $extensions = array_merge($modules, $themes);</div>
<div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;    $unknown = array_diff($args, $extensions);</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">// If there&#39;re unknown extensions, try and download projects</span></div>
<div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;    <span class="comment">// with matching names.</span></div>
<div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;    <span class="keywordflow">if</span> (!empty($unknown)) {</div>
<div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;      $found = array();</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;      <span class="keywordflow">foreach</span> ($unknown as $name) {</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension was not found.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), LogLevel::WARNING);</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        $project = <a class="code" href="pm_8drush_8inc.html#a9fb7c75ce62e288900a2d53eba3664fa">drush_pm_enable_find_project_from_extension</a>($name);</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        <span class="keywordflow">if</span> (!empty($project)) {</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;          $found[] = $project;</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;        }</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;      }</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;      <span class="keywordflow">if</span> (!empty($found)) {</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;The following projects provide some or all of the extensions not found:\n@list&quot;</span>, array(<span class="stringliteral">&#39;@list&#39;</span> =&gt; implode(<span class="stringliteral">&quot;\n&quot;</span>, $found))), LogLevel::OK);</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;resolve-dependencies&#39;</span>)) {</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;          <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;They are being downloaded.&quot;</span>), LogLevel::OK);</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;        }</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;        <span class="keywordflow">if</span> ((<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;resolve-dependencies&#39;</span>)) || (<a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<span class="stringliteral">&quot;Would you like to download them?&quot;</span>))) {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;          $download = $found;</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;        }</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;      }</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;    }</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;    <span class="comment">// Discard already enabled and incompatible extensions.</span></div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    <span class="keywordflow">foreach</span> ($extensions as $name) {</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;      <span class="keywordflow">if</span> ($extension_info[$name]-&gt;status) {</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension is already enabled.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), LogLevel::OK);</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="comment">// Check if the extension is compatible with Drupal core and php version.</span></div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;      <span class="keywordflow">if</span> ($component = <a class="code" href="includes_2environment_8inc.html#ab89ca897f69cbbc621e22c16a6d2b992">drush_extension_check_incompatibility</a>($extension_info[$name])) {</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;        <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_ENABLE_MODULE_INCOMPATIBLE&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!name is incompatible with the !component version.&#39;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!component&#39;</span> =&gt; $component)));</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension_info[$name]) == <span class="stringliteral">&#39;module&#39;</span>) {</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;          unset($modules[$name]);</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;        }</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;          unset($themes[$name]);</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;        }</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;      }</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    }</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;    <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;      <span class="comment">// Check module dependencies.</span></div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;      $dependencies = <a class="code" href="commands_2core_2drupal_2environment_8inc.html#ab299b3b6652e7d6323a966b143980865">drush_check_module_dependencies</a>($modules, $extension_info);</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;      $unmet_dependencies = array();</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;      <span class="keywordflow">foreach</span> ($dependencies as $module =&gt; $info) {</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;        <span class="keywordflow">if</span> (!empty($info[<span class="stringliteral">&#39;unmet-dependencies&#39;</span>])) {</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;          <span class="keywordflow">foreach</span> ($info[<span class="stringliteral">&#39;unmet-dependencies&#39;</span>] as $unmet) {</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;            $unmet_project = (!empty($info[<span class="stringliteral">&#39;dependencies&#39;</span>][$unmet][<span class="stringliteral">&#39;project&#39;</span>])) ? $info[<span class="stringliteral">&#39;dependencies&#39;</span>][$unmet][<span class="stringliteral">&#39;project&#39;</span>] : <a class="code" href="pm_8drush_8inc.html#a9fb7c75ce62e288900a2d53eba3664fa">drush_pm_enable_find_project_from_extension</a>($unmet);</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;            <span class="keywordflow">if</span> (!empty($unmet_project)) {</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;              $unmet_dependencies[$module][$unmet_project] = $unmet_project;</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;            }</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;          }</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;        }</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;      }</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;      <span class="keywordflow">if</span> (!empty($unmet_dependencies)) {</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;        $msgs = array();</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;        $unmet_project_list = array();</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;        <span class="keywordflow">foreach</span> ($unmet_dependencies as $module =&gt; $unmet_projects) {</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;          $unmet_project_list = array_merge($unmet_project_list, $unmet_projects);</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;          $msgs[] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;!module requires !unmet-projects&quot;</span>, array(<span class="stringliteral">&#39;!unmet-projects&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $unmet_projects), <span class="stringliteral">&#39;!module&#39;</span> =&gt; $module));</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;        }</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;The following projects have unmet dependencies:\n!list&quot;</span>, array(<span class="stringliteral">&#39;!list&#39;</span> =&gt; implode(<span class="stringliteral">&quot;\n&quot;</span>, $msgs))), LogLevel::OK);</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;resolve-dependencies&#39;</span>)) {</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;          <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;They are being downloaded.&quot;</span>), LogLevel::OK);</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;        }</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;resolve-dependencies&#39;</span>) || <a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Would you like to download them?&quot;</span>))) {</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;          $download = array_merge($download, $unmet_project_list);</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;        }</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;      }</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;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;    <span class="keywordflow">if</span> (!empty($download)) {</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;      <span class="comment">// Disable DRUSH_AFFIRMATIVE context temporarily.</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;      $drush_affirmative = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_AFFIRMATIVE&#39;</span>);</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</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="l01070"></a><span class="lineno"> 1070</span>&#160;      <span class="comment">// Invoke a new process to download dependencies.</span></div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;      $result = <a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">drush_invoke_process</a>(<span class="stringliteral">&#39;@self&#39;</span>, <span class="stringliteral">&#39;pm-download&#39;</span>, $download, array(), array(<span class="stringliteral">&#39;interactive&#39;</span> =&gt; TRUE));</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;      <span class="comment">// Restore DRUSH_AFFIRMATIVE context.</span></div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;      <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_AFFIRMATIVE&#39;</span>, $drush_affirmative);</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;      <span class="comment">// Refresh module cache after downloading the new modules.</span></div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() &gt;= 8) {</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        \Drush\Drupal\ExtensionDiscovery::reset();</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;        system_list_reset();</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;      }</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;      $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;      $recheck = TRUE;</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;  }</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;  <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;    $all_dependencies = array();</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    $dependencies_ok = TRUE;</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;    <span class="keywordflow">foreach</span> ($dependencies as $key =&gt; $info) {</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;      <span class="keywordflow">if</span> (isset($info[<span class="stringliteral">&#39;error&#39;</span>])) {</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;        unset($modules[$key]);</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;        $dependencies_ok = <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>($info[<span class="stringliteral">&#39;error&#39;</span>][<span class="stringliteral">&#39;code&#39;</span>], $info[<span class="stringliteral">&#39;error&#39;</span>][<span class="stringliteral">&#39;message&#39;</span>]);</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;      }</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;      elseif (!empty($info[<span class="stringliteral">&#39;dependencies&#39;</span>])) {</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;        <span class="comment">// Make sure we have an assoc array.</span></div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;        $dependencies_list = array_keys($info[<span class="stringliteral">&#39;dependencies&#39;</span>]);</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;        $assoc = array_combine($dependencies_list, $dependencies_list);</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;        $all_dependencies = array_merge($all_dependencies, $assoc);</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;      }</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="keywordflow">if</span> (!$dependencies_ok) {</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;    }</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    $modules = array_diff(array_merge($modules, $all_dependencies), <a class="code" href="commands_2core_2drupal_2environment_8inc.html#aa53b2f8e66f3d43eb5d1dc16c1d97f94">drush_module_list</a>());</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    <span class="comment">// Discard modules which doesn&#39;t meet requirements.</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    require_once DRUSH_DRUPAL_CORE . <span class="stringliteral">&#39;/includes/install.inc&#39;</span>;</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;    <span class="keywordflow">foreach</span> ($modules as $key =&gt; $module) {</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;      <span class="comment">// Check to see if the module can be installed/enabled (hook_requirements).</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;      <span class="comment">// See @system_modules_submit</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;      <span class="keywordflow">if</span> (!drupal_check_module($module)) {</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;        unset($modules[$key]);</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;        <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_ENABLE_MODULE_UNMEET_REQUIREMENTS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Module !module doesn\&#39;t meet the requirements to be enabled.&#39;</span>, array(<span class="stringliteral">&#39;!module&#39;</span> =&gt; $module)));</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;        <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;      }</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;    }</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;  }</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;  $searchpath = array();</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;  <span class="keywordflow">foreach</span> (array_merge($modules, $themes) as $name) {</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    $searchpath[] = <a class="code" href="includes_2environment_8inc.html#a62a951f395505ed28ea3f0a5a108419c">drush_extension_get_path</a>($extension_info[$name]);</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;  }</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;  <span class="comment">// Add all modules that passed validation to the drush</span></div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;  <span class="comment">// list of commandfiles (if they have any).  This</span></div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;  <span class="comment">// will allow these newly-enabled modules to participate</span></div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;  <span class="comment">// in the pre-pm_enable and post-pm_enable hooks.</span></div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;  <span class="keywordflow">if</span> (!empty($searchpath)) {</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;    _drush_add_commandfiles($searchpath);</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;  }</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;PM_ENABLE_EXTENSION_INFO&#39;</span>, $extension_info);</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;PM_ENABLE_MODULES&#39;</span>, $modules);</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;PM_ENABLE_THEMES&#39;</span>, $themes);</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;}</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;<span class="comment"> * Command callback. Enable one or more extensions from downloaded projects.</span></div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;<span class="comment"> * Note that the modules and themes to be enabled were evaluated during the</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;<span class="comment"> * pm-enable validate hook, above.</span></div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01141"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#aa99b7d46939c1f550211d2c09a72b977"> 1141</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#aa99b7d46939c1f550211d2c09a72b977">drush_pm_enable</a>() {</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;  <span class="comment">// Get the data built during the validate phase</span></div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;  $extension_info = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;PM_ENABLE_EXTENSION_INFO&#39;</span>);</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;  $modules = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;PM_ENABLE_MODULES&#39;</span>);</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;  $themes = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;PM_ENABLE_THEMES&#39;</span>);</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;  <span class="comment">// Inform the user which extensions will finally be enabled.</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;  $extensions = array_merge($modules, $themes);</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;  <span class="keywordflow">if</span> (empty($extensions)) {</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;There were no extensions that could be enabled.&#39;</span>), LogLevel::OK);</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;  }</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;    <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;The following extensions will be enabled: !extensions&#39;</span>, array(<span class="stringliteral">&#39;!extensions&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $extensions))));</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;    <span class="keywordflow">if</span>(!<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 really want to continue?&#39;</span>))) {</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga366aaafdf8c774a58653c64a65b6d91c">drush_user_abort</a>();</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;    }</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;  }</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;  <span class="comment">// Enable themes.</span></div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;  <span class="keywordflow">if</span> (!empty($themes)) {</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;    <a class="code" href="commands_2core_2drupal_2environment_8inc.html#a1f1259b67a26416f3ec17b29dea1a1d9">drush_theme_enable</a>($themes);</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;  }</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;  <span class="comment">// Enable modules and pass dependency validation in form submit.</span></div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;  <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;    <a class="code" href="engines_8inc.html#a92390a2dd40c8ed5190be4af058813a8">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;environment&#39;</span>);</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;    <a class="code" href="commands_2core_2drupal_2environment_8inc.html#abfb699de57ec6ec22c83a4b0ab92ac4c">drush_module_enable</a>($modules);</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;  }</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;  <span class="comment">// Inform the user of final status.</span></div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;  $result_extensions = <a class="code" href="commands_2core_2drupal_2environment_8inc.html#af33699eee70ef577f27d66c33f9f8a88">drush_get_named_extensions_list</a>($extensions);</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;  $problem_extensions = array();</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;  $role = drush_role_get_class();</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;  <span class="keywordflow">foreach</span> ($result_extensions as $name =&gt; $extension) {</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;    <span class="keywordflow">if</span> ($extension-&gt;status) {</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;      <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension was enabled successfully.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), LogLevel::OK);</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;      $perms = $role-&gt;getModulePerms($name);</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;      <span class="keywordflow">if</span> (!empty($perms)) {</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;        <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension defines the following permissions: !perms&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!perms&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $perms))));</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;      }</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;    }</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;      $problem_extensions[] = $name;</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;    }</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;  }</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;  <span class="keywordflow">if</span> (!empty($problem_extensions)) {</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_ENABLE_EXTENSION_ISSUE&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;There was a problem enabling !extension.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; implode(<span class="charliteral">&#39;,&#39;</span>, $problem_extensions))));</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;  }</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;  <span class="comment">// Return the list of extensions enabled</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;  <span class="keywordflow">return</span> $extensions;</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;}</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;<span class="comment"></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"> 1194</span>&#160;<span class="comment"> * Command callback. Disable one or more extensions.</span></div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01196"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a836eda9c253a0e7edd01c683fe2d6d00"> 1196</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a836eda9c253a0e7edd01c683fe2d6d00">drush_pm_disable</a>() {</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;  $args = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args());</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;  <a class="code" href="engines_8inc.html#a92390a2dd40c8ed5190be4af058813a8">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;pm&#39;</span>);</div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;  _drush_pm_disable($args);</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;}</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;<span class="comment"> * Add extensions that match extension_name*.</span></div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;<span class="comment"> * A helper function for commands that take a space separated list of extension</span></div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;<span class="comment"> * names. It will identify extensions that have been passed in with a</span></div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;<span class="comment"> * trailing * and add all matching extensions to the array that is returned.</span></div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;<span class="comment"> * @param $extensions</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;<span class="comment"> *   An array of extensions, by reference.</span></div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;<span class="comment"> * @param $extension_info</span></div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;<span class="comment"> *   Optional. An array of extension info as returned by drush_get_extensions().</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01214"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a5f41049d5b474b8d5bbbe9f161ac1c90"> 1214</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a5f41049d5b474b8d5bbbe9f161ac1c90">_drush_pm_expand_extensions</a>(&amp;$extensions, $extension_info = array()) {</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;  <span class="keywordflow">if</span> (empty($extension_info)) {</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</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">foreach</span> ($extensions as $key =&gt; $extension) {</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <span class="keywordflow">if</span> (($wildcard = rtrim($extension, <span class="charliteral">&#39;*&#39;</span>)) !== $extension) {</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;      <span class="keywordflow">foreach</span> (array_keys($extension_info) as $extension_name) {</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;        <span class="keywordflow">if</span> (substr($extension_name, 0, strlen($wildcard)) == $wildcard) {</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;          $extensions[] = $extension_name;</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;        }</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;      }</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;      unset($extensions[$key]);</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;    }</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;  }</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;}</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;<span class="comment"> * Command callback. Uninstall one or more modules.</span></div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01234"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a89e844acc44eb017c1a12840164316af"> 1234</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a89e844acc44eb017c1a12840164316af">drush_pm_uninstall</a>() {</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;  $args = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args());</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;  <a class="code" href="engines_8inc.html#a92390a2dd40c8ed5190be4af058813a8">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;pm&#39;</span>);</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;  _drush_pm_uninstall($args);</div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;}</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;<span class="comment"></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"> * Command callback. Show available releases for given project(s).</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"><a class="code" href="pm_8drush_8inc.html#a6a5267ade011bc9e74e880668cff14af"> 1243</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a6a5267ade011bc9e74e880668cff14af">drush_pm_releases</a>() {</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;  $release_info = <a class="code" href="engines_8inc.html#a34ff5c6bb43688e04d0647eddf48d553">drush_get_engine</a>(<span class="stringliteral">&#39;release_info&#39;</span>);</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;  <span class="comment">// Obtain requests.</span></div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;  $requests = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args(), FALSE);</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;  <span class="keywordflow">if</span> (!$requests) {</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;    $requests = array(<span class="stringliteral">&#39;drupal&#39;</span>);</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;  }</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;  <span class="comment">// Get installed projects.</span></div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt;= DRUSH_BOOTSTRAP_DRUPAL_FULL) {</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    $projects = <a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>();</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;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    $projects = array();</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;</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;  <span class="comment">// Select the filter to apply based on cli options.</span></div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;dev&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;    $filter = <span class="stringliteral">&#39;dev&#39;</span>;</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;  }</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;  elseif (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;all&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;    $filter = <span class="stringliteral">&#39;all&#39;</span>;</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;  }</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;    $filter = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;  }</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;</div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;  $status_url = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;source&#39;</span>);</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;  $output = array();</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;  <span class="keywordflow">foreach</span> ($requests as $request) {</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    $request = <a class="code" href="pm_8drush_8inc.html#a8db73b8d3d5ca0b0ab31dc9976d5c5d5">pm_parse_request</a>($request, $status_url, $projects);</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    $project_name = $request[<span class="stringliteral">&#39;name&#39;</span>];</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;    $project_release_info = $release_info-&gt;get($request);</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;    <span class="keywordflow">if</span> ($project_release_info) {</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;      $version = isset($projects[$project_name]) ? $projects[$project_name][<span class="stringliteral">&#39;version&#39;</span>] : NULL;</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;      $releases = $project_release_info-&gt;filterReleases($filter, $version);</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;      <span class="keywordflow">foreach</span> ($releases as $key =&gt; $release) {</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;        $output[<span class="stringliteral">&quot;${project_name}-${key}&quot;</span>] = array(</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;          <span class="stringliteral">&#39;project&#39;</span> =&gt; $project_name,</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;          <span class="stringliteral">&#39;version&#39;</span> =&gt; $release[<span class="stringliteral">&#39;version&#39;</span>],</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;          <span class="stringliteral">&#39;date&#39;</span> =&gt; gmdate(<span class="stringliteral">&#39;Y-M-d&#39;</span>, $release[<span class="stringliteral">&#39;date&#39;</span>]),</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;          <span class="stringliteral">&#39;status&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $release[<span class="stringliteral">&#39;release_status&#39;</span>]),</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;        ) + $release;</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;      }</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;  }</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;  <span class="keywordflow">if</span> (empty($output)) {</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;No valid projects given.&#39;</span>), LogLevel::OK);</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;  }</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;  <span class="keywordflow">return</span> $output;</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;}</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;<span class="comment"> * Command callback. Show release notes for given project(s).</span></div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01301"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1bce10f51c87e2afae2e5e604c7a035f"> 1301</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a1bce10f51c87e2afae2e5e604c7a035f">drush_pm_releasenotes</a>() {</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;  $release_info = <a class="code" href="engines_8inc.html#a34ff5c6bb43688e04d0647eddf48d553">drush_get_engine</a>(<span class="stringliteral">&#39;release_info&#39;</span>);</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;  <span class="comment">// Obtain requests.</span></div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;  <span class="keywordflow">if</span> (!$requests = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args(), FALSE)) {</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;    $requests = array(<span class="stringliteral">&#39;drupal&#39;</span>);</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;</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;  <span class="comment">// Get installed projects.</span></div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt;= DRUSH_BOOTSTRAP_DRUPAL_FULL) {</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    $projects = <a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>();</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;  }</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;    $projects = array();</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;  }</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;  $status_url = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;source&#39;</span>);</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;  $output = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;  <span class="keywordflow">foreach</span>($requests as $request) {</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;    $request = <a class="code" href="pm_8drush_8inc.html#a8db73b8d3d5ca0b0ab31dc9976d5c5d5">pm_parse_request</a>($request, $status_url, $projects);</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;    $project_release_info = $release_info-&gt;get($request);</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;    <span class="keywordflow">if</span> ($project_release_info) {</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;      $version = empty($request[<span class="stringliteral">&#39;version&#39;</span>]) ? NULL : $request[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;      $output .= $project_release_info-&gt;getReleaseNotes($version);</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;    }</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;  }</div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;  <span class="keywordflow">return</span> $output;</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;}</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;<span class="comment"> * Command callback. Refresh update status information.</span></div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01334"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a3f9e999bef78b26d76d910ea8a4b1983"> 1334</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a3f9e999bef78b26d76d910ea8a4b1983">drush_pm_refresh</a>() {</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;  $update_status = <a class="code" href="engines_8inc.html#a34ff5c6bb43688e04d0647eddf48d553">drush_get_engine</a>(<span class="stringliteral">&#39;update_status&#39;</span>);</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;  <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Refreshing update status information ...&quot;</span>));</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;  $update_status-&gt;refresh();</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;  <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Done.&quot;</span>));</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;}</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;<span class="comment"> * Command callback. Execute pm-update.</span></div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01344"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a53ddf8818f1813dcb0a833a64c75d318"> 1344</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a53ddf8818f1813dcb0a833a64c75d318">drush_pm_update</a>() {</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;  <span class="comment">// Call pm-updatecode.  updatedb will be called in the post-update process.</span></div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;  $args = <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>(func_get_args(), FALSE);</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;  <a class="code" href="context_8inc.html#aa4b55e2f6174c8b6efaa8f23a0f9e0af">drush_set_option</a>(<span class="stringliteral">&#39;check-updatedb&#39;</span>, FALSE);</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="group__dispatching.html#gad45b0ad6ccdc34ebb10d38d5c2d6a1d1">drush_invoke</a>(<span class="stringliteral">&#39;pm-updatecode&#39;</span>, $args);</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;<span class="comment"> * Post-command callback.</span></div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;<span class="comment"> * Execute updatedb command after an updatecode - user requested `update`.</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="pm_8drush_8inc.html#a8e8de4df92563916a09695cd77887a3e"> 1355</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a8e8de4df92563916a09695cd77887a3e">drush_pm_post_pm_update</a>() {</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;  <span class="comment">// Use drush_invoke_process to start a subprocess. Cleaner that way.</span></div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_PM_UPDATED&#39;</span>, FALSE) !== FALSE) {</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;    <a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">drush_invoke_process</a>(<span class="stringliteral">&#39;@self&#39;</span>, <span class="stringliteral">&#39;updatedb&#39;</span>);</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;  }</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;}</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;<span class="comment"> * Validate callback for updatecode command. Abort if &#39;backup&#39; directory exists.</span></div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01365"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#afb1934ef6eacb18b4c7d73332230bd52"> 1365</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#afb1934ef6eacb18b4c7d73332230bd52">drush_pm_updatecode_validate</a>() {</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;  $path = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_DRUPAL_ROOT&#39;</span>) . <span class="stringliteral">&#39;/backup&#39;</span>;</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;  <span class="keywordflow">if</span> (is_dir($path) &amp;&amp; (realpath(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;backup-dir&#39;</span>, FALSE)) != $path)) {</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Backup directory !path found. It\&#39;s a security risk to store backups inside the Drupal tree. Drush now uses by default ~/drush-backups. You need to move !path out of the Drupal tree to proceed. Note: if you know what you\&#39;re doing you can explicitly set --backup-dir to !path and continue.&#39;</span>, array(<span class="stringliteral">&#39;!path&#39;</span> =&gt; $path)));</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;  }</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;}</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;<span class="comment"> * Post-command callback for updatecode.</span></div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;<span class="comment"> * Execute pm-updatecode-postupdate in a backend process to not conflict with</span></div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;<span class="comment"> * old code already in memory.</span></div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01378"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a05bb1cb687b1caa097ad691a4c9a3fc1"> 1378</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a05bb1cb687b1caa097ad691a4c9a3fc1">drush_pm_post_pm_updatecode</a>() {</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;  <span class="comment">// Skip if updatecode was invoked by pm-update.</span></div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;  <span class="comment">// This way we avoid being noisy, as updatedb is to be executed.</span></div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;check-updatedb&#39;</span>, TRUE)) {</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_PM_UPDATED&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;      <a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">drush_invoke_process</a>(<span class="stringliteral">&#39;@self&#39;</span>, <span class="stringliteral">&#39;pm-updatecode-postupdate&#39;</span>);</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;    }</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;  }</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;}</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;<span class="comment"> * Command callback. Execute updatecode-postupdate.</span></div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01391"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a46375206f98fbf1f6d5e5dc131d4d967"> 1391</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a46375206f98fbf1f6d5e5dc131d4d967">drush_pm_updatecode_postupdate</a>() {</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;  <span class="comment">// Clear the cache, since some projects could have moved around.</span></div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;  drush_drupal_cache_clear_all();</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;  <span class="comment">// Notify of pending database updates.</span></div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;  <span class="comment">// Make sure the installation API is available</span></div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;  require_once DRUSH_DRUPAL_CORE . <span class="stringliteral">&#39;/includes/install.inc&#39;</span>;</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;  <span class="comment">// Load all .install files.</span></div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;  drupal_load_updates();</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;  <span class="comment">// @see system_requirements().</span></div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;  <span class="keywordflow">foreach</span> (<a class="code" href="commands_2core_2drupal_2environment_8inc.html#aa53b2f8e66f3d43eb5d1dc16c1d97f94">drush_module_list</a>() as $module) {</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;    $updates = drupal_get_schema_versions($module);</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;    <span class="keywordflow">if</span> ($updates !== FALSE) {</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;      $default = drupal_get_installed_schema_version($module);</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;      <span class="keywordflow">if</span> (max($updates) &gt; $default) {</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;You have pending database updates. Run `drush updatedb` or visit update.php in your browser.&quot;</span>), LogLevel::WARNING);</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;        <span class="keywordflow">break</span>;</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;    }</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;  }</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;}</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;<span class="comment"> * Sanitize user provided arguments to several pm commands.</span></div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;<span class="comment"> * Return an array of arguments off a space and/or comma separated values.</span></div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01420"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587"> 1420</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587">pm_parse_arguments</a>($args, $dashes_to_underscores = TRUE) {</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;  $arguments = <a class="code" href="drush_8inc.html#a6007ce294242d1f6e48cda703fbb8d3f">_convert_csv_to_array</a>($args);</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;  <span class="keywordflow">foreach</span> ($arguments as $key =&gt; $argument) {</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;    $argument = ($dashes_to_underscores) ? strtr($argument, <span class="charliteral">&#39;-&#39;</span>, <span class="charliteral">&#39;_&#39;</span>) : $argument;</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;  }</div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;  <span class="keywordflow">return</span> $arguments;</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;}</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment"> * Decompound a version string and returns major, minor, patch and extra parts.</span></div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;<span class="comment"> * @see _pm_parse_version_compound()</span></div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment"> * @see pm_parse_version()</span></div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;<span class="comment"> * @param string $version</span></div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;<span class="comment"> *    A version string like X.Y-Z, X.Y.Z-W or a subset.</span></div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;<span class="comment"> *   Array with major, patch and extra keys.</span></div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01440"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#acf13167885159fd70ae11424f69fbf4a"> 1440</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#acf13167885159fd70ae11424f69fbf4a">_pm_parse_version_decompound</a>($version) {</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;  $pattern = <span class="stringliteral">&#39;/^(\d+)(?:.(\d+))?(?:\.(x|\d+))?(?:-([a-z0-9\.-]*))?(?:\+(\d+)-dev)?$/&#39;</span>;</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;</div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;  $matches = array();</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;  preg_match($pattern, $version, $matches);</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;  $parts = array(</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;    <span class="stringliteral">&#39;major&#39;</span>  =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;    <span class="stringliteral">&#39;minor&#39;</span>  =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    <span class="stringliteral">&#39;patch&#39;</span>  =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;    <span class="stringliteral">&#39;extra&#39;</span>  =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;    <span class="stringliteral">&#39;offset&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</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;  <span class="keywordflow">if</span> (isset($matches[1])) {</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;    $parts[<span class="stringliteral">&#39;major&#39;</span>] = $matches[1];</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;    <span class="keywordflow">if</span> (isset($matches[2])) {</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;      <span class="keywordflow">if</span> (isset($matches[3]) &amp;&amp; $matches[3] != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;        $parts[<span class="stringliteral">&#39;minor&#39;</span>] = $matches[2];</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;        $parts[<span class="stringliteral">&#39;patch&#39;</span>] = $matches[3];</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;      }</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;        $parts[<span class="stringliteral">&#39;patch&#39;</span>] = $matches[2];</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;      }</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;    <span class="keywordflow">if</span> (!empty($matches[4])) {</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;      $parts[<span class="stringliteral">&#39;extra&#39;</span>] = $matches[4];</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;    }</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;    <span class="keywordflow">if</span> (!empty($matches[5])) {</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;      $parts[<span class="stringliteral">&#39;offset&#39;</span>] = $matches[5];</div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;    }</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;  }</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;  <span class="keywordflow">return</span> $parts;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;<span class="comment"> * Build a version string from an array of major, minor and extra parts.</span></div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;<span class="comment"> * @see _pm_parse_version_decompound()</span></div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;<span class="comment"> * @see pm_parse_version()</span></div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;<span class="comment"> * @param array $parts</span></div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;<span class="comment"> *    Array of parts.</span></div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="comment"> *   A Version string.</span></div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01487"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#aa06c026056d00614afb519e4d6a9ced7"> 1487</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#aa06c026056d00614afb519e4d6a9ced7">_pm_parse_version_compound</a>($parts) {</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;  $project_version = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;  <span class="keywordflow">if</span> ($parts[<span class="stringliteral">&#39;patch&#39;</span>] != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;    $project_version = $parts[<span class="stringliteral">&#39;major&#39;</span>];</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;    <span class="keywordflow">if</span> ($parts[<span class="stringliteral">&#39;minor&#39;</span>] != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;      $project_version = $project_version . <span class="charliteral">&#39;.&#39;</span> . $parts[<span class="stringliteral">&#39;minor&#39;</span>];</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;    }</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    <span class="keywordflow">if</span> ($parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) {</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;      $project_version = $project_version . <span class="stringliteral">&#39;.x-dev&#39;</span>;</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    }</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;      $project_version = $project_version . <span class="charliteral">&#39;.&#39;</span> . $parts[<span class="stringliteral">&#39;patch&#39;</span>];</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;      <span class="keywordflow">if</span> ($parts[<span class="stringliteral">&#39;extra&#39;</span>] != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;        $project_version = $project_version . <span class="charliteral">&#39;-&#39;</span> . $parts[<span class="stringliteral">&#39;extra&#39;</span>];</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;    }</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;    <span class="keywordflow">if</span> ($parts[<span class="stringliteral">&#39;offset&#39;</span>] != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;      $project_version = $project_version . <span class="charliteral">&#39;+&#39;</span> . $parts[<span class="stringliteral">&#39;offset&#39;</span>] . <span class="stringliteral">&#39;-dev&#39;</span>;</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;    }</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;  }</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;</div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;  <span class="keywordflow">return</span> $project_version;</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;<span class="comment"></span></div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;<span class="comment"> * Parses a version string and returns its components.</span></div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;<span class="comment"> * It parses both core and contrib version strings.</span></div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;<span class="comment"> * Core (semantic versioning):</span></div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;<span class="comment"> *   - 8.0.0-beta3+252-dev</span></div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;<span class="comment"> *   - 8.0.0-beta2</span></div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;<span class="comment"> *   - 8.0.x-dev</span></div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;<span class="comment"> *   - 8.1.x</span></div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;<span class="comment"> *   - 8.0.1</span></div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;<span class="comment"> *   - 8</span></div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;<span class="comment"> * Core (classic drupal scheme):</span></div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;<span class="comment"> *   - 7.x-dev</span></div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;<span class="comment"> *   - 7.x</span></div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;<span class="comment"> *   - 7.33</span></div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;<span class="comment"> *   - 7.34+3-dev</span></div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;<span class="comment"> *   - 7</span></div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;<span class="comment"> * Contrib:</span></div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;<span class="comment"> *   - 7.x-1.0-beta1+30-dev</span></div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;<span class="comment"> *   - 7.x-1.0-beta1</span></div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;<span class="comment"> *   - 7.x-1.0+30-dev</span></div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<span class="comment"> *   - 7.x-1.0</span></div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;<span class="comment"> *   - 1.0-beta1</span></div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;<span class="comment"> *   - 1.0</span></div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;<span class="comment"> *   - 7.x-1.x</span></div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;<span class="comment"> *   - 7.x-1.x-dev</span></div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;<span class="comment"> *   - 1.x</span></div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;<span class="comment"> * @see pm_parse_request()</span></div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;<span class="comment"> * @param string $version</span></div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;<span class="comment"> *   A core or project version string.</span></div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;<span class="comment"> * @param bool $is_core</span></div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;<span class="comment"> *   Whether this is a core version or a project version.</span></div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;<span class="comment"> *   Version string in parts.</span></div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;<span class="comment"> *   Example for a contrib version (ex: 7.x-3.2-beta1):</span></div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;<span class="comment"> *     - version         : Fully qualified version string.</span></div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;<span class="comment"> *     - drupal_version  : Core compatibility version (ex: 7.x).</span></div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;<span class="comment"> *     - version_major   : Major version (ex: 3).</span></div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;<span class="comment"> *     - version_minor   : Minor version. Not applicable. Always empty.</span></div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;<span class="comment"> *     - version_patch   : Patch version (ex: 2).</span></div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;<span class="comment"> *     - version_extra   : Extra version (ex: beta1).</span></div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;<span class="comment"> *     - project_version : Project specific part of the version (ex: 3.2-beta1).</span></div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;<span class="comment"> *   Example for a core version (ex: 8.1.2-beta2 or 7.0-beta2):</span></div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;<span class="comment"> *     - version         : Fully qualified version string.</span></div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;<span class="comment"> *     - drupal_version  : Core compatibility version (ex: 8.x).</span></div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;<span class="comment"> *     - version_major   : Major version (ex: 8).</span></div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;<span class="comment"> *     - version_minor   : Minor version (ex: 1). Empty if not a semver.</span></div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;<span class="comment"> *     - version_patch   : Patch version (ex: 2).</span></div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;<span class="comment"> *     - version_extra   : Extra version (ex: beta2).</span></div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;<span class="comment"> *     - project_version : Same as &#39;version&#39;.</span></div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01570"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#aa9d9abe6bf22773b5a24136da2b211b4"> 1570</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#aa9d9abe6bf22773b5a24136da2b211b4">pm_parse_version</a>($version, $is_core = FALSE) {</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;  $core_parts = <a class="code" href="pm_8drush_8inc.html#acf13167885159fd70ae11424f69fbf4a">_pm_parse_version_decompound</a>($version);</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;  <span class="comment">// If no major version, we have no version at all. Pick a default.</span></div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;  $drupal_version_default = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;  <span class="keywordflow">if</span> ($core_parts[<span class="stringliteral">&#39;major&#39;</span>] == <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;    $core_parts[<span class="stringliteral">&#39;major&#39;</span>] = ($drupal_version_default) ? $drupal_version_default : <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;default-major&#39;</span>, 8);</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;  }</div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;</div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;  <span class="keywordflow">if</span> ($is_core) {</div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;    $project_version = <a class="code" href="pm_8drush_8inc.html#aa06c026056d00614afb519e4d6a9ced7">_pm_parse_version_compound</a>($core_parts);</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;    $version_parts = array(</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;      <span class="stringliteral">&#39;version&#39;</span> =&gt; $project_version,</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;      <span class="stringliteral">&#39;drupal_version&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>] . <span class="stringliteral">&#39;.x&#39;</span>,</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;      <span class="stringliteral">&#39;project_version&#39;</span> =&gt; $project_version,</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;      <span class="stringliteral">&#39;version_major&#39;</span>   =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>],</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;      <span class="stringliteral">&#39;version_minor&#39;</span>   =&gt; $core_parts[<span class="stringliteral">&#39;minor&#39;</span>],</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;      <span class="stringliteral">&#39;version_patch&#39;</span>   =&gt; ($core_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;&#39;</span> : $core_parts[<span class="stringliteral">&#39;patch&#39;</span>],</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;      <span class="stringliteral">&#39;version_extra&#39;</span>   =&gt; ($core_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;dev&#39;</span> : $core_parts[<span class="stringliteral">&#39;extra&#39;</span>],</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;      <span class="stringliteral">&#39;version_offset&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;offset&#39;</span>],</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;    );</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;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;    <span class="comment">// If something as 7.x-1.0-beta1, the project specific version is</span></div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;    <span class="comment">// in $version[&#39;extra&#39;] and we need to parse it.</span></div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;    <span class="keywordflow">if</span> (strpbrk($core_parts[<span class="stringliteral">&#39;extra&#39;</span>], <span class="stringliteral">&#39;.-&#39;</span>)) {</div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;      $nocore_parts = <a class="code" href="pm_8drush_8inc.html#acf13167885159fd70ae11424f69fbf4a">_pm_parse_version_decompound</a>($core_parts[<span class="stringliteral">&#39;extra&#39;</span>]);</div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;      $nocore_parts[<span class="stringliteral">&#39;offset&#39;</span>] = $core_parts[<span class="stringliteral">&#39;offset&#39;</span>];</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;      $project_version = <a class="code" href="pm_8drush_8inc.html#aa06c026056d00614afb519e4d6a9ced7">_pm_parse_version_compound</a>($nocore_parts);</div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;      $version_parts = array(</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;        <span class="stringliteral">&#39;version&#39;</span> =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>] . <span class="stringliteral">&#39;.x-&#39;</span> . $project_version,</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;        <span class="stringliteral">&#39;drupal_version&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>] . <span class="stringliteral">&#39;.x&#39;</span>,</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;        <span class="stringliteral">&#39;project_version&#39;</span> =&gt; $project_version,</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;        <span class="stringliteral">&#39;version_major&#39;</span>   =&gt; $nocore_parts[<span class="stringliteral">&#39;major&#39;</span>],</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;        <span class="stringliteral">&#39;version_minor&#39;</span>   =&gt; $core_parts[<span class="stringliteral">&#39;minor&#39;</span>],</div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;        <span class="stringliteral">&#39;version_patch&#39;</span>   =&gt; ($nocore_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;&#39;</span> : $nocore_parts[<span class="stringliteral">&#39;patch&#39;</span>],</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;        <span class="stringliteral">&#39;version_extra&#39;</span>   =&gt; ($nocore_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;dev&#39;</span> : $nocore_parts[<span class="stringliteral">&#39;extra&#39;</span>],</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;        <span class="stringliteral">&#39;version_offset&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;offset&#39;</span>],</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;      );</div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;    }</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;    <span class="comment">// At this point we have half a version and must decide if this is a drupal major or a project.</span></div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;      <span class="comment">// If working on a bootstrapped site, core_parts has the project version.</span></div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;      <span class="keywordflow">if</span> ($drupal_version_default) {</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;        $project_version = <a class="code" href="pm_8drush_8inc.html#aa06c026056d00614afb519e4d6a9ced7">_pm_parse_version_compound</a>($core_parts);</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;        $version = ($project_version) ? $drupal_version_default . <span class="stringliteral">&#39;.x-&#39;</span> . $project_version : <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;        $version_parts = array(</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;          <span class="stringliteral">&#39;version&#39;</span>         =&gt; $version,</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;          <span class="stringliteral">&#39;drupal_version&#39;</span>  =&gt; $drupal_version_default . <span class="stringliteral">&#39;.x&#39;</span>,</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;          <span class="stringliteral">&#39;project_version&#39;</span> =&gt; $project_version,</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;          <span class="stringliteral">&#39;version_major&#39;</span>   =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>],</div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;          <span class="stringliteral">&#39;version_minor&#39;</span>   =&gt; $core_parts[<span class="stringliteral">&#39;minor&#39;</span>],</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;          <span class="stringliteral">&#39;version_patch&#39;</span>   =&gt; ($core_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;&#39;</span> : $core_parts[<span class="stringliteral">&#39;patch&#39;</span>],</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;          <span class="stringliteral">&#39;version_extra&#39;</span>   =&gt; ($core_parts[<span class="stringliteral">&#39;patch&#39;</span>] == <span class="charliteral">&#39;x&#39;</span>) ? <span class="stringliteral">&#39;dev&#39;</span> : $core_parts[<span class="stringliteral">&#39;extra&#39;</span>],</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;          <span class="stringliteral">&#39;version_offset&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;offset&#39;</span>],</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;        );</div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;      }</div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;      <span class="comment">// Not working on a bootstrapped site, core_parts is core version.</span></div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;        $version_parts = array(</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;          <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;          <span class="stringliteral">&#39;drupal_version&#39;</span>  =&gt; $core_parts[<span class="stringliteral">&#39;major&#39;</span>] . <span class="stringliteral">&#39;.x&#39;</span>,</div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;          <span class="stringliteral">&#39;project_version&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;          <span class="stringliteral">&#39;version_major&#39;</span>   =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;          <span class="stringliteral">&#39;version_minor&#39;</span>   =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;          <span class="stringliteral">&#39;version_patch&#39;</span>   =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;          <span class="stringliteral">&#39;version_extra&#39;</span>   =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;          <span class="stringliteral">&#39;version_offset&#39;</span>  =&gt; <span class="stringliteral">&#39;&#39;</span>,</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;      }</div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;    }</div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;  }</div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;</div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;  <span class="keywordflow">return</span> $version_parts;</div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;<span class="comment"> * Parse out the project name and version and return as a structured array.</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"> 1649</span>&#160;<span class="comment"> * @see pm_parse_version()</span></div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;<span class="comment"> * @param string $request_string</span></div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;<span class="comment"> *   Project name with optional version. Examples: &#39;ctools-7.x-1.0-beta1&#39;</span></div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;<span class="comment"> *   Array with all parts of the request info.</span></div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a8db73b8d3d5ca0b0ab31dc9976d5c5d5"> 1657</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a8db73b8d3d5ca0b0ab31dc9976d5c5d5">pm_parse_request</a>($request_string, $status_url = NULL, &amp;$projects = array()) {</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;  <span class="comment">// Split $request_string in project name and version. Note that hyphens (-)</span></div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;  <span class="comment">// are permitted in project names (ex: field-conditional-state).</span></div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;  <span class="comment">// We use a regex to split the string. The pattern used matches a string</span></div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;  <span class="comment">// starting with hyphen, followed by one or more numbers, any of the valid</span></div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;  <span class="comment">// symbols in version strings (.x-) and a catchall for the rest of the</span></div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;  <span class="comment">// version string.</span></div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;  $parts = preg_split(<span class="stringliteral">&#39;/-(?:([\d+\.x].*))?$/&#39;</span>, $request_string, NULL, PREG_SPLIT_DELIM_CAPTURE);</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;</div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;  <span class="keywordflow">if</span> (count($parts) == 1) {</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;    <span class="comment">// No version in the request string.</span></div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;    $project = $request_string;</div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;    $version = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;  }</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    $project = $parts[0];</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    $version = $parts[1];</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;  }</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;  $is_core = ($project == <span class="stringliteral">&#39;drupal&#39;</span>);</div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;  $request = array(</div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;    <span class="stringliteral">&#39;name&#39;</span> =&gt; $project,</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;  ) + <a class="code" href="pm_8drush_8inc.html#aa9d9abe6bf22773b5a24136da2b211b4">pm_parse_version</a>($version, $is_core);</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;  <span class="comment">// Set the status url if provided or available in project&#39;s info file.</span></div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;  <span class="keywordflow">if</span> ($status_url) {</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;    $request[<span class="stringliteral">&#39;status url&#39;</span>] = $status_url;</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;  elseif (!empty($projects[$project][<span class="stringliteral">&#39;status url&#39;</span>])) {</div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;    $request[<span class="stringliteral">&#39;status url&#39;</span>] = $projects[$project][<span class="stringliteral">&#39;status url&#39;</span>];</div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;  }</div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;</div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;  <span class="keywordflow">return</span> $request;</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;<span class="comment"> * @defgroup engines Engine types</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"> */</span></div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;<span class="comment"></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"> 1698</span>&#160;<span class="comment"> * Implementation of hook_drush_engine_type_info().</span></div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01700"></a><span class="lineno"><a class="code" href="group__engines.html#gac3ac3fde1aa909a1155a17e3a9cf5cb7"> 1700</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#gac3ac3fde1aa909a1155a17e3a9cf5cb7">pm_drush_engine_type_info</a>() {</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;    <span class="stringliteral">&#39;package_handler&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;      <span class="stringliteral">&#39;option&#39;</span> =&gt; <span class="stringliteral">&#39;package-handler&#39;</span>,</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Determine how to fetch projects from update service.&#39;</span>,</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;wget&#39;</span>,</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;        <span class="stringliteral">&#39;cache&#39;</span> =&gt; <span class="stringliteral">&#39;Cache release XML and tarballs or git clones. Git clones use git\&#39;s --reference option. Defaults to 1 for downloads, and 0 for git.&#39;</span>,</div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;      ),</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;    <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;      <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;    ),</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;    <span class="stringliteral">&#39;update_status&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;      <span class="stringliteral">&#39;option&#39;</span> =&gt; <span class="stringliteral">&#39;update-backend&#39;</span>,</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Determine how to fetch update status information.&#39;</span>,</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;drush&#39;</span>,</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;      <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        <span class="stringliteral">&#39;update-backend&#39;</span> =&gt; <span class="stringliteral">&#39;Backend to obtain available updates.&#39;</span>,</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;        <span class="stringliteral">&#39;check-disabled&#39;</span> =&gt; <span class="stringliteral">&#39;Check for updates of disabled modules and themes.&#39;</span>,</div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;        <span class="stringliteral">&#39;security-only&#39;</span>  =&gt; <span class="stringliteral">&#39;Only update modules that have security updates available.&#39;</span>,</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;      ),</div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;      <span class="stringliteral">&#39;combine-help&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;    ),</div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;    <span class="stringliteral">&#39;version_control&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;      <span class="stringliteral">&#39;option&#39;</span> =&gt; <span class="stringliteral">&#39;version-control&#39;</span>,</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;backup&#39;</span>,</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Integrate with version control systems.&#39;</span>,</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;    ),</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;  );</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;}</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;<span class="comment"> * Implements hook_drush_engine_ENGINE_TYPE().</span></div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;<span class="comment"> * Package handler engine is used by pm-download and</span></div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;<span class="comment"> * pm-updatecode commands to determine how to download/checkout</span></div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;<span class="comment"> * new projects and acquire updates to projects.</span></div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01740"></a><span class="lineno"><a class="code" href="group__engines.html#ga23826e01e6591dfb655c684cf9c82ed1"> 1740</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#ga23826e01e6591dfb655c684cf9c82ed1">pm_drush_engine_package_handler</a>() {</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;    <span class="stringliteral">&#39;wget&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Download project packages using wget or curl.&#39;</span>,</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;        <span class="stringliteral">&#39;no-md5&#39;</span> =&gt; <span class="stringliteral">&#39;Skip md5 validation of downloads.&#39;</span>,</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;    ),</div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;    <span class="stringliteral">&#39;git_drupalorg&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Use git.drupal.org to checkout and update projects.&#39;</span>,</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;        <span class="stringliteral">&#39;gitusername&#39;</span> =&gt; <span class="stringliteral">&#39;Your git username as shown on user/[uid]/edit/git. Typically, this is set this in drushrc.php. Omitting this prevents users from pushing changes back to git.drupal.org.&#39;</span>,</div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;        <span class="stringliteral">&#39;gitsubmodule&#39;</span> =&gt; <span class="stringliteral">&#39;Use git submodules for checking out new projects. Existing git checkouts are unaffected, and will continue to (not) use submodules regardless of this setting.&#39;</span>,</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;        <span class="stringliteral">&#39;gitcheckoutparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `git checkout` command.&#39;</span>,</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;        <span class="stringliteral">&#39;gitcloneparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `git clone` command.&#39;</span>,</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;        <span class="stringliteral">&#39;gitfetchparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `git fetch` command.&#39;</span>,</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;        <span class="stringliteral">&#39;gitpullparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `git pull` command.&#39;</span>,</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;        <span class="stringliteral">&#39;gitinfofile&#39;</span> =&gt; <span class="stringliteral">&#39;Inject version info into each .info file.&#39;</span>,</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;      ),</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;        <span class="stringliteral">&#39;gitsubmodule&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;          <span class="stringliteral">&#39;gitsubmoduleaddparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `git submodule add` command.&#39;</span>,</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;      ),</div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    ),</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;}</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;<span class="comment"> * Implements hook_drush_engine_ENGINE_TYPE().</span></div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;<span class="comment"> * Release info engine is used by several pm commands to obtain</span></div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;<span class="comment"> * releases info from Drupal&#39;s update service or external sources.</span></div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01774"></a><span class="lineno"><a class="code" href="group__engines.html#ga9a54c9d004aa0efb2c978f3914519a0b"> 1774</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#ga9a54c9d004aa0efb2c978f3914519a0b">pm_drush_engine_release_info</a>() {</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;    <span class="stringliteral">&#39;updatexml&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Drush release info engine for update.drupal.org and compatible services.&#39;</span>,</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;        <span class="stringliteral">&#39;source&#39;</span> =&gt; <span class="stringliteral">&#39;The base URL which provides project release history in XML. Defaults to http://updates.drupal.org/release-history.&#39;</span>,</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;        <span class="stringliteral">&#39;dev&#39;</span> =&gt; <span class="stringliteral">&#39;Work with development releases solely.&#39;</span>,</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;      ),</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;        <span class="stringliteral">&#39;cache&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;          <span class="stringliteral">&#39;cache-duration-releasexml&#39;</span> =&gt; <span class="stringliteral">&#39;Expire duration (in seconds) for release XML. Defaults to 86400 (24 hours).&#39;</span>,</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;        ),</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;        <span class="stringliteral">&#39;select&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;          <span class="stringliteral">&#39;all&#39;</span> =&gt; <span class="stringliteral">&#39;Shows all available releases instead of a short list of recent releases.&#39;</span>,</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;        ),</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;      ),</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;      <span class="stringliteral">&#39;class&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\UpdateService\ReleaseInfo&#39;</span>,</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    ),</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;  );</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;}</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;<span class="comment"> * Implements hook_drush_engine_ENGINE_TYPE().</span></div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;<span class="comment"> * Update status engine is used to check available updates for</span></div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="comment"> * the projects in a Drupal site.</span></div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01801"></a><span class="lineno"><a class="code" href="group__engines.html#gad859a943b5345ec070b34baa05a64c53"> 1801</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#gad859a943b5345ec070b34baa05a64c53">pm_drush_engine_update_status</a>() {</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;    <span class="stringliteral">&#39;drupal&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Check available updates with update.module.&#39;</span>,</div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;      <span class="stringliteral">&#39;drupal dependencies&#39;</span> =&gt; array(<span class="stringliteral">&#39;update&#39;</span>),</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;      <span class="stringliteral">&#39;class&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\UpdateService\StatusInfoDrupal&#39;</span>,</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    ),</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    <span class="stringliteral">&#39;drush&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Check available updates without update.module.&#39;</span>,</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;      <span class="stringliteral">&#39;class&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\UpdateService\StatusInfoDrush&#39;</span>,</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;    ),</div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;  );</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;}</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;<span class="comment"> * Implements hook_drush_engine_ENGINE_TYPE().</span></div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;<span class="comment"> * Integration with VCS in order to easily commit your changes to projects.</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"><a class="code" href="group__engines.html#ga4c4be5afaca4f87930e3bb66a6dda7cc"> 1820</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#ga4c4be5afaca4f87930e3bb66a6dda7cc">pm_drush_engine_version_control</a>() {</div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;    <span class="stringliteral">&#39;backup&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Backup all project files before updates.&#39;</span>,</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;        <span class="stringliteral">&#39;no-backup&#39;</span> =&gt; <span class="stringliteral">&#39;Do not perform backups. WARNING: Will result in non-core files/dirs being deleted (e.g. .git)&#39;</span>,</div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;        <span class="stringliteral">&#39;backup-dir&#39;</span> =&gt; <span class="stringliteral">&#39;Specify a directory to backup projects into. Defaults to drush-backups within the home directory of the user running the command. It is forbidden to specify a directory inside your drupal root.&#39;</span>,</div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;      ),</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    ),</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;    <span class="stringliteral">&#39;bzr&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;      <span class="stringliteral">&#39;signature&#39;</span> =&gt; <span class="stringliteral">&#39;bzr root %s&#39;</span>,</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Quickly add/remove/commit your project changes to Bazaar.&#39;</span>,</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;        <span class="stringliteral">&#39;bzrsync&#39;</span> =&gt; <span class="stringliteral">&#39;Automatically add new files to the Bazaar repository and remove deleted files. Caution.&#39;</span>,</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;        <span class="stringliteral">&#39;bzrcommit&#39;</span> =&gt; <span class="stringliteral">&#39;Automatically commit changes to Bazaar repository. You must also use the --bzrsync option.&#39;</span>,</div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;      ),</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;        <span class="stringliteral">&#39;bzrcommit&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;          <span class="stringliteral">&#39;bzrmessage&#39;</span> =&gt; <span class="stringliteral">&#39;Override default commit message which is: Drush automatic commit. Project &lt;name&gt; &lt;type&gt; Command: &lt;the drush command line used&gt;&#39;</span>,</div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;        ),</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;      ),</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;      <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;        <span class="stringliteral">&#39;drush dl cck --version-control=bzr --bzrsync --bzrcommit&#39;</span> =&gt;  <span class="stringliteral">&#39;Download the cck project and then add it and commit it to Bazaar.&#39;</span></div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;      ),</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;    ),</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;    <span class="stringliteral">&#39;svn&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;      <span class="stringliteral">&#39;signature&#39;</span> =&gt; <span class="stringliteral">&#39;svn info %s&#39;</span>,</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Quickly add/remove/commit your project changes to Subversion.&#39;</span>,</div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;        <span class="stringliteral">&#39;svnsync&#39;</span> =&gt; <span class="stringliteral">&#39;Automatically add new files to the SVN repository and remove deleted files. Caution.&#39;</span>,</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;        <span class="stringliteral">&#39;svncommit&#39;</span> =&gt; <span class="stringliteral">&#39;Automatically commit changes to SVN repository. You must also using the --svnsync option.&#39;</span>,</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;        <span class="stringliteral">&#39;svnstatusparams&#39;</span> =&gt; <span class="stringliteral">&quot;Add options to the &#39;svn status&#39; command&quot;</span>,</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;        <span class="stringliteral">&#39;svnaddparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `svn add` command&#39;</span>,</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;        <span class="stringliteral">&#39;svnremoveparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `svn remove` command&#39;</span>,</div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;        <span class="stringliteral">&#39;svnrevertparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `svn revert` command&#39;</span>,</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;        <span class="stringliteral">&#39;svncommitparams&#39;</span> =&gt; <span class="stringliteral">&#39;Add options to the `svn commit` command&#39;</span>,</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;      ),</div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;        <span class="stringliteral">&#39;svncommit&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;         <span class="stringliteral">&#39;svnmessage&#39;</span> =&gt; <span class="stringliteral">&#39;Override default commit message which is: Drush automatic commit: &lt;the drush command line used&gt;&#39;</span>,</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;        ),</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;      ),</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;      <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;        <span class="stringliteral">&#39;drush [command] cck --svncommitparams=\&quot;--username joe\&quot;&#39;</span> =&gt;  <span class="stringliteral">&#39;Commit changes as the user \&#39;joe\&#39; (Quotes are required).&#39;</span></div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;      ),</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;    ),</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;  );</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;}</div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;<span class="comment"> * @} End of &quot;Engine types&quot;.</span></div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;<span class="comment"> * Interface for version control systems.</span></div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;<span class="comment"> * We use a simple object layer because we conceivably need more than one</span></div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;<span class="comment"> * loaded at a time.</span></div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01878"></a><span class="lineno"><a class="code" href="interfacedrush__version__control.html"> 1878</a></span>&#160;<span class="keyword">interface </span><a class="code" href="interfacedrush__version__control.html">drush_version_control</a> {</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;  <span class="keyword">function</span> pre_update(&amp;$project);</div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;  <span class="keyword">function</span> rollback($project);</div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;  <span class="keyword">function</span> post_update($project);</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;  <span class="keyword">function</span> post_download($project);</div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;  <span class="keyword">static</span> <span class="keyword">function</span> reserved_files();</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;}</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;<span class="comment"> * A simple factory function that tests for version control systems, in a user</span></div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;<span class="comment"> * specified order, and returns the one that appears to be appropriate for a</span></div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;<span class="comment"> * specific directory.</span></div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01891"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a7a7640133c515e06c96d0f4262b98c51"> 1891</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a7a7640133c515e06c96d0f4262b98c51">drush_pm_include_version_control</a>($directory = <span class="charliteral">&#39;.&#39;</span>) {</div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;  $engine_info = <a class="code" href="engines_8inc.html#ae94a82d80d5e90cb126de1f16a7f8fe4">drush_get_engines</a>(<span class="stringliteral">&#39;version_control&#39;</span>);</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;  $version_controls = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;version-control&#39;</span>, FALSE);</div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;  <span class="comment">// If no version control was given, use a list of defaults.</span></div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;  <span class="keywordflow">if</span> (!$version_controls) {</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;    <span class="comment">// Backup engine is the last option.</span></div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;    $version_controls = array_reverse(array_keys($engine_info[<span class="stringliteral">&#39;engines&#39;</span>]));</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;  }</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;    $version_controls = array($version_controls);</div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;  }</div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;  <span class="comment">// Find the first valid engine in the list, checking signatures if needed.</span></div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;  $engine = FALSE;</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;  <span class="keywordflow">while</span> (!$engine &amp;&amp; count($version_controls)) {</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;    $version_control = array_shift($version_controls);</div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;    <span class="keywordflow">if</span> (isset($engine_info[<span class="stringliteral">&#39;engines&#39;</span>][$version_control])) {</div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;      <span class="keywordflow">if</span> (!empty($engine_info[<span class="stringliteral">&#39;engines&#39;</span>][$version_control][<span class="stringliteral">&#39;signature&#39;</span>])) {</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Verifying signature for !vcs version control engine.&#39;</span>, array(<span class="stringliteral">&#39;!vcs&#39;</span> =&gt; $version_control)), LogLevel::DEBUG);</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>($engine_info[<span class="stringliteral">&#39;engines&#39;</span>][$version_control][<span class="stringliteral">&#39;signature&#39;</span>], $directory)) {</div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;          $engine = $version_control;</div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;        }</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;      }</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;        $engine = $version_control;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;      }</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;    }</div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;  }</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;  <span class="keywordflow">if</span> (!$engine) {</div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_NO_VERSION_CONTROL&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;No valid version control or backup engine found (the --version-control option was set to &quot;!version-control&quot;).&#39;</span>, array(<span class="stringliteral">&#39;!version-control&#39;</span> =&gt; $version_control)));</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;  }</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;</div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;  $instance = <a class="code" href="engines_8inc.html#a92390a2dd40c8ed5190be4af058813a8">drush_include_engine</a>(<span class="stringliteral">&#39;version_control&#39;</span>, $engine);</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;  <span class="keywordflow">return</span> $instance;</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;}</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;<span class="comment"> * Update the locked status of all of the candidate projects</span></div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;<span class="comment"> * to be updated.</span></div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;<span class="comment"> * @param array &amp;$projects</span></div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;<span class="comment"> *   The projects array from pm_updatecode.  $project[&#39;locked&#39;] will</span></div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;<span class="comment"> *   be set for every file where a persistent lockfile can be found.</span></div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;<span class="comment"> *   The &#39;lock&#39; and &#39;unlock&#39; operations are processed first.</span></div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;<span class="comment"> * @param array $projects_to_lock</span></div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;<span class="comment"> *   A list of projects to create peristent lock files for</span></div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;<span class="comment"> * @param array $projects_to_unlock</span></div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;<span class="comment"> *   A list of projects to clear the persistent lock on</span></div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;<span class="comment"> * @param string $lock_message</span></div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;<span class="comment"> *   The reason the project is being locked; stored in the lockfile.</span></div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;<span class="comment"> *   A list of projects that are locked.</span></div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01945"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ae6681be57636d2db04f48bcc85588b2c"> 1945</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#ae6681be57636d2db04f48bcc85588b2c">drush_pm_update_lock</a>(&amp;$projects, $projects_to_lock, $projects_to_unlock, $lock_message = NULL) {</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;  $locked_result = array();</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;  <span class="comment">// Warn about ambiguous lock / unlock values</span></div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;  <span class="keywordflow">if</span> ($projects_to_lock == array(<span class="charliteral">&#39;1&#39;</span>)) {</div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;    $projects_to_lock = array();</div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Ignoring --lock with no value.&#39;</span>), LogLevel::WARNING);</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;  }</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;  <span class="keywordflow">if</span> ($projects_to_unlock == array(<span class="charliteral">&#39;1&#39;</span>)) {</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;    $projects_to_unlock = array();</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Ignoring --unlock with no value.&#39;</span>), LogLevel::WARNING);</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;  }</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;</div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;  <span class="comment">// Log if we are going to lock or unlock anything</span></div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;  <span class="keywordflow">if</span> (!empty($projects_to_unlock)) {</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unlocking !projects&#39;</span>, array(<span class="stringliteral">&#39;!projects&#39;</span> =&gt; implode(<span class="charliteral">&#39;,&#39;</span>, $projects_to_unlock))), LogLevel::OK);</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;  }</div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;  <span class="keywordflow">if</span> (!empty($projects_to_lock)) {</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Locking !projects&#39;</span>, array(<span class="stringliteral">&#39;!projects&#39;</span> =&gt; implode(<span class="charliteral">&#39;,&#39;</span>, $projects_to_lock))), LogLevel::OK);</div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;  }</div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;</div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;  $drupal_root = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_DRUPAL_ROOT&#39;</span>);</div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;  <span class="keywordflow">foreach</span> ($projects as $name =&gt; $project) {</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;    $message = NULL;</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;    <span class="keywordflow">if</span> (isset($project[<span class="stringliteral">&#39;path&#39;</span>])) {</div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;      <span class="keywordflow">if</span> ($name == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;        $lockfile = $drupal_root . <span class="stringliteral">&#39;/.drush-lock-update&#39;</span>;</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;      }</div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;        $lockfile = $drupal_root . <span class="charliteral">&#39;/&#39;</span> . $project[<span class="stringliteral">&#39;path&#39;</span>] . <span class="stringliteral">&#39;/.drush-lock-update&#39;</span>;</div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;      }</div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;</div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;      <span class="comment">// Remove the lock file if the --unlock option was specified</span></div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;      <span class="keywordflow">if</span> (((in_array($name, $projects_to_unlock)) || (in_array(<span class="stringliteral">&#39;all&#39;</span>, $projects_to_unlock))) &amp;&amp; (file_exists($lockfile))) {</div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;        <a class="code" href="drush_8inc.html#acebe9ed4e4825e6d33ab8dff2157b676">drush_op</a>(<span class="stringliteral">&#39;unlink&#39;</span>, $lockfile);</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;      }</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;      <span class="comment">// Create the lock file if the --lock option was specified</span></div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;      <span class="keywordflow">if</span> ((in_array($name, $projects_to_lock)) || (in_array(<span class="stringliteral">&#39;all&#39;</span>, $projects_to_lock))) {</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;        <a class="code" href="drush_8inc.html#acebe9ed4e4825e6d33ab8dff2157b676">drush_op</a>(<span class="stringliteral">&#39;file_put_contents&#39;</span>, $lockfile, $lock_message != NULL ? $lock_message : <span class="stringliteral">&quot;Locked via drush.&quot;</span>);</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;        <span class="comment">// Note that the project is locked.  This will work even if we are simulated,</span></div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;        <span class="comment">// or if we get permission denied from the file_put_contents.</span></div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;        <span class="comment">// If the lock is -not- simulated or transient, then the lock message will be</span></div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;        <span class="comment">// read from the lock file below.</span></div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;        $message = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SIMULATE&#39;</span>) ? <span class="stringliteral">&#39;Simulated lock.&#39;</span> : <span class="stringliteral">&#39;Transient lock.&#39;</span>;</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;      }</div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;</div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;      <span class="comment">// If the persistent lock file exists, then mark the project as locked.</span></div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;      <span class="keywordflow">if</span> (file_exists($lockfile)) {</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;        $message = trim(file_get_contents($lockfile));</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;      }</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;    }</div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;    <span class="comment">// If there is a message set, then mark the project as locked.</span></div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;    <span class="keywordflow">if</span> (isset($message)) {</div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;      $projects[$name][<span class="stringliteral">&#39;locked&#39;</span>] = !empty($message) ? $message : <span class="stringliteral">&quot;Locked.&quot;</span>;</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;      $locked_result[$name] = $project;</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;    }</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;  }</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;</div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;  <span class="keywordflow">return</span> $locked_result;</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;}</div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;<span class="comment"> * Returns the path to the extensions cache file.</span></div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02011"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a567926af6bf845ab261f8088ed3650e9"> 2011</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a567926af6bf845ab261f8088ed3650e9">_drush_pm_extension_cache_file</a>() {</div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_PER_USER_CONFIGURATION&#39;</span>) . <span class="stringliteral">&quot;/drush-extension-cache.inc&quot;</span>;</div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;}</div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;<span class="comment"> * Load the extensions cache.</span></div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02018"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1a9f970e8e1525f29446ccd2dc3d482c"> 2018</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a1a9f970e8e1525f29446ccd2dc3d482c">_drush_pm_get_extension_cache</a>() {</div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;  $extension_cache = array();</div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;  $cache_file = <a class="code" href="pm_8drush_8inc.html#a567926af6bf845ab261f8088ed3650e9">_drush_pm_extension_cache_file</a>();</div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;</div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;  <span class="keywordflow">if</span> (file_exists($cache_file)) {</div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;    include $cache_file;</div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;  }</div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;  <span class="keywordflow">if</span> (!array_key_exists(<span class="stringliteral">&#39;extension-map&#39;</span>, $extension_cache)) {</div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;    $extension_cache[<span class="stringliteral">&#39;extension-map&#39;</span>] = array();</div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;  }</div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;  <span class="keywordflow">return</span> $extension_cache;</div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;}</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;<span class="comment"> * Lookup an extension in the extensions cache.</span></div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02034"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a62bdee36bea9dd3ce5edfd4efe81e375"> 2034</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a62bdee36bea9dd3ce5edfd4efe81e375">drush_pm_lookup_extension_in_cache</a>($extension) {</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;  $result = NULL;</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;  $extension_cache = <a class="code" href="pm_8drush_8inc.html#a1a9f970e8e1525f29446ccd2dc3d482c">_drush_pm_get_extension_cache</a>();</div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;  <span class="keywordflow">if</span> (!empty($extension_cache) &amp;&amp; array_key_exists($extension, $extension_cache)) {</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    $result = $extension_cache[$extension];</div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;  }</div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;}</div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;<span class="comment"> * Persists extensions cache.</span></div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="comment"> * #TODO# not implemented.</span></div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02048"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a8a4d344103347ff57afdfb7c22bd2eb3"> 2048</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a8a4d344103347ff57afdfb7c22bd2eb3">drush_pm_put_extension_cache</a>($extension_cache) {</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;}</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;<span class="comment"> * Store extensions founds within a project in extensions cache.</span></div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02054"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ab0b677f8357246eb16b6c994cb63eaf7"> 2054</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#ab0b677f8357246eb16b6c994cb63eaf7">drush_pm_cache_project_extensions</a>($project, $found) {</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;  $extension_cache = <a class="code" href="pm_8drush_8inc.html#a1a9f970e8e1525f29446ccd2dc3d482c">_drush_pm_get_extension_cache</a>();</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;  <span class="keywordflow">foreach</span>($found as $extension) {</div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;    <span class="comment">// Simple cache does not handle conflicts</span></div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;    <span class="comment">// We could keep an array of projects, and count</span></div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    <span class="comment">// how many times each one has been seen...</span></div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;    $extension_cache[$extension] = $project[<span class="stringliteral">&#39;name&#39;</span>];</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;  }</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;  <a class="code" href="pm_8drush_8inc.html#a8a4d344103347ff57afdfb7c22bd2eb3">drush_pm_put_extension_cache</a>($extension_cache);</div>
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;}</div>
<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<span class="comment"> * Print out all extensions (modules/themes/profiles) found in specified project.</span></div>
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;<span class="comment"> * Find .info.yml files in the project path and identify modules, themes and</span></div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;<span class="comment"> * profiles. It handles two kind of projects: drupal core/profiles and</span></div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<span class="comment"> * modules/themes.</span></div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="comment"> * It does nothing with theme engine projects.</span></div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l02073"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#acf732982c7f481e1bfc50db3bd269de9"> 2073</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#acf732982c7f481e1bfc50db3bd269de9">drush_pm_extensions_in_project</a>($project) {</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;  <span class="comment">// Mask for drush_scan_directory, to match .info.yml files.</span></div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;  $mask = $project[<span class="stringliteral">&#39;drupal_version&#39;</span>][0] &gt;= 8 ? <span class="stringliteral">&#39;/(.*)\.info\.yml$/&#39;</span> : <span class="stringliteral">&#39;/(.*)\.info$/&#39;</span>;</div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;  <span class="comment">// Mask for drush_scan_directory, to avoid tests directories.</span></div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;  $nomask = array(<span class="charliteral">&#39;.&#39;</span>, <span class="stringliteral">&#39;..&#39;</span>, <span class="stringliteral">&#39;CVS&#39;</span>, <span class="stringliteral">&#39;tests&#39;</span>);</div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;  <span class="comment">// Drupal core and profiles can contain modules, themes and profiles.</span></div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;  <span class="keywordflow">if</span> (in_array($project[<span class="stringliteral">&#39;project_type&#39;</span>], array(<span class="stringliteral">&#39;core&#39;</span>, <span class="stringliteral">&#39;profile&#39;</span>))) {</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;    $found = array(<span class="stringliteral">&#39;profile&#39;</span> =&gt; array(), <span class="stringliteral">&#39;theme&#39;</span> =&gt; array(), <span class="stringliteral">&#39;module&#39;</span> =&gt; array());</div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;    <span class="comment">// Find all of the .info files</span></div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;    <span class="keywordflow">foreach</span> (<a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($project[<span class="stringliteral">&#39;full_project_path&#39;</span>], $mask, $nomask) as $filename =&gt; $info) {</div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;      <span class="comment">// Extract extension name from filename.</span></div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;      $matches = array();</div>
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;      preg_match($mask, $info-&gt;basename, $matches);</div>
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;      $name = $matches[1];</div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;</div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;      <span class="comment">// Find the project type corresponding the .info file.</span></div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;     <span class="comment">// (Only drupal &gt;=7.x has .info for .profile)</span></div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;      $base = dirname($filename) . <span class="charliteral">&#39;/&#39;</span> . $name;</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;      <span class="keywordflow">if</span> (is_file($base . <span class="stringliteral">&#39;.module&#39;</span>)) {</div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;        $found[<span class="stringliteral">&#39;module&#39;</span>][] = $name;</div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;      }</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;      <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_file($base . <span class="stringliteral">&#39;.profile&#39;</span>)) {</div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;        $found[<span class="stringliteral">&#39;profile&#39;</span>][] = $name;</div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;      }</div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;        $found[<span class="stringliteral">&#39;theme&#39;</span>][] = $name;</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;      }</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;    }</div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;    <span class="comment">// Special case: find profiles for drupal &lt; 7.x (no .info)</span></div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;    <span class="keywordflow">if</span> ($project[<span class="stringliteral">&#39;drupal_version&#39;</span>][0] &lt; 7) {</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;      <span class="keywordflow">foreach</span> (drush_find_profiles($project[<span class="stringliteral">&#39;full_project_path&#39;</span>]) as $filename =&gt; $info) {</div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;        $found[<span class="stringliteral">&#39;profile&#39;</span>][] = $info-&gt;name;</div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;      }</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;    }</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;    <span class="comment">// Log results.</span></div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;    $msg = <span class="stringliteral">&quot;Project !project contains:\n&quot;</span>;</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;    $args = array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $project[<span class="stringliteral">&#39;name&#39;</span>]);</div>
<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;    <span class="keywordflow">foreach</span> (array_keys($found) as $type) {</div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;      <span class="keywordflow">if</span> ($count = count($found[$type])) {</div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;        $msg .= <span class="stringliteral">&quot; - !count_$type !type_$type: !found_$type\n&quot;</span>;</div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;        $args += array(<span class="stringliteral">&quot;!count_$type&quot;</span> =&gt; $count, <span class="stringliteral">&quot;!type_$type&quot;</span> =&gt; $type, <span class="stringliteral">&quot;!found_$type&quot;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $found[$type]));</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;        <span class="keywordflow">if</span> ($count &gt; 1) {</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;          $args[<span class="stringliteral">&quot;!type_$type&quot;</span>] = $type.<span class="charliteral">&#39;s&#39;</span>;</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;        }</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;      }</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;    }</div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>($msg, $args), LogLevel::SUCCESS);</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;    <a class="code" href="group__outputfunctions.html#ga03664ee5326159c3f8e6c97aa93c7981">drush_print_pipe</a>(call_user_func_array(<span class="stringliteral">&#39;array_merge&#39;</span>, array_values($found)));</div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;  }</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;  <span class="comment">// Modules and themes can only contain other extensions of the same type.</span></div>
<div class="line"><a name="l02125"></a><span c