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 
15 /**
16  * Project is a user requested version update.
17  */
18 define('DRUSH_PM_REQUESTED_UPDATE', 101);
19 
20 /**
21  * User requested version already installed.
22  */
23 define('DRUSH_PM_REQUESTED_CURRENT', 102);
24 
25 /**
26  * User requested project was not packaged by drupal.org.
27  */
28 define('DRUSH_PM_REQUESTED_PROJECT_NOT_PACKAGED', 103);
29 
30 /**
31  * User requested version not found.
32  */
33 define('DRUSH_PM_REQUESTED_VERSION_NOT_FOUND', 104);
34 
35 /**
36  * User requested project not found.
37  */
38 define('DRUSH_PM_REQUESTED_PROJECT_NOT_FOUND', 105);
39 
40 /**
41  * User requested project not updateable.
42  */
43 define('DRUSH_PM_REQUESTED_PROJECT_NOT_UPDATEABLE', 106);
44 
45 
46 /**
47  * Implementation of hook_drush_help().
48  */
49 function pm_drush_help($section) {
50  switch ($section) {
51  case 'meta:pm:title':
52  return dt('Project manager commands');
53  case 'meta:pm:summary':
54  return dt('Download, enable, examine and update your modules and themes.');
55  case 'drush:pm-enable':
56  return dt('Enable one or more extensions (modules or themes). Enable dependant extensions as well.');
57  case 'drush:pm-disable':
58  return dt('Disable one or more extensions (modules or themes). Disable dependant extensions as well.');
59  case 'drush:pm-updatecode':
60  case 'drush:pm-update':
61  $message = dt("Display available update information for Drupal core and all enabled projects and allow updating to latest recommended releases.");
62  if ($section == 'drush:pm-update') {
63  $message .= ' '.dt("Also apply any database updates required (same as pm-updatecode + updatedb).");
64  }
65  $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.");
66  return $message;
67  case 'drush:pm-updatecode-postupdate':
68  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.");
69  case 'drush:pm-download':
70  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.
71 
72 If no --destination is provided, then destination depends on the project type:
73  - Profiles will be downloaded to profiles/ in your Drupal root.
74  - 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.
75  - 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.
76  - 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')));
77  }
78 }
79 
80 /**
81  * Implementation of hook_drush_command().
82  */
83 function pm_drush_command() {
84  $update_options = array(
85  'lock' => array(
86  '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.',
87  'example-value' => 'foo,bar',
88  ),
89  );
90  $update_suboptions = array(
91  'lock' => array(
92  'lock-message' => array(
93  'description' => 'A brief message explaining why a project is being locked; displayed during pm-updatecode. Optional.',
94  'example-value' => 'message',
95  ),
96  'unlock' => array(
97  'description' => 'Remove the persistent lock from the specified projects so that they may be updated again.',
98  'example-value' => 'foo,bar',
99  ),
100  ),
101  );
102 
103  $items['pm-enable'] = array(
104  'description' => 'Enable one or more extensions (modules or themes).',
105  'arguments' => array(
106  'extensions' => 'A list of modules or themes. You can use the * wildcard at the end of extension names to enable all matches.',
107  ),
108  'options' => array(
109  'resolve-dependencies' => 'Attempt to download any missing dependencies. At the moment, only works when the module name is the same as the project name.',
110  'skip' => 'Skip automatic downloading of libraries (c.f. devel).',
111  ),
112  'aliases' => array('en'),
113  );
114  $items['pm-disable'] = array(
115  'description' => 'Disable one or more extensions (modules or themes).',
116  'arguments' => array(
117  'extensions' => 'A list of modules or themes. You can use the * wildcard at the end of extension names to disable multiple matches.',
118  ),
119  'aliases' => array('dis'),
120  'engines' => array(
121  'version_control',
122  'package_handler',
123  'release_info' => array(
124  'add-options-to-command' => FALSE,
125  ),
126  ),
127  );
128  $items['pm-info'] = array(
129  'description' => 'Show detailed info for one or more extensions (modules or themes).',
130  'arguments' => array(
131  '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.',
132  ),
133  'aliases' => array('pmi'),
134  'outputformat' => array(
135  'default' => 'key-value-list',
136  'pipe-format' => 'json',
137  'formatted-filter' => '_drush_pm_info_format_table_data',
138  'field-labels' => array(
139  'extension' => 'Extension',
140  'project' => 'Project',
141  'type' => 'Type',
142  'title' => 'Title',
143  'description' => 'Description',
144  'version' => 'Version',
145  'date' => 'Date',
146  'package' => 'Package',
147  'core' => 'Core',
148  'php' => 'PHP',
149  'status' => 'Status',
150  'path' => 'Path',
151  'schema_version' => 'Schema version',
152  'files' => 'Files',
153  'requires' => 'Requires',
154  'required_by' => 'Required by',
155  'permissions' => 'Permissions',
156  'config' => 'Configure',
157  'engine' => 'Engine',
158  'base_theme' => 'Base theme',
159  'regions' => 'Regions',
160  'features' => 'Features',
161  'stylesheets' => 'Stylesheets',
162  // 'media_' . $media => 'Media '. $media for each $info->info['stylesheets'] as $media => $files
163  'scripts' => 'Scripts',
164  ),
165  'output-data-type' => 'format-table',
166  ),
167  );
168  // Install command is reserved for the download and enable of projects including dependencies.
169  // @see http://drupal.org/node/112692 for more information.
170  // $items['install'] = array(
171  // 'description' => 'Download and enable one or more modules',
172  // );
173  $items['pm-uninstall'] = array(
174  'description' => 'Uninstall one or more modules.',
175  'arguments' => array(
176  'modules' => 'A list of modules.',
177  ),
178  'aliases' => array('pmu'),
179  );
180  $items['pm-list'] = array(
181  'description' => 'Show a list of available extensions (modules and themes).',
182  'callback arguments' => array(array(), FALSE),
183  'options' => array(
184  'type' => array(
185  'description' => 'Filter by extension type. Choices: module, theme.',
186  'example-value' => 'module',
187  ),
188  'status' => array(
189  '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").',
190  'example-value' => 'disabled',
191  ),
192  'package' => 'Filter by project packages. You can use multiple comma separated values. (i.e. --package="Core - required,Other").',
193  'core' => 'Filter out extensions that are not in drupal core.',
194  'no-core' => 'Filter out extensions that are provided by drupal core.',
195  ),
196  'outputformat' => array(
197  'default' => 'table',
198  'pipe-format' => 'list',
199  'field-labels' => array('package' => 'Package', 'name' => 'Name', 'type' => 'Type', 'status' => 'Status', 'version' => 'Version'),
200  'output-data-type' => 'format-table',
201  ),
202  'aliases' => array('pml'),
203  );
204  $items['pm-refresh'] = array(
205  'description' => 'Refresh update status information.',
206  'engines' => array(
207  'update_info' => array(
208  'add-options-to-command' => FALSE,
209  ),
210  ),
211  'aliases' => array('rf'),
212  );
213  $items['pm-updatestatus'] = array(
214  'description' => 'Show a report of available minor updates to Drupal core and contrib projects.',
215  'arguments' => array(
216  'projects' => 'Optional. A list of installed projects to show.',
217  ),
218  'options' => array(
219  'pipe' => 'Return a list of the projects with any extensions enabled that need updating, one project per line.',
220  ) + $update_options,
221  'sub-options' => $update_suboptions,
222  'engines' => array(
223  'update_info',
224  ),
225  'outputformat' => array(
226  'default' => 'table',
227  'pipe-format' => 'list',
228  'field-labels' => array('name' => 'Short Name', 'label' => 'Name', 'existing_version' => 'Installed Version', 'status' => 'Status', 'status_msg' => 'Message', 'candidate_version' => 'Proposed version'),
229  'fields-default' => array('label', 'existing_version', 'candidate_version', 'status_msg' ),
230  'fields-pipe' => array('name', 'existing_version', 'candidate_version', 'status_msg'),
231  'output-data-type' => 'format-table',
232  ),
233  'aliases' => array('ups'),
234  );
235  $items['pm-updatecode'] = array(
236  'description' => 'Update Drupal core and contrib projects to latest recommended releases.',
237  'examples' => array(
238  'drush pm-updatecode --no-core' => 'Update contrib projects, but skip core.',
239  '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.',
240  ),
241  'arguments' => array(
242  'projects' => 'Optional. A list of installed projects to update.',
243  ),
244  'options' => array(
245  'notes' => 'Show release notes for each project to be updated.',
246  'no-core' => 'Only update modules and skip the core update.',
247  'check-updatedb' => 'Check to see if an updatedb is needed after updating the code. Default is on; use --check-updatedb=0 to disable.',
248  ) + $update_options,
249  'sub-options' => $update_suboptions,
250  'aliases' => array('upc'),
251  'topics' => array('docs-policy'),
252  'engines' => array(
253  'version_control',
254  'package_handler',
255  'release_info' => array(
256  'add-options-to-command' => FALSE,
257  ),
258  'update_info',
259  ),
260  );
261  // Merge all items from above.
262  $items['pm-update'] = array(
263  'description' => 'Update Drupal core and contrib projects and apply any pending database updates (Same as pm-updatecode + updatedb).',
264  'aliases' => array('up'),
265  'allow-additional-options' => array('pm-updatecode', 'updatedb'),
266  );
267  $items['pm-updatecode-postupdate'] = array(
268  'description' => 'Notify of pending db updates.',
269  'hidden' => TRUE,
270  );
271  $items['pm-releasenotes'] = array(
272  'description' => 'Print release notes for given projects.',
273  'arguments' => array(
274  'projects' => 'A list of project names, with optional version. Defaults to \'drupal\'',
275  ),
276  'options' => array(
277  'html' => dt('Display release notes in HTML rather than plain text.'),
278  ),
279  'examples' => array(
280  'drush rln cck' => 'Prints the release notes for the recommended version of CCK project.',
281  'drush rln token-1.13' => 'View release notes of a specfic version of the Token project for my version of Drupal.',
282  'drush rln pathauto zen' => 'View release notes for the recommended version of Pathauto and Zen projects.',
283  ),
284  'aliases' => array('rln'),
285  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
286  'engines' => array(
287  'release_info',
288  ),
289  );
290  $items['pm-releases'] = array(
291  'description' => 'Print release information for given projects.',
292  'arguments' => array(
293  'projects' => 'A list of drupal.org project names. Defaults to \'drupal\'',
294  ),
295  'examples' => array(
296  'drush pm-releases cck zen' => 'View releases for cck and Zen projects for your Drupal version.',
297  ),
298  'options' => array(
299  'default-major' => 'Show releases compatible with the specified major version of Drupal.',
300  ),
301  'aliases' => array('rl'),
302  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
303  'outputformat' => array(
304  'default' => 'table',
305  'pipe-format' => 'csv',
306  'field-labels' => array('project' => 'Project', 'version' => 'Release', 'date' => 'Date', 'status' => 'Status'),
307  'fields-default' => array('project', 'version', 'date', 'status'),
308  'fields-pipe' => array('project', 'version', 'date', 'status'),
309  'output-data-type' => 'format-table',
310  ),
311  'engines' => array(
312  'release_info',
313  ),
314  );
315  $items['pm-download'] = array(
316  'description' => 'Download projects from drupal.org or other sources.',
317  'examples' => array(
318  'drush dl drupal' => 'Download latest recommended release of Drupal core.',
319  'drush dl drupal-7.x' => 'Download latest 7.x development version of Drupal core.',
320  'drush dl drupal-6' => 'Download latest recommended release of Drupal 6.x.',
321  'drush dl cck zen' => 'Download latest versions of CCK and Zen projects.',
322  'drush dl og-1.3' => 'Download a specfic version of Organic groups module for my version of Drupal.',
323  'drush dl diff-6.x-2.x' => 'Download a specific development branch of diff module for a specific Drupal version.',
324  'drush dl views --select' => 'Show a list of recent releases of the views project, prompt for which one to download.',
325  'drush dl webform --dev' => 'Download the latest dev release of webform.',
326  'drush dl webform --cache' => 'Download webform. Fetch and populate the download cache as needed.',
327  ),
328  'arguments' => array(
329  'projects' => 'A comma delimited list of drupal.org project names, with optional version. Defaults to \'drupal\'',
330  ),
331  'options' => array(
332  'destination' => array(
333  '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).',
334  'example-value' => 'path',
335  ),
336  '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.',
337  'notes' => 'Show release notes after each project is downloaded.',
338  'variant' => array(
339  'description' => "Only useful for install profiles. Possible values: 'full', 'projects', 'profile-only'.",
340  'example-value' => 'full',
341  ),
342  'select' => "Select the version to download interactively from a list of available releases.",
343  'drupal-project-rename' => 'Alternate name for "drupal-x.y" directory when downloading Drupal project. Defaults to "drupal".',
344  'default-major' => array(
345  'description' => 'Specify the default major version of modules to download when there is no bootstrapped Drupal site. Defaults to "7".',
346  'example-value' => '6',
347  ),
348  'skip' => 'Skip automatic downloading of libraries (c.f. devel).',
349  'pipe' => 'Returns a list of the names of the extensions (modules and themes) contained in the downloaded projects.',
350  ),
351  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
352  'aliases' => array('dl'),
353  'engines' => array(
354  'version_control',
355  'package_handler',
356  'release_info',
357  ),
358  );
359  return $items;
360 }
361 
362 /**
363  * @defgroup extensions Extensions management.
364  * @{
365  * Functions to manage extensions.
366  */
367 
368 /**
369  * Command argument complete callback.
370  */
372  return pm_complete_extensions();
373 }
374 
375 /**
376  * Command argument complete callback.
377  */
379  return pm_complete_extensions();
380 }
381 
382 /**
383  * Command argument complete callback.
384  */
386  return pm_complete_extensions();
387 }
388 
389 /**
390  * Command argument complete callback.
391  */
393  return pm_complete_extensions();
394 }
395 
396 /**
397  * Command argument complete callback.
398  */
400  return pm_complete_projects();
401 }
402 
403 /**
404  * Command argument complete callback.
405  */
407  return pm_complete_projects();
408 }
409 
410 /**
411  * Command argument complete callback.
412  */
414  return pm_complete_projects();
415 }
416 
417 /**
418  * Command argument complete callback.
419  */
421  return pm_complete_projects();
422 }
423 
424 /**
425  * List extensions for completion.
426  *
427  * @return
428  * Array of available extensions.
429  */
432  $extension_info = drush_get_extensions(FALSE);
433  return array('values' => array_keys($extension_info));
434  }
435 }
436 
437 /**
438  * List projects for completion.
439  *
440  * @return
441  * Array of installed projects.
442  */
445  return array('values' => array_keys(drush_get_projects()));
446  }
447 }
448 
449 /**
450  * Sort callback function for sorting extensions.
451  *
452  * It will sort first by type, second by package and third by name.
453  */
454 function _drush_pm_sort_extensions($a, $b) {
455  $a_type = drush_extension_get_type($a);
456  $b_type = drush_extension_get_type($b);
457  if ($a_type == 'module' && $b_type == 'theme') {
458  return -1;
459  }
460  if ($a_type == 'theme' && $b_type == 'module') {
461  return 1;
462  }
463  $cmp = strcasecmp($a->info['package'], $b->info['package']);
464  if ($cmp == 0) {
465  $cmp = strcasecmp($a->info['name'], $b->info['name']);
466  }
467  return $cmp;
468 }
469 
470 /**
471  * Calculate an extension status based on current status and schema version.
472  *
473  * @param $extension
474  * Object of a single extension info.
475  *
476  * @return
477  * String describing extension status. Values: enabled|disabled|not installed
478  */
479 function drush_get_extension_status($extension) {
480  if ((drush_extension_get_type($extension) == 'module') && ($extension->schema_version == -1)) {
481  $status = "not installed";
482  }
483  else {
484  $status = ($extension->status == 1)?'enabled':'disabled';
485  }
486 
487  return $status;
488 }
489 
490 /**
491  * Classify extensions as modules, themes or unknown.
492  *
493  * @param $extensions
494  * Array of extension names, by reference.
495  * @param $modules
496  * Empty array to be filled with modules in the provided extension list.
497  * @param $themes
498  * Empty array to be filled with themes in the provided extension list.
499  */
500 function drush_pm_classify_extensions(&$extensions, &$modules, &$themes, $extension_info) {
501  _drush_pm_expand_extensions($extensions, $extension_info);
502  foreach ($extensions as $extension) {
503  if (!isset($extension_info[$extension])) {
504  continue;
505  }
506  $type = drush_extension_get_type($extension_info[$extension]);
507  if ($type == 'module') {
508  $modules[$extension] = $extension;
509  }
510  else if ($type == 'theme') {
511  $themes[$extension] = $extension;
512  }
513  }
514 }
515 
516 /**
517  * Obtain an array of installed projects off the extensions available.
518  *
519  * A project is considered to be 'enabled' when any of its extensions is
520  * enabled.
521  * If any extension lacks project information and it is found that the
522  * extension was obtained from drupal.org's cvs or git repositories, a new
523  * 'vcs' attribute will be set on the extension. Example:
524  * $extensions[name]->vcs = 'cvs';
525  *
526  * @param array $extensions
527  * Array of extensions as returned by drush_get_extensions().
528  *
529  * @return
530  * Array of installed projects with info of version, status and provided
531  * extensions.
532  */
533 function drush_get_projects(&$extensions = NULL) {
534  if (!isset($extensions)) {
535  $extensions = drush_get_extensions();
536  }
537  $projects = array(
538  'drupal' => array(
539  'label' => 'Drupal',
540  'version' => drush_drupal_version(),
541  'type' => 'core',
542  'extensions' => array(),
543  )
544  );
545  foreach ($extensions as $extension) {
546  // The project name is not available in this cases:
547  // 1. the extension is part of drupal core.
548  // 2. the project was checked out from CVS/git and cvs_deploy/git_deploy
549  // is not installed.
550  // 3. it is not a project hosted in drupal.org.
551  if (empty($extension->info['project'])) {
552  if (isset($extension->info['version']) && ($extension->info['version'] == drush_drupal_version())) {
553  $project = 'drupal';
554  }
555  else {
556  $extension_name = drush_extension_get_name($extension);
557  $extension_path = drush_extension_get_path($extension);
558  drush_include_engine('drupal', 'environment');
559  if (is_dir($extension_path . '/CVS') && (!drush_module_exists('cvs_deploy'))) {
560  $extension->vcs = 'cvs';
561  drush_log(dt('Extension !extension is fetched from cvs. Ignoring.', array('!extension' => $extension_name)), 'debug');
562  }
563  elseif (is_dir($extension_path . '/.git') && (!drush_module_exists('git_deploy'))) {
564  $extension->vcs = 'git';
565  drush_log(dt('Extension !extension is fetched from git. Ignoring.', array('!extension' => $extension_name)), 'debug');
566  }
567  continue;
568  }
569  }
570  else {
571  $project = $extension->info['project'];
572  }
573  // Create/update the project in $projects with the project data.
574  if (!isset($projects[$project])) {
575  $projects[$project] = array(
576  // If there's an extension with matching name, pick its label.
577  // Otherwise use just the project name. We avoid $extension->label
578  // for the project label because the extension's label may have
579  // no direct relation with the project name. For example,
580  // "Text (text)" or "Number (number)" for the CCK project.
581  'label' => isset($extensions[$project])?$extensions[$project]->label:$project,
582  'type' => drush_extension_get_type($extension),
583  'version' => $extension->info['version'],
584  'status' => $extension->status,
585  'extensions' => array(),
586  );
587  if (isset($extension->info['project status url'])) {
588  $projects[$project]['status url'] = $extension->info['project status url'];
589  }
590  }
591  elseif ($extension->status != 0) {
592  $projects[$project]['status'] = $extension->status;
593  }
594  $projects[$project]['extensions'][] = drush_extension_get_name($extension);
595  }
596 
597  // Obtain each project's path and try to provide a better label for ones
598  // with machine name.
599  $reserved = array('modules', 'sites', 'themes');
600  foreach ($projects as $name => $project) {
601  if ($name == 'drupal') {
602  continue;
603  }
604 
605  // If this project has no human label, see if we can find
606  // one "main" extension whose label we could use.
607  if ($project['label'] == $name) {
608  // If there is only one extension, construct a label based on
609  // the extension name.
610  if (count($project['extensions']) == 1) {
611  $extension = $extensions[$project['extensions'][0]];
612  $projects[$name]['label'] = $extension->info['name'] . ' (' . $name . ')';
613  }
614  else {
615  // Make a list of all of the extensions in this project
616  // that do not depend on any other extension in this
617  // project.
618  $candidates = array();
619  foreach ($project['extensions'] as $e) {
620  $has_project_dependency = FALSE;
621  if (isset($extensions[$e]->info['dependencies']) && is_array($extensions[$e]->info['dependencies'])) {
622  foreach ($extensions[$e]->info['dependencies'] as $dependent) {
623  if (in_array($dependent, $project['extensions'])) {
624  $has_project_dependency = TRUE;
625  }
626  }
627  }
628  if ($has_project_dependency === FALSE) {
629  $candidates[] = $extensions[$e]->info['name'];
630  }
631  }
632  // If only one of the modules is a candidate, use its name in the label
633  if (count($candidates) == 1) {
634  $projects[$name]['label'] = reset($candidates) . ' (' . $name . ')';
635  }
636  }
637  }
638 
639  drush_log(dt('Obtaining !project project path.', array('!project' => $name)), 'debug');
640  $path = _drush_pm_find_common_path($project['type'], $project['extensions']);
641  // Prevent from setting a reserved path. For example it may happen in a case
642  // where a module and a theme are declared as part of a same project.
643  // There's a special case, a project called "sites", this is the reason for
644  // the second condition here.
645  if ($path == '.' || (in_array(basename($path), $reserved) && !in_array($name, $reserved))) {
646  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']))), 'error');
647  }
648  else {
649  $projects[$name]['path'] = $path;
650  }
651  }
652 
653  return $projects;
654 }
655 
656 /**
657  * Helper function to find the common path for a list of extensions in the aim to obtain the project name.
658  *
659  * @param $project_type
660  * Type of project we're trying to find. Valid values: module, theme.
661  * @param $extensions
662  * Array of extension names.
663  */
664 function _drush_pm_find_common_path($project_type, $extensions) {
665  // Select the first path as the candidate to be the common prefix.
666  $extension = array_pop($extensions);
667  while (!($path = drupal_get_path($project_type, $extension))) {
668  drush_log(dt('Unknown path for !extension !type.', array('!extension' => $extension, '!type' => $project_type)), 'warning');
669  $extension = array_pop($extensions);
670  }
671 
672  // If there's only one extension we are done. Otherwise, we need to find
673  // the common prefix for all of them.
674  if (count($extensions) > 0) {
675  // Iterate over the other projects.
676  while($extension = array_pop($extensions)) {
677  $path2 = drupal_get_path($project_type, $extension);
678  if (!$path2) {
679  drush_log(dt('Unknown path for !extension !type.', array('!extension' => $extension, '!type' => $project_type)), 'debug');
680  continue;
681  }
682  // Option 1: same path.
683  if ($path == $path2) {
684  continue;
685  }
686  // Option 2: $path is a prefix of $path2.
687  if (strpos($path2, $path) === 0) {
688  continue;
689  }
690  // Option 3: $path2 is a prefix of $path.
691  if (strpos($path, $path2) === 0) {
692  $path = $path2;
693  continue;
694  }
695  // Option 4: no one is a prefix of the other. Find the common
696  // prefix by iteratively strip the rigthtmost piece of $path.
697  // We will iterate until a prefix is found or path = '.', that on the
698  // other hand is a condition theorically impossible to reach.
699  do {
700  $path = dirname($path);
701  if (strpos($path2, $path) === 0) {
702  break;
703  }
704  } while ($path != '.');
705  }
706  }
707 
708  return $path;
709 }
710 
711 /**
712  * @} End of "defgroup extensions".
713  */
714 
715 /**
716  * Command callback. Show a list of extensions with type and status.
717  */
718 function drush_pm_list() {
719  //--package
720  $package_filter = array();
721  $package = strtolower(drush_get_option('package'));
722  if (!empty($package)) {
723  $package_filter = explode(',', $package);
724  }
725  if (!empty($package_filter) && (count($package_filter) == 1)) {
726  drush_hide_output_fields('package');
727  }
728 
729  //--type
730  $all_types = array('module', 'theme');
731  $type_filter = strtolower(drush_get_option('type'));
732  if (!empty($type_filter)) {
733  $type_filter = explode(',', $type_filter);
734  }
735  else {
736  $type_filter = $all_types;
737  }
738 
739  if (count($type_filter) == 1) {
740  drush_hide_output_fields('type');
741  }
742  foreach ($type_filter as $type) {
743  if (!in_array($type, $all_types)) { //TODO: this kind of check can be implemented drush-wide
744  return drush_set_error('DRUSH_PM_INVALID_PROJECT_TYPE', dt('!type is not a valid project type.', array('!type' => $type)));
745  }
746  }
747 
748  //--status
749  $all_status = array('enabled', 'disabled', 'not installed');
750  $status_filter = strtolower(drush_get_option('status'));
751  if (!empty($status_filter)) {
752  $status_filter = explode(',', $status_filter);
753  }
754  else {
755  $status_filter = $all_status;
756  }
757  if (count($status_filter) == 1) {
758  drush_hide_output_fields('status');
759  }
760 
761  foreach ($status_filter as $status) {
762  if (!in_array($status, $all_status)) { //TODO: this kind of check can be implemented drush-wide
763  return drush_set_error('DRUSH_PM_INVALID_PROJECT_TYPE', dt('!status is not a valid project status.', array('!status' => $status)));
764  }
765  }
766 
767  $result = array();
768  $extension_info = drush_get_extensions(FALSE);
769  uasort($extension_info, '_drush_pm_sort_extensions');
770 
771  $major_version = drush_drupal_major_version();
772  foreach ($extension_info as $key => $extension) {
773  if (!in_array(drush_extension_get_type($extension), $type_filter)) {
774  unset($extension_info[$key]);
775  continue;
776  }
777  $status = drush_get_extension_status($extension);
778  if (!in_array($status, $status_filter)) {
779  unset($extension_info[$key]);
780  continue;
781  }
782 
783  // filter out core if --no-core specified
784  if (drush_get_option('no-core', FALSE)) {
785  if (($extension->info['package'] == 'Core') || ((array_key_exists('project', $extension->info)) && ($extension->info['project'] == 'drupal'))) {
786  unset($extension_info[$key]);
787  continue;
788  }
789  }
790 
791  // filter out non-core if --core specified
792  if (drush_get_option('core', FALSE)) {
793  if (($extension->info['package'] != 'Core') && ((!array_key_exists('project', $extension->info)) || ($extension->info['project'] != 'drupal'))) {
794  unset($extension_info[$key]);
795  continue;
796  }
797  }
798 
799  // filter by package
800  if (!empty($package_filter)) {
801  if (!in_array(strtolower($extension->info['package']), $package_filter)) {
802  unset($extension_info[$key]);
803  continue;
804  }
805  }
806 
807  $row['package'] = $extension->info['package'];
808  $row['name'] = $extension->label;
809  $row['type'] = ucfirst(drush_extension_get_type($extension));
810  $row['status'] = ucfirst($status);
811  // Suppress notice when version is not present.
812  $row['version'] = @$extension->info['version'];
813 
814  $result[$key] = $row;
815  unset($row);
816  }
817  // In Drush-5, we used to return $extension_info here.
818  return $result;
819 }
820 
821 /**
822  * Helper function for pm-enable.
823  */
825  $result = drush_pm_lookup_extension_in_cache($extension);
826 
827  if (!isset($result)) {
828  drush_include_engine('release_info', 'updatexml');
829  // If we can find info on a project that has the same name
830  // as the requested extension, then we'll call that a match.
831  $request = pm_parse_project_version(array($extension));
832  if (release_info_check_project($request[$extension])) {
833  $result = $extension;
834  }
835  }
836 
837  return $result;
838 }
839 
840 /**
841  * Validate callback. Determine the modules and themes that the user would like enabled.
842  */
845 
846  $extension_info = drush_get_extensions();
847 
848  $recheck = TRUE;
849  while ($recheck) {
850  $recheck = FALSE;
851 
852  // Classify $args in themes, modules or unknown.
853  $modules = array();
854  $themes = array();
855  $download = array();
856  drush_pm_classify_extensions($args, $modules, $themes, $extension_info);
857  $extensions = array_merge($modules, $themes);
858  $unknown = array_diff($args, $extensions);
859 
860  // If there're unknown extensions, try and download projects
861  // with matching names.
862  if (!empty($unknown)) {
863  $found = array();
864  foreach ($unknown as $key => $name) {
865  drush_log(dt('!extension was not found.', array('!extension' => $name)), 'warning');
866  $project = drush_pm_find_project_from_extension($name);
867  if (!empty($project)) {
868  $found[] = $project;
869  }
870  }
871  if (!empty($found)) {
872  drush_log(dt("The following projects provide some or all of the extensions not found:\n@list", array('@list' => implode("\n", $found))), 'ok');
873  if (drush_get_option('resolve-dependencies')) {
874  drush_log(dt("They are being downloaded."), 'ok');
875  }
876  if ((drush_get_option('resolve-dependencies')) || (drush_confirm("Would you like to download them?"))) {
877  $download = $found;
878  }
879  }
880  }
881 
882  // Discard already enabled and incompatible extensions.
883  foreach ($extensions as $name) {
884  if ($extension_info[$name]->status) {
885  drush_log(dt('!extension is already enabled.', array('!extension' => $name)), 'ok');
886  }
887  // Check if the extension is compatible with Drupal core and php version.
888  if ($component = drush_extension_check_incompatibility($extension_info[$name])) {
889  drush_set_error('DRUSH_PM_ENABLE_MODULE_INCOMPATIBLE', dt('!name is incompatible with the !component version.', array('!name' => $name, '!component' => $component)));
890  if (drush_extension_get_type($extension_info[$name]) == 'module') {
891  unset($modules[$name]);
892  }
893  else {
894  unset($themes[$name]);
895  }
896  }
897  }
898 
899  if (!empty($modules)) {
900  // Check module dependencies.
901  $dependencies = drush_check_module_dependencies($modules, $extension_info);
902  $unmet_dependencies = array();
903  foreach ($dependencies as $module => $info) {
904  if (!empty($info['unmet-dependencies'])) {
905  foreach ($info['unmet-dependencies'] as $unmet_module) {
906  $unmet_project = drush_pm_find_project_from_extension($unmet_module);
907  if (!empty($unmet_project)) {
908  $unmet_dependencies[$module][$unmet_project] = $unmet_project;
909  }
910  }
911  }
912  }
913  if (!empty($unmet_dependencies)) {
914  $msgs = array();
915  $unmet_project_list = array();
916  foreach ($unmet_dependencies as $module => $unmet_projects) {
917  $unmet_project_list = array_merge($unmet_project_list, $unmet_projects);
918  $msgs[] = dt("!module requires !unmet-projects", array('!unmet-projects' => implode(', ', $unmet_projects), '!module' => $module));
919  }
920  drush_log(dt("The following projects have unmet dependencies:\n!list", array('!list' => implode("\n", $msgs))), 'ok');
921  if (drush_get_option('resolve-dependencies')) {
922  drush_log(dt("They are being downloaded."), 'ok');
923  }
924  if (drush_get_option('resolve-dependencies') || drush_confirm(dt("Would you like to download them?"))) {
925  $download = array_merge($download, $unmet_project_list);
926  }
927  }
928  }
929 
930  if (!empty($download)) {
931  // Disable DRUSH_AFFIRMATIVE context temporarily.
932  $drush_affirmative = drush_get_context('DRUSH_AFFIRMATIVE');
933  drush_set_context('DRUSH_AFFIRMATIVE', FALSE);
934  // Invoke a new process to download dependencies.
935  $result = drush_invoke_process('@self', 'pm-download', $download, array(), array('interactive' => TRUE));
936  // Restore DRUSH_AFFIRMATIVE context.
937  drush_set_context('DRUSH_AFFIRMATIVE', $drush_affirmative);
938  // Refresh module cache after downloading the new modules.
939  $extension_info = drush_get_extensions();
940  $recheck = TRUE;
941  }
942  }
943 
944  if (!empty($modules)) {
945  $all_dependencies = array();
946  $dependencies_ok = TRUE;
947  foreach ($dependencies as $key => $info) {
948  if (isset($info['error'])) {
949  unset($modules[$key]);
950  $dependencies_ok = drush_set_error($info['error']['code'], $info['error']['message']);
951  }
952  elseif (!empty($info['dependencies'])) {
953  // Make sure we have an assoc array.
954  $assoc = array_combine($info['dependencies'], $info['dependencies']);
955  $all_dependencies = array_merge($all_dependencies, $assoc);
956  }
957  }
958  if (!$dependencies_ok) {
959  return FALSE;
960  }
961  $modules = array_diff(array_merge($modules, $all_dependencies), drush_module_list());
962  // Discard modules which doesn't meet requirements.
963  require_once DRUSH_DRUPAL_CORE . '/includes/install.inc';
964  foreach ($modules as $key => $module) {
965  // Check to see if the module can be installed/enabled (hook_requirements).
966  // See @system_modules_submit
967  if (!drupal_check_module($module)) {
968  unset($modules[$key]);
969  drush_set_error('DRUSH_PM_ENABLE_MODULE_UNMEET_REQUIREMENTS', dt('Module !module doesn\'t meet the requirements to be enabled.', array('!module' => $module)));
971  return FALSE;
972  }
973  }
974  }
975 
976  $searchpath = array();
977  foreach (array_merge($modules, $themes) as $name) {
978  $searchpath[] = drush_extension_get_path($extension_info[$name]);
979  }
980  // Add all modules that passed validation to the drush
981  // list of commandfiles (if they have any). This
982  // will allow these newly-enabled modules to participate
983  // in the pre-pm_enable and post-pm_enable hooks.
984  if (!empty($searchpath)) {
985  _drush_add_commandfiles($searchpath);
986  }
987 
988  drush_set_context('PM_ENABLE_EXTENSION_INFO', $extension_info);
989  drush_set_context('PM_ENABLE_MODULES', $modules);
990  drush_set_context('PM_ENABLE_THEMES', $themes);
991 
992  return TRUE;
993 }
994 
995 /**
996  * Command callback. Enable one or more extensions from downloaded projects.
997  * Note that the modules and themes to be enabled were evaluated during the
998  * pm-enable validate hook, above.
999  */
1000 function drush_pm_enable() {
1001  // Get the data built during the validate phase
1002  $extension_info = drush_get_context('PM_ENABLE_EXTENSION_INFO');
1003  $modules = drush_get_context('PM_ENABLE_MODULES');
1004  $themes = drush_get_context('PM_ENABLE_THEMES');
1005 
1006  // Inform the user which extensions will finally be enabled.
1007  $extensions = array_merge($modules, $themes);
1008  if (empty($extensions)) {
1009  return drush_log(dt('There were no extensions that could be enabled.'), 'ok');
1010  }
1011  else {
1012  drush_print(dt('The following extensions will be enabled: !extensions', array('!extensions' => implode(', ', $extensions))));
1013  if(!drush_confirm(dt('Do you really want to continue?'))) {
1014  return drush_user_abort();
1015  }
1016  }
1017 
1018  // Enable themes.
1019  if (!empty($themes)) {
1020  drush_theme_enable($themes);
1021  }
1022 
1023  // Enable modules and pass dependency validation in form submit.
1024  if (!empty($modules)) {
1025  drush_include_engine('drupal', 'environment');
1026  drush_module_enable($modules);
1027  }
1028 
1029  // Inform the user of final status.
1030  $result_extensions = drush_get_named_extensions_list($extensions);
1031  $problem_extensions = array();
1032  $role = drush_role_get_class();
1033  foreach ($result_extensions as $name => $extension) {
1034  if ($extension->status) {
1035  drush_log(dt('!extension was enabled successfully.', array('!extension' => $name)), 'ok');
1036  $perms = $role->getModulePerms($name);
1037  if (!empty($perms)) {
1038  drush_print(dt('!extension defines the following permissions: !perms', array('!extension' => $name, '!perms' => implode(', ', $perms))));
1039  }
1040  }
1041  else {
1042  $problem_extensions[] = $name;
1043  }
1044  }
1045  if (!empty($problem_extensions)) {
1046  return drush_set_error('DRUSH_PM_ENABLE_EXTENSION_ISSUE', dt('There was a problem enabling !extension.', array('!extension' => implode(',', $problem_extensions))));
1047  }
1048  // Return the list of extensions enabled
1049  return $extensions;
1050 }
1051 
1052 /**
1053  * Command callback. Disable one or more extensions.
1054  */
1055 function drush_pm_disable() {
1056  $args = pm_parse_arguments(func_get_args());
1058  _drush_pm_disable($args);
1059 }
1060 
1061 /**
1062  * Add extensions that match extension_name*.
1063  *
1064  * A helper function for commands that take a space separated list of extension
1065  * names. It will identify extensions that have been passed in with a
1066  * trailing * and add all matching extensions to the array that is returned.
1067  *
1068  * @param $extensions
1069  * An array of extensions, by reference.
1070  * @param $extension_info
1071  * Optional. An array of extension info as returned by drush_get_extensions().
1072  */
1073 function _drush_pm_expand_extensions(&$extensions, $extension_info = array()) {
1074  if (empty($extension_info)) {
1075  $extension_info = drush_get_extensions();
1076  }
1077  foreach ($extensions as $key => $extension) {
1078  if (($wildcard = rtrim($extension, '*')) !== $extension) {
1079  foreach (array_keys($extension_info) as $extension_name) {
1080  if (substr($extension_name, 0, strlen($wildcard)) == $wildcard) {
1081  $extensions[] = $extension_name;
1082  }
1083  }
1084  unset($extensions[$key]);
1085  continue;
1086  }
1087  }
1088 }
1089 
1090 /**
1091  * Command callback. Uninstall one or more modules.
1092  */
1094  $args = pm_parse_arguments(func_get_args());
1096  _drush_pm_uninstall($args);
1097 }
1098 
1099 /**
1100  * Command callback. Show available releases for given project(s).
1101  */
1102 function drush_pm_releases() {
1103  if (!$requests = pm_parse_arguments(func_get_args(), FALSE)) {
1104  $requests = array('drupal');
1105  }
1106 
1107  // Parse out project name and version.
1108  $requests = pm_parse_project_version($requests);
1109 
1110  $info = release_info_get_releases($requests);
1111  drush_backend_set_result($info);
1112  if (!$info) {
1113  return drush_log(dt('No valid projects given.'), 'ok');
1114  }
1115 
1116  $all = drush_get_option('all', FALSE);
1117  $dev = drush_get_option('dev', FALSE);
1118  foreach ($info as $name => $project) {
1119  $releases = release_info_filter_releases($project['releases'], $all, $dev);
1120  foreach ($releases as $key => $release) {
1121  $rows[$key] = array(
1122  'project' => $name,
1123  'version' => $release['version'],
1124  'date' => gmdate('Y-M-d', $release['date']),
1125  'status' => implode(', ', $release['release_status'])
1126  );
1127  }
1128  }
1129  return $rows;
1130 }
1131 
1132 /**
1133  * Command callback. Show release notes for given project(s).
1134  */
1136  if (!$requests = pm_parse_arguments(func_get_args(), FALSE)) {
1137  $requests = array('drupal');
1138  }
1139  $requests = pm_parse_project_version($requests);
1140 
1141  return release_info_print_releasenotes($requests);
1142 }
1143 
1144 /**
1145  * Command callback. Refresh update status information.
1146  */
1147 function drush_pm_refresh() {
1148  _pm_refresh();
1149 }
1150 
1151 /**
1152  * Command callback. Execute pm-update.
1153  */
1154 function drush_pm_update() {
1155  // Call pm-updatecode. updatedb will be called in the post-update process.
1156  $args = pm_parse_arguments(func_get_args(), FALSE);
1157  drush_set_option('check-updatedb', FALSE);
1158  return drush_invoke('pm-updatecode', $args);
1159 }
1160 
1161 /**
1162  * Post-command callback.
1163  * Execute updatedb command after an updatecode - user requested `update`.
1164  */
1166  // Use drush_invoke_process to start a subprocess. Cleaner that way.
1167  if (drush_get_context('DRUSH_PM_UPDATED', FALSE) !== FALSE) {
1168  drush_invoke_process('@self', 'updatedb');
1169  }
1170 }
1171 
1172 /**
1173  * Validate callback for updatecode command. Abort if 'backup' directory exists.
1174  */
1176  $path = drush_get_context('DRUSH_DRUPAL_ROOT') . '/backup';
1177  if (is_dir($path) && (realpath(drush_get_option('backup-dir', FALSE)) != $path)) {
1178  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)));
1179  }
1180 }
1181 
1182 /**
1183  * Post-command callback for updatecode.
1184  *
1185  * Execute pm-updatecode-postupdate in a backend process to not conflict with
1186  * old code already in memory.
1187  */
1189  // Skip if updatecode was invoked by pm-update.
1190  // This way we avoid being noisy, as updatedb is to be executed.
1191  if (drush_get_option('check-updatedb', TRUE)) {
1192  if (drush_get_context('DRUSH_PM_UPDATED', FALSE)) {
1193  drush_invoke_process('@self', 'pm-updatecode-postupdate');
1194  }
1195  }
1196 }
1197 
1198 /**
1199  * Command callback. Execute updatecode-postupdate.
1200  */
1202  // Clear the cache, since some projects could have moved around.
1204 
1205  // Notify of pending database updates.
1206  // Make sure the installation API is available
1207  require_once DRUSH_DRUPAL_CORE . '/includes/install.inc';
1208 
1209  // Load all .install files.
1210  drupal_load_updates();
1211 
1212  // @see system_requirements().
1213  foreach (drush_module_list() as $module) {
1214  $updates = drupal_get_schema_versions($module);
1215  if ($updates !== FALSE) {
1216  $default = drupal_get_installed_schema_version($module);
1217  if (max($updates) > $default) {
1218  drush_log(dt("You have pending database updates. Run `drush updatedb` or visit update.php in your browser."), 'warning');
1219  break;
1220  }
1221  }
1222  }
1223 }
1224 
1225 /**
1226  * Sanitize user provided arguments to several pm commands.
1227  *
1228  * Return an array of arguments off a space and/or comma separated values.
1229  */
1230 function pm_parse_arguments($args, $dashes_to_underscores = TRUE) {
1231  $arguments = _convert_csv_to_array($args);
1232  foreach ($arguments as $key => $argument) {
1233  $argument = ($dashes_to_underscores) ? strtr($argument, '-', '_') : $argument;
1234  }
1235  return $arguments;
1236 }
1237 
1238 /**
1239  * Parse out the project name and version and return as a structured array.
1240  *
1241  * @param $requests an array of project names
1242  */
1243 function pm_parse_project_version($requests) {
1244  $requestdata = array();
1245  $drupal_version_default = drush_drupal_major_version();
1246  if (!$drupal_version_default) {
1247  $drupal_version_default = drush_get_option('default-major', 7);
1248  }
1249  $drupal_version_default .= '.x';
1250  $drupal_bootstrap = drush_get_context('DRUSH_BOOTSTRAP_PHASE') > 0;
1251  foreach($requests as $request) {
1252  $drupal_version = $drupal_version_default;
1253  $project_version = NULL;
1254  $version = NULL;
1255  $project = $request;
1256  // project-HEAD or project-5.x-1.0-beta
1257  // '5.x-' is optional, as is '-beta'
1258  preg_match('/-+(HEAD|(?:(\d+\.x)-+)?(\d+\.[\dx]+.*))$/', $request, $matches);
1259  if (isset($matches[1])) {
1260  // The project is whatever we have prior to the version part of the request.
1261  $project = trim(substr($request, 0, strlen($request) - strlen($matches[0])), ' -');
1262 
1263  if ($matches[1] == 'HEAD' || $matches[2] == 'HEAD') {
1264  drush_log('DRUSH_PM_HEAD', 'Can\'t download HEAD releases because Drupal.org project information only provides for numbered release nodes.', 'warning');
1265  continue;
1266  }
1267  if (!empty($matches[2])) {
1268  // We have a specified Drupal core version.
1269  $drupal_version = trim($matches[2], '-.');
1270  }
1271  if (!empty($matches[3])) {
1272  if (!$drupal_bootstrap && empty($matches[2]) && $project != 'drupal') {
1273  // We are not working on a bootstrapped site, and the project is not Drupal itself,
1274  // so we assume this value is the Drupal core version and we want the stable project.
1275  $drupal_version = trim($matches[3], '-.');
1276  }
1277  else {
1278  // We are working on a bootstrapped site, or the user specified a Drupal version,
1279  // so this value must be a specified project version.
1280  $project_version = trim($matches[3], '-.');
1281  if (substr($project_version, -1, 1) == 'x') {
1282  // If a dev branch was requested, we add a -dev suffix.
1283  $project_version .= '-dev';
1284  }
1285  }
1286  }
1287  }
1288  // special checking for 'drupal-VERSION', == drupal latest stable release
1289  elseif ((substr($request,0,7) == 'drupal-') && (is_numeric(substr($request,7)))) {
1290  $project = 'drupal';
1291  $drupal_version = substr($request,7) . '.x';
1292  $project_version = $version;
1293  }
1294  if ($project_version) {
1295  if ($project == 'drupal') {
1296  // For project Drupal, ensure the major version branch is correct, so
1297  // we can locate the requested or stable release for that branch.
1298  $project_version_array = explode('.', $project_version);
1299  $drupal_version = $project_version_array[0] . '.x';
1300  // We use the project version only, since it is core.
1301  $version = $project_version;
1302  }
1303  else {
1304  // For regular projects the version string includes the Drupal core version.
1305  $version = $drupal_version . '-' . $project_version;
1306  }
1307  }
1308  $requestdata[$project] = array(
1309  'name' => $project,
1310  'version' => $version,
1311  'drupal_version' => $drupal_version,
1312  'project_version' => $project_version,
1313  );
1314  }
1315  return $requestdata;
1316 }
1317 
1318 
1319 /**
1320  * @defgroup engines Engine types
1321  * @{
1322  */
1323 
1324 /**
1325  * Implementation of hook_drush_engine_type_info().
1326  */
1328  return array(
1329  'package_handler' => array(
1330  'option' => 'package-handler',
1331  'description' => 'Determine how to fetch projects from update service.',
1332  'default' => 'wget',
1333  'options' => array(
1334  'cache' => 'Cache release XML and tarballs or git clones. Git clones use git\'s --reference option.',
1335  ),
1336  ),
1337  'release_info' => array(
1338  'add-options-to-command' => TRUE,
1339  ),
1340  'update_info' => array(
1341  'description' => 'Determine how to fetch update info.',
1342  'add-options-to-command' => TRUE,
1343  'options' => array(
1344  'security-only' => 'Only update modules that have security updates available.',
1345  ),
1346  ),
1347  'version_control' => array(
1348  'option' => 'version-control',
1349  'default' => 'backup',
1350  'description' => 'Integrate with version control systems.',
1351  ),
1352  );
1353 }
1354 
1355 /**
1356  * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.
1357  */
1359  return array(
1360  'wget' => array(
1361  'description' => 'Download project packages using wget or curl.',
1362  ),
1363  'git_drupalorg' => array(
1364  'description' => 'Use git.drupal.org to checkout and update projects.',
1365  'options' => array(
1366  '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.',
1367  '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.',
1368  'gitcheckoutparams' => 'Add options to the `git checkout` command.',
1369  'gitcloneparams' => 'Add options to the `git clone` command.',
1370  'gitfetchparams' => 'Add options to the `git fetch` command.',
1371  'gitpullparams' => 'Add options to the `git pull` command.',
1372  'gitinfofile' => 'Inject version info into each .info file.',
1373  ),
1374  'sub-options' => array(
1375  'gitsubmodule' => array(
1376  'gitsubmoduleaddparams' => 'Add options to the `git submodule add` command.',
1377  ),
1378  ),
1379  ),
1380  );
1381 }
1382 
1383 /**
1384  * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.
1385  */
1387  return array(
1388  'updatexml' => array(
1389  'description' => 'Drush release info engine for update.drupal.org and compatible services.',
1390  'options' => array(
1391  'source' => 'The base URL which provides project release history in XML. Defaults to http://updates.drupal.org/release-history.',
1392  'dev' => 'Work with development releases solely.',
1393  ),
1394  'sub-options' => array(
1395  'cache' => array(
1396  'cache-duration-releasexml' => 'Expire duration (in seconds) for release XML. Defaults to 86400 (24 hours).',
1397  ),
1398  'select' => array(
1399  'all' => 'Shows all available releases instead of a short list of recent releases.',
1400  ),
1401  ),
1402  ),
1403  );
1404 }
1405 
1406 /**
1407  * Implements hook_drush_engine_ENGINE_TYPE().
1408  */
1410  return array(
1411  'drupal' => array(
1412  'drupal dependencies' => array('update'),
1413  ),
1414  );
1415 }
1416 
1417 /**
1418  * Integration with VCS in order to easily commit your changes to projects.
1419  */
1421  return array(
1422  'backup' => array(
1423  'description' => 'Backup all project files before updates.',
1424  'options' => array(
1425  'no-backup' => 'Do not perform backups.',
1426  '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.',
1427  ),
1428  ),
1429  'bzr' => array(
1430  'signature' => 'bzr root %s',
1431  'description' => 'Quickly add/remove/commit your project changes to Bazaar.',
1432  'options' => array(
1433  'bzrsync' => 'Automatically add new files to the Bazaar repository and remove deleted files. Caution.',
1434  'bzrcommit' => 'Automatically commit changes to Bazaar repository. You must also use the --bzrsync option.',
1435  ),
1436  'sub-options' => array(
1437  'bzrcommit' => array(
1438  'bzrmessage' => 'Override default commit message which is: Drush automatic commit. Project <name> <type> Command: <the drush command line used>',
1439  ),
1440  ),
1441  'examples' => array(
1442  'drush dl cck --version-control=bzr --bzrsync --bzrcommit' => 'Download the cck project and then add it and commit it to Bazaar.'
1443  ),
1444  ),
1445  'svn' => array(
1446  'signature' => 'svn info %s',
1447  'description' => 'Quickly add/remove/commit your project changes to Subversion.',
1448  'options' => array(
1449  'svnsync' => 'Automatically add new files to the SVN repository and remove deleted files. Caution.',
1450  'svncommit' => 'Automatically commit changes to SVN repository. You must also using the --svnsync option.',
1451  'svnstatusparams' => "Add options to the 'svn status' command",
1452  'svnaddparams' => 'Add options to the `svn add` command',
1453  'svnremoveparams' => 'Add options to the `svn remove` command',
1454  'svnrevertparams' => 'Add options to the `svn revert` command',
1455  'svncommitparams' => 'Add options to the `svn commit` command',
1456  ),
1457  'sub-options' => array(
1458  'svncommit' => array(
1459  'svnmessage' => 'Override default commit message which is: Drush automatic commit: <the drush command line used>',
1460  ),
1461  ),
1462  'examples' => array(
1463  'drush [command] cck --svncommitparams=\"--username joe\"' => 'Commit changes as the user \'joe\' (Quotes are required).'
1464  ),
1465  ),
1466  );
1467 }
1468 
1469 /**
1470  * @} End of "Engine types".
1471  */
1472 
1473 /**
1474  * Interface for version control systems.
1475  * We use a simple object layer because we conceivably need more than one
1476  * loaded at a time.
1477  */
1479  function pre_update(&$project);
1480  function rollback($project);
1481  function post_update($project);
1482  function post_download($project);
1483  static function reserved_files();
1484 }
1485 
1486 /**
1487  * A simple factory function that tests for version control systems, in a user
1488  * specified order, and returns the one that appears to be appropriate for a
1489  * specific directory.
1490  */
1491 function drush_pm_include_version_control($directory = '.') {
1492  $engine_info = drush_get_engines('version_control');
1493  $version_controls = drush_get_option('version-control', FALSE);
1494  // If no version control was given, use a list of defaults.
1495  if (!$version_controls) {
1496  // Backup engine is the last option.
1497  $version_controls = array_reverse(array_keys($engine_info['engines']));
1498  }
1499  else {
1500  $version_controls = array($version_controls);
1501  }
1502 
1503  // Find the first valid engine in the list, checking signatures if needed.
1504  $engine = FALSE;
1505  while (!$engine && count($version_controls)) {
1506  $version_control = array_shift($version_controls);
1507  if (isset($engine_info['engines'][$version_control])) {
1508  if (!empty($engine_info['engines'][$version_control]['signature'])) {
1509  drush_log(dt('Verifying signature for !vcs version control engine.', array('!vcs' => $version_control)), 'debug');
1510  if (drush_shell_exec($engine_info['engines'][$version_control]['signature'], $directory)) {
1511  $engine = $version_control;
1512  }
1513  }
1514  else {
1515  $engine = $version_control;
1516  }
1517  }
1518  }
1519  if (!$engine) {
1520  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)));
1521  }
1522 
1523  $instance = drush_include_engine('version_control', $engine);
1524  return $instance;
1525 }
1526 
1527 /**
1528  * Update the locked status of all of the candidate projects
1529  * to be updated.
1530  *
1531  * @param array &$projects
1532  * The projects array from pm_updatecode. $project['locked'] will
1533  * be set for every file where a persistent lockfile can be found.
1534  * The 'lock' and 'unlock' operations are processed first.
1535  * @param array $projects_to_lock
1536  * A list of projects to create peristent lock files for
1537  * @param array $projects_to_unlock
1538  * A list of projects to clear the persistent lock on
1539  * @param string $lock_message
1540  * The reason the project is being locked; stored in the lockfile.
1541  *
1542  * @return array
1543  * A list of projects that are locked.
1544  */
1545 function drush_pm_update_lock(&$projects, $projects_to_lock, $projects_to_unlock, $lock_message = NULL) {
1546  $locked_result = array();
1547 
1548  // Warn about ambiguous lock / unlock values
1549  if ($projects_to_lock == array('1')) {
1550  $projects_to_lock = array();
1551  drush_log(dt('Ignoring --lock with no value.'), 'warning');
1552  }
1553  if ($projects_to_unlock == array('1')) {
1554  $projects_to_unlock = array();
1555  drush_log(dt('Ignoring --unlock with no value.'), 'warning');
1556  }
1557 
1558  // Log if we are going to lock or unlock anything
1559  if (!empty($projects_to_unlock)) {
1560  drush_log(dt('Unlocking !projects', array('!projects' => implode(',', $projects_to_unlock))), 'ok');
1561  }
1562  if (!empty($projects_to_lock)) {
1563  drush_log(dt('Locking !projects', array('!projects' => implode(',', $projects_to_lock))), 'ok');
1564  }
1565 
1566  $drupal_root = drush_get_context('DRUSH_DRUPAL_ROOT');
1567  foreach ($projects as $name => $project) {
1568  if ($name == 'drupal') {
1569  continue;
1570  }
1571  $message = NULL;
1572  if (isset($project['path'])) {
1573  $lockfile = $drupal_root . '/' . $project['path'] . '/.drush-lock-update';
1574 
1575  // Remove the lock file if the --unlock option was specified
1576  if (((in_array($name, $projects_to_unlock)) || (in_array('all', $projects_to_unlock))) && (file_exists($lockfile))) {
1577  drush_op('unlink', $lockfile);
1578  }
1579 
1580  // Create the lock file if the --lock option was specified
1581  if ((in_array($name, $projects_to_lock)) || (in_array('all', $projects_to_lock))) {
1582  drush_op('file_put_contents', $lockfile, $lock_message != NULL ? $lock_message : "Locked via drush.");
1583  // Note that the project is locked. This will work even if we are simulated,
1584  // or if we get permission denied from the file_put_contents.
1585  // If the lock is -not- simulated or transient, then the lock message will be
1586  // read from the lock file below.
1587  $message = drush_get_context('DRUSH_SIMULATE') ? 'Simulated lock.' : 'Transient lock.';
1588  }
1589 
1590  // If the persistent lock file exists, then mark the project as locked.
1591  if (file_exists($lockfile)) {
1592  $message = trim(file_get_contents($lockfile));
1593  }
1594  }
1595 
1596  // If there is a message set, then mark the project as locked.
1597  if (isset($message)) {
1598  $projects[$name]['locked'] = !empty($message) ? $message : "Locked.";
1599  $locked_result[$name] = $project;
1600  }
1601  }
1602 
1603  return $locked_result;
1604 }
1605 
1606 /**
1607  * Returns the path to the extensions cache file.
1608  */
1610  return drush_get_context('DRUSH_PER_USER_CONFIGURATION') . "/drush-extension-cache.inc";
1611 }
1612 
1613 /**
1614  * Load the extensions cache.
1615  */
1617  $extension_cache = array();
1618  $cache_file = _drush_pm_extension_cache_file();
1619 
1620  if (file_exists($cache_file)) {
1621  include $cache_file;
1622  }
1623  if (!array_key_exists('extension-map', $extension_cache)) {
1624  $extension_cache['extension-map'] = array();
1625  }
1626  return $extension_cache;
1627 }
1628 
1629 /**
1630  * Lookup an extension in the extensions cache.
1631  */
1633  $result = NULL;
1634  $extension_cache = _drush_pm_get_extension_cache();
1635  if (!empty($extension_cache) && array_key_exists($extension, $extension_cache)) {
1636  $result = $extension_cache[$extension];
1637  }
1638  return $result;
1639 }
1640 
1641 /**
1642  * Persists extensions cache.
1643  *
1644  * #TODO# not implemented.
1645  */
1646 function drush_pm_put_extension_cache($extension_cache) {
1647 }
1648 
1649 /**
1650  * Store extensions founds within a project in extensions cache.
1651  */
1652 function drush_pm_cache_project_extensions($project, $found) {
1653  $extension_cache = _drush_pm_get_extension_cache();
1654  foreach($found as $extension) {
1655  // Simple cache does not handle conflicts
1656  // We could keep an array of projects, and count
1657  // how many times each one has been seen...
1658  $extension_cache[$extension] = $project['name'];
1659  }
1660  drush_pm_put_extension_cache($extension_cache);
1661 }
1662 
1663 /**
1664  * Print out all extensions (modules/themes/profiles) found in specified project.
1665  *
1666  * Find .info.yml files in the project path and identify modules, themes and
1667  * profiles. It handles two kind of projects: drupal core/profiles and
1668  * modules/themes.
1669  * It does nothing with theme engine projects.
1670  */
1672  // Mask for drush_scan_directory, to match .info.yml files.
1673  $mask = $project['drupal_version'][0] >= 8 ? '/(.*)\.info\.yml$/' : '/(.*)\.info$/';
1674 
1675  // Mask for drush_scan_directory, to avoid tests directories.
1676  $nomask = array('.', '..', 'CVS', 'tests');
1677 
1678  // Drupal core and profiles can contain modules, themes and profiles.
1679  if (in_array($project['project_type'], array('core', 'profile'))) {
1680  $found = array('profile' => array(), 'theme' => array(), 'module' => array());
1681  // Find all of the .info files
1682  foreach (drush_scan_directory($project['project_install_location'], $mask, $nomask) as $filename => $info) {
1683  // Extract extension name from filename.
1684  $matches = array();
1685  preg_match($mask, $info->basename, $matches);
1686  $name = $matches[1];
1687 
1688  // Find the project type corresponding the .info file.
1689  // (Only drupal >=7.x has .info for .profile)
1690  $base = dirname($filename) . '/' . $name;
1691  if (is_file($base . '.module')) {
1692  $found['module'][] = $name;
1693  }
1694  else if (is_file($base . '.profile')) {
1695  $found['profile'][] = $name;
1696  }
1697  else {
1698  $found['theme'][] = $name;
1699  }
1700  }
1701  // Special case: find profiles for drupal < 7.x (no .info)
1702  if ($project['drupal_version'][0] < 7) {
1703  foreach (drush_find_profiles($project['project_install_location']) as $filename => $info) {
1704  $found['profile'][] = $info->name;
1705  }
1706  }
1707  // Log results.
1708  $msg = "Project !project contains:\n";
1709  $args = array('!project' => $project['name']);
1710  foreach (array_keys($found) as $type) {
1711  if ($count = count($found[$type])) {
1712  $msg .= " - !count_$type !type_$type: !found_$type\n";
1713  $args += array("!count_$type" => $count, "!type_$type" => $type, "!found_$type" => implode(', ', $found[$type]));
1714  if ($count > 1) {
1715  $args["!type_$type"] = $type.'s';
1716  }
1717  }
1718  }
1719  drush_log(dt($msg, $args), 'success');
1720  drush_print_pipe(call_user_func_array('array_merge', array_values($found)));
1721  }
1722  // Modules and themes can only contain other extensions of the same type.
1723  elseif (in_array($project['project_type'], array('module', 'theme'))) {
1724  $found = array();
1725  foreach (drush_scan_directory($project['project_install_location'], $mask, $nomask) as $filename => $info) {
1726  // Extract extension name from filename.
1727  $matches = array();
1728  preg_match($mask, $info->basename, $matches);
1729  $found[] = $matches[1];
1730  }
1731  // If there is only one module / theme in the project, only print out
1732  // the message if is different than the project name.
1733  if (count($found) == 1) {
1734  if ($found[0] != $project['name']) {
1735  $msg = "Project !project contains a !type named !found.";
1736  }
1737  }
1738  // If there are multiple modules or themes in the project, list them all.
1739  else {
1740  $msg = "Project !project contains !count !types: !found.";
1741  }
1742  if (isset($msg)) {
1743  drush_print(dt($msg, array('!project' => $project['name'], '!count' => count($found), '!type' => $project['project_type'], '!found' => implode(', ', $found))));
1744  }
1745  drush_print_pipe($found);
1746  // Cache results.
1747  drush_pm_cache_project_extensions($project, $found);
1748  }
1749 }
1750 
1751 /**
1752  * Return an array of empty directories.
1753  *
1754  * Walk a directory and return an array of subdirectories that are empty. Will
1755  * return the given directory if it's empty.
1756  * If a list of items to exclude is provided, subdirectories will be condidered
1757  * empty even if they include any of the items in the list.
1758  *
1759  * @param string $dir
1760  * Path to the directory to work in.
1761  * @param array $exclude
1762  * Array of files or directory to exclude in the check.
1763  *
1764  * @return array
1765  * A list of directory paths that are empty. A directory is deemed to be empty
1766  * if it only contains excluded files or directories.
1767  */
1768 function drush_find_empty_directories($dir, $exclude = array()) {
1769  // Skip files.
1770  if (!is_dir($dir)) {
1771  return array();
1772  }
1773  $to_exclude = array_merge(array('.', '..'), $exclude);
1774  $empty_dirs = array();
1775  $dir_is_empty = TRUE;
1776  foreach (scandir($dir) as $file) {
1777  // Skip excluded directories.
1778  if (in_array($file, $to_exclude)) {
1779  continue;
1780  }
1781  // Recurse into sub-directories to find potentially empty ones.
1782  $subdir = $dir . '/' . $file;
1783  $empty_dirs += drush_find_empty_directories($subdir, $exclude);
1784  // $empty_dir will not contain $subdir, if it is a file or if the
1785  // sub-directory is not empty. $subdir is only set if it is empty.
1786  if (!isset($empty_dirs[$subdir])) {
1787  $dir_is_empty = FALSE;
1788  }
1789  }
1790 
1791  if ($dir_is_empty) {
1792  $empty_dirs[$dir] = $dir;
1793  }
1794  return $empty_dirs;
1795 }
1796 
1797 /**
1798  * Inject metadata into all .info files for a given project.
1799  *
1800  * @param string $project_dir
1801  * The full path to the root directory of the project to operate on.
1802  * @param string $project_name
1803  * The project machine name (AKA shortname).
1804  * @param string $version
1805  * The version string to inject into the .info file(s).
1806  *
1807  * @return boolean
1808  * TRUE on success, FALSE on any failures appending data to .info files.
1809  */
1810 function drush_pm_inject_info_file_metadata($project_dir, $project_name, $version) {
1811  $info_files = drush_scan_directory($project_dir, '/.*\.info$/');
1812  if (!empty($info_files)) {
1813  // Construct the string of metadata to append to all the .info files.
1815  $info = "\n\n; Information added by drush on " . date('Y-m-d') . "\n";
1816  $info .= "version = \"$version\"\n";
1817  // .info files started with 5.x, so we don't have to worry about version
1818  // strings like "4.7.x-1.0" in this regular expression. If we can't parse
1819  // the version (also from an old "HEAD" release), or the version isn't at
1820  // least 6.x, don't add any "core" attribute at all.
1821  $matches = array();
1822  if (preg_match('/^((\d+)\.x)-.*/', $version, $matches) && $matches[2] >= 6) {
1823  $info .= "core = \"$matches[1]\"\n";
1824  }
1825  if (!drush_get_option('no-gitprojectinfo', FALSE)) {
1826  $info .= "project = \"$project_name\"\n";
1827  }
1828  $info .= 'datestamp = "'. time() ."\"\n";
1829  $info .= "\n";
1830  foreach ($info_files as $info_file) {
1831  if (!drush_file_append_data($info_file->filename, $info)) {
1832  return FALSE;
1833  }
1834  }
1835  }
1836  return TRUE;
1837 }

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="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>

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

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_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;<span class="comment"></span></div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * Project is a user requested version update.</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"><a class="code" href="pm_8drush_8inc.html#a9ac73e17c3d7842e850fc05bc87d4f46">   18</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_UPDATE&#39;</span>, 101);</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">/**</span></div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * User requested version already installed.</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ad1b19486447794e5a6bc2279da8e8e66">   23</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_CURRENT&#39;</span>, 102);</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * User requested project was not packaged by drupal.org.</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"><a class="code" href="pm_8drush_8inc.html#a0ce5de6ae7acb74b47c156f8cbff8141">   28</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_PROJECT_NOT_PACKAGED&#39;</span>, 103);</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">/**</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> * User requested version not found.</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1c80f8c65d6edd19b1d3b2adb6d7a7e9">   33</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_VERSION_NOT_FOUND&#39;</span>, 104);</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"> * User requested project not found.</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a3713f9a911ec8382a28380cf63588f6d">   38</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_PROJECT_NOT_FOUND&#39;</span>, 105);</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="comment"></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">   41</span>&#160;<span class="comment"> * User requested project not updateable.</span></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"><a class="code" href="pm_8drush_8inc.html#a0003331611d00ba1bdd444189cf5cac5">   43</a></span>&#160;define(<span class="stringliteral">&#39;DRUSH_PM_REQUESTED_PROJECT_NOT_UPDATEABLE&#39;</span>, 106);</div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</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">/**</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="comment"> * Implementation of hook_drush_help().</span></div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1c1a16dd9ec4745047ca003805ee10f6">   49</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="l00050"></a><span class="lineno">   50</span>&#160;  <span class="keywordflow">switch</span> ($section) {</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:pm:title&#39;</span>:</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</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="l00053"></a><span class="lineno">   53</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:pm:summary&#39;</span>:</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</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="l00055"></a><span class="lineno">   55</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-enable&#39;</span>:</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</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="l00057"></a><span class="lineno">   57</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-disable&#39;</span>:</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</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="l00059"></a><span class="lineno">   59</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-updatecode&#39;</span>:</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-update&#39;</span>:</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</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="l00062"></a><span class="lineno">   62</span>&#160;      <span class="keywordflow">if</span> ($section == <span class="stringliteral">&#39;drush:pm-update&#39;</span>) {</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</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="l00064"></a><span class="lineno">   64</span>&#160;      }</div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</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="l00066"></a><span class="lineno">   66</span>&#160;      <span class="keywordflow">return</span> $message;</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-updatecode-postupdate&#39;</span>:</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</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="l00069"></a><span class="lineno">   69</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:pm-download&#39;</span>:</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</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="l00071"></a><span class="lineno">   71</span>&#160;<span class="stringliteral"></span></div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="stringliteral">If no --destination is provided, then destination depends on the project type:</span></div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="stringliteral">  - Profiles will be downloaded to profiles/ in your Drupal root.</span></div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</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="l00075"></a><span class="lineno">   75</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="l00076"></a><span class="lineno">   76</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="l00077"></a><span class="lineno">   77</span>&#160;  }</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;}</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="comment"></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"> * Implementation of hook_drush_command().</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="pm_8drush_8inc.html#a9f267e6ae37b4f67eccab48af016ef2d">   83</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="l00084"></a><span class="lineno">   84</span>&#160;  $update_options = array(</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    <span class="stringliteral">&#39;lock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</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="l00087"></a><span class="lineno">   87</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="l00088"></a><span class="lineno">   88</span>&#160;    ),</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;  );</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;  $update_suboptions = array(</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    <span class="stringliteral">&#39;lock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;      <span class="stringliteral">&#39;lock-message&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</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="l00094"></a><span class="lineno">   94</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;message&#39;</span>,</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;      ),</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;      <span class="stringliteral">&#39;unlock&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</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="l00098"></a><span class="lineno">   98</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="l00099"></a><span class="lineno">   99</span>&#160;      ),</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    ),</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;  );</div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;  $items[<span class="stringliteral">&#39;pm-enable&#39;</span>] = array(</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</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="l00105"></a><span class="lineno">  105</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</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="l00107"></a><span class="lineno">  107</span>&#160;    ),</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</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="l00110"></a><span class="lineno">  110</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="l00111"></a><span class="lineno">  111</span>&#160;    ),</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;en&#39;</span>),</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;  );</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;  $items[<span class="stringliteral">&#39;pm-disable&#39;</span>] = array(</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</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="l00116"></a><span class="lineno">  116</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</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="l00118"></a><span class="lineno">  118</span>&#160;    ),</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;dis&#39;</span>),</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;      ),</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    ),</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;  );</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;  $items[<span class="stringliteral">&#39;pm-info&#39;</span>] = array(</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</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="l00130"></a><span class="lineno">  130</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</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="l00132"></a><span class="lineno">  132</span>&#160;    ),</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pmi&#39;</span>),</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</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="l00136"></a><span class="lineno">  136</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;json&#39;</span>,</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</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="l00138"></a><span class="lineno">  138</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;        <span class="stringliteral">&#39;extension&#39;</span> =&gt; <span class="stringliteral">&#39;Extension&#39;</span>,</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;        <span class="stringliteral">&#39;project&#39;</span> =&gt; <span class="stringliteral">&#39;Project&#39;</span>,</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;        <span class="stringliteral">&#39;type&#39;</span> =&gt; <span class="stringliteral">&#39;Type&#39;</span>,</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        <span class="stringliteral">&#39;title&#39;</span> =&gt; <span class="stringliteral">&#39;Title&#39;</span>,</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Description&#39;</span>,</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;Version&#39;</span>,</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        <span class="stringliteral">&#39;date&#39;</span> =&gt; <span class="stringliteral">&#39;Date&#39;</span>,</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        <span class="stringliteral">&#39;package&#39;</span> =&gt; <span class="stringliteral">&#39;Package&#39;</span>,</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        <span class="stringliteral">&#39;core&#39;</span> =&gt; <span class="stringliteral">&#39;Core&#39;</span>,</div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;        <span class="stringliteral">&#39;php&#39;</span> =&gt; <span class="stringliteral">&#39;PHP&#39;</span>,</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;        <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>,</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;        <span class="stringliteral">&#39;path&#39;</span> =&gt; <span class="stringliteral">&#39;Path&#39;</span>,</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</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="l00152"></a><span class="lineno">  152</span>&#160;        <span class="stringliteral">&#39;files&#39;</span> =&gt; <span class="stringliteral">&#39;Files&#39;</span>,</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;        <span class="stringliteral">&#39;requires&#39;</span> =&gt; <span class="stringliteral">&#39;Requires&#39;</span>,</div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</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="l00155"></a><span class="lineno">  155</span>&#160;        <span class="stringliteral">&#39;permissions&#39;</span> =&gt; <span class="stringliteral">&#39;Permissions&#39;</span>,</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;        <span class="stringliteral">&#39;config&#39;</span> =&gt; <span class="stringliteral">&#39;Configure&#39;</span>,</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;        <span class="stringliteral">&#39;engine&#39;</span> =&gt; <span class="stringliteral">&#39;Engine&#39;</span>,</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</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="l00159"></a><span class="lineno">  159</span>&#160;        <span class="stringliteral">&#39;regions&#39;</span> =&gt; <span class="stringliteral">&#39;Regions&#39;</span>,</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;        <span class="stringliteral">&#39;features&#39;</span> =&gt; <span class="stringliteral">&#39;Features&#39;</span>,</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;        <span class="stringliteral">&#39;stylesheets&#39;</span> =&gt; <span class="stringliteral">&#39;Stylesheets&#39;</span>,</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</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="l00163"></a><span class="lineno">  163</span>&#160;        <span class="stringliteral">&#39;scripts&#39;</span> =&gt; <span class="stringliteral">&#39;Scripts&#39;</span>,</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;      ),</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</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="l00166"></a><span class="lineno">  166</span>&#160;    ),</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;  );</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;  <span class="comment">// Install command is reserved for the download and enable of projects including dependencies.</span></div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;  <span class="comment">// @see http://drupal.org/node/112692 for more information.</span></div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;  <span class="comment">// $items[&#39;install&#39;] = array(</span></div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</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="l00172"></a><span class="lineno">  172</span>&#160;  <span class="comment">//   );</span></div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  $items[<span class="stringliteral">&#39;pm-uninstall&#39;</span>] = array(</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</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="l00175"></a><span class="lineno">  175</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</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="l00177"></a><span class="lineno">  177</span>&#160;    ),</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pmu&#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;  $items[<span class="stringliteral">&#39;pm-list&#39;</span>] = array(</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</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="l00182"></a><span class="lineno">  182</span>&#160;    <span class="stringliteral">&#39;callback arguments&#39;</span> =&gt; array(array(), FALSE),</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;      <span class="stringliteral">&#39;type&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</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="l00186"></a><span class="lineno">  186</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;module&#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;status&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</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="l00190"></a><span class="lineno">  190</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;disabled&#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;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="l00193"></a><span class="lineno">  193</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="l00194"></a><span class="lineno">  194</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="l00195"></a><span class="lineno">  195</span>&#160;    ),</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;list&#39;</span>,</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</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="l00200"></a><span class="lineno">  200</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="l00201"></a><span class="lineno">  201</span>&#160;    ),</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;pml&#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;  $items[<span class="stringliteral">&#39;pm-refresh&#39;</span>] = array(</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</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="l00206"></a><span class="lineno">  206</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;      <span class="stringliteral">&#39;update_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;      ),</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;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rf&#39;</span>),</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-updatestatus&#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 a report of available minor updates to Drupal core and contrib projects.&#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;projects&#39;</span> =&gt; <span class="stringliteral">&#39;Optional. A list of installed projects to show.&#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;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</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="l00220"></a><span class="lineno">  220</span>&#160;    ) + $update_options,</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; $update_suboptions,</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;      <span class="stringliteral">&#39;update_info&#39;</span>,</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    ),</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;list&#39;</span>,</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</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="l00229"></a><span class="lineno">  229</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="l00230"></a><span class="lineno">  230</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="l00231"></a><span class="lineno">  231</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="l00232"></a><span class="lineno">  232</span>&#160;    ),</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;ups&#39;</span>),</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;  );</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;  $items[<span class="stringliteral">&#39;pm-updatecode&#39;</span>] = array(</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</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="l00237"></a><span class="lineno">  237</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</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="l00239"></a><span class="lineno">  239</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="l00240"></a><span class="lineno">  240</span>&#160;    ),</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</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="l00243"></a><span class="lineno">  243</span>&#160;    ),</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</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="l00246"></a><span class="lineno">  246</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="l00247"></a><span class="lineno">  247</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="l00248"></a><span class="lineno">  248</span>&#160;    ) + $update_options,</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; $update_suboptions,</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;upc&#39;</span>),</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</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="l00252"></a><span class="lineno">  252</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; FALSE,</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;      ),</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;      <span class="stringliteral">&#39;update_info&#39;</span>,</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    ),</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;  );</div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;  <span class="comment">// Merge all items from above.</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;  $items[<span class="stringliteral">&#39;pm-update&#39;</span>] = array(</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</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="l00264"></a><span class="lineno">  264</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;up&#39;</span>),</div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</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="l00266"></a><span class="lineno">  266</span>&#160;  );</div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;  $items[<span class="stringliteral">&#39;pm-updatecode-postupdate&#39;</span>] = array(</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</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="l00269"></a><span class="lineno">  269</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;  );</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;  $items[<span class="stringliteral">&#39;pm-releasenotes&#39;</span>] = array(</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</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="l00273"></a><span class="lineno">  273</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</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="l00275"></a><span class="lineno">  275</span>&#160;    ),</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</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="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;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</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="l00281"></a><span class="lineno">  281</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="l00282"></a><span class="lineno">  282</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="l00283"></a><span class="lineno">  283</span>&#160;    ),</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rln&#39;</span>),</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#ac7a4d8816a3a4c6e43a0c625d8ce784e">DRUSH_BOOTSTRAP_MAX</a>,</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span>,</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    ),</div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  );</div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;  $items[<span class="stringliteral">&#39;pm-releases&#39;</span>] = array(</div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</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="l00292"></a><span class="lineno">  292</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</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="l00294"></a><span class="lineno">  294</span>&#160;    ),</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</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="l00297"></a><span class="lineno">  297</span>&#160;    ),</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</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="l00300"></a><span class="lineno">  300</span>&#160;    ),</div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;rl&#39;</span>),</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#ac7a4d8816a3a4c6e43a0c625d8ce784e">DRUSH_BOOTSTRAP_MAX</a>,</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;table&#39;</span>,</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;csv&#39;</span>,</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;      <span class="stringliteral">&#39;field-labels&#39;</span> =&gt; array(<span class="stringliteral">&#39;project&#39;</span> =&gt; <span class="stringliteral">&#39;Project&#39;</span>, <span class="stringliteral">&#39;version&#39;</span> =&gt; <span class="stringliteral">&#39;Release&#39;</span>, <span class="stringliteral">&#39;date&#39;</span> =&gt; <span class="stringliteral">&#39;Date&#39;</span>, <span class="stringliteral">&#39;status&#39;</span> =&gt; <span class="stringliteral">&#39;Status&#39;</span>),</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</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="l00308"></a><span class="lineno">  308</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="l00309"></a><span class="lineno">  309</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="l00310"></a><span class="lineno">  310</span>&#160;    ),</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;      <span class="stringliteral">&#39;release_info&#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;  );</div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;  $items[<span class="stringliteral">&#39;pm-download&#39;</span>] = array(</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</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="l00317"></a><span class="lineno">  317</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</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="l00319"></a><span class="lineno">  319</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="l00320"></a><span class="lineno">  320</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="l00321"></a><span class="lineno">  321</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="l00322"></a><span class="lineno">  322</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="l00323"></a><span class="lineno">  323</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="l00324"></a><span class="lineno">  324</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="l00325"></a><span class="lineno">  325</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="l00326"></a><span class="lineno">  326</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="l00327"></a><span class="lineno">  327</span>&#160;    ),</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</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="l00330"></a><span class="lineno">  330</span>&#160;    ),</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;      <span class="stringliteral">&#39;destination&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</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="l00334"></a><span class="lineno">  334</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;path&#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;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="l00337"></a><span class="lineno">  337</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="l00338"></a><span class="lineno">  338</span>&#160;      <span class="stringliteral">&#39;variant&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</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="l00340"></a><span class="lineno">  340</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;full&#39;</span>,</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;      ),</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</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="l00343"></a><span class="lineno">  343</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="l00344"></a><span class="lineno">  344</span>&#160;      <span class="stringliteral">&#39;default-major&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</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;7&quot;.&#39;</span>,</div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="charliteral">&#39;6&#39;</span>,</div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;      ),</div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</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="l00349"></a><span class="lineno">  349</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="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;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#ac7a4d8816a3a4c6e43a0c625d8ce784e">DRUSH_BOOTSTRAP_MAX</a>,</div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;dl&#39;</span>),</div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    <span class="stringliteral">&#39;engines&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;      <span class="stringliteral">&#39;version_control&#39;</span>,</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;      <span class="stringliteral">&#39;package_handler&#39;</span>,</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;      <span class="stringliteral">&#39;release_info&#39;</span>,</div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;    ),</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="keywordflow">return</span> $items;</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;}</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<span class="comment"> * @defgroup extensions Extensions management.</span></div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="comment"> * @{</span></div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<span class="comment"> * Functions to manage extensions.</span></div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00371"></a><span class="lineno"><a class="code" href="group__extensions.html#gaa73b0927e4816cee72525c0cd11806cf">  371</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="l00372"></a><span class="lineno">  372</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="l00373"></a><span class="lineno">  373</span>&#160;}</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00378"></a><span class="lineno"><a class="code" href="group__extensions.html#gaf6c3c4950e28ca5c42a1acea642dc4dc">  378</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="l00379"></a><span class="lineno">  379</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="l00380"></a><span class="lineno">  380</span>&#160;}</div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00385"></a><span class="lineno"><a class="code" href="group__extensions.html#gab04aadc8b47dfaea519eb7ba8a1f5987">  385</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="l00386"></a><span class="lineno">  386</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="l00387"></a><span class="lineno">  387</span>&#160;}</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00392"></a><span class="lineno"><a class="code" href="group__extensions.html#ga18cd171a0bb29c28004db2ed171d2ad1">  392</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="l00393"></a><span class="lineno">  393</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="l00394"></a><span class="lineno">  394</span>&#160;}</div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00399"></a><span class="lineno"><a class="code" href="group__extensions.html#ga670a170ad2562529d58573ec2ed1ebe4">  399</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="l00400"></a><span class="lineno">  400</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="l00401"></a><span class="lineno">  401</span>&#160;}</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"><a class="code" href="group__extensions.html#ga78c34201d4460b12e4d9147016148a15">  406</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="l00407"></a><span class="lineno">  407</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="l00408"></a><span class="lineno">  408</span>&#160;}</div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"><a class="code" href="group__extensions.html#gaade766269d76ac34bc95d778f52bbc94">  413</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="l00414"></a><span class="lineno">  414</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="l00415"></a><span class="lineno">  415</span>&#160;}</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00420"></a><span class="lineno"><a class="code" href="group__extensions.html#gac730d5229aef78e026d8383eeb0af375">  420</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="l00421"></a><span class="lineno">  421</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="l00422"></a><span class="lineno">  422</span>&#160;}</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;<span class="comment"> * List extensions for completion.</span></div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="comment"> *  Array of available extensions.</span></div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"><a class="code" href="group__extensions.html#ga7a2fb27ecd55a327d27d97a59a62c2d6">  430</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="l00431"></a><span class="lineno">  431</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#adb325e52092d83c685acdee827af1085">drush_bootstrap_max</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a6ea86b0ce6756b159a3fdef78fdff159">DRUSH_BOOTSTRAP_DRUPAL_FULL</a>)) {</div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;    $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>(FALSE);</div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</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="l00434"></a><span class="lineno">  434</span>&#160;  }</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="comment"></span></div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;<span class="comment"> * List projects for completion.</span></div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;<span class="comment"> *  Array of installed projects.</span></div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00443"></a><span class="lineno"><a class="code" href="group__extensions.html#gaea366ba3a9ac9138d35dc9e3523b47ea">  443</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="l00444"></a><span class="lineno">  444</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#adb325e52092d83c685acdee827af1085">drush_bootstrap_max</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a6ea86b0ce6756b159a3fdef78fdff159">DRUSH_BOOTSTRAP_DRUPAL_FULL</a>)) {</div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</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="l00446"></a><span class="lineno">  446</span>&#160;  }</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;}</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="comment"> * Sort callback function for sorting extensions.</span></div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</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="l00453"></a><span class="lineno">  453</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"><a class="code" href="group__extensions.html#ga293092b949a0837e3208f57ddb837c3c">  454</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="l00455"></a><span class="lineno">  455</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="l00456"></a><span class="lineno">  456</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="l00457"></a><span class="lineno">  457</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="l00458"></a><span class="lineno">  458</span>&#160;    <span class="keywordflow">return</span> -1;</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;  }</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</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="l00461"></a><span class="lineno">  461</span>&#160;    <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;  }</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</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="l00464"></a><span class="lineno">  464</span>&#160;  <span class="keywordflow">if</span> ($cmp == 0) {</div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</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="l00466"></a><span class="lineno">  466</span>&#160;  }</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;  <span class="keywordflow">return</span> $cmp;</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;}</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;<span class="comment"> * Calculate an extension status based on current status and schema version.</span></div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;<span class="comment"> * @param $extension</span></div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;<span class="comment"> *   Object of a single extension info.</span></div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;<span class="comment"> *   String describing extension status. Values: enabled|disabled|not installed</span></div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00479"></a><span class="lineno"><a class="code" href="group__extensions.html#gad7c908db0c414731d0933c93c4b083ea">  479</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="l00480"></a><span class="lineno">  480</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="l00481"></a><span class="lineno">  481</span>&#160;    $status = <span class="stringliteral">&quot;not installed&quot;</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;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</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="l00485"></a><span class="lineno">  485</span>&#160;  }</div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;  <span class="keywordflow">return</span> $status;</div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;}</div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;<span class="comment"> * Classify extensions as modules, themes or unknown.</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"> * @param $extensions</span></div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="comment"> *   Array of extension names, by reference.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;<span class="comment"> * @param $modules</span></div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;<span class="comment"> *   Empty array to be filled with modules in the provided extension list.</span></div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;<span class="comment"> * @param $themes</span></div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;<span class="comment"> *   Empty array to be filled with themes in the provided extension list.</span></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"><a class="code" href="group__extensions.html#ga703ad4f08aba6c5246dad9407119cc17">  500</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="l00501"></a><span class="lineno">  501</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="l00502"></a><span class="lineno">  502</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $extension) {</div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keywordflow">if</span> (!isset($extension_info[$extension])) {</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;      <span class="keywordflow">continue</span>;</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;    $type = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension_info[$extension]);</div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;module&#39;</span>) {</div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;      $modules[$extension] = $extension;</div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    }</div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;theme&#39;</span>) {</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;      $themes[$extension] = $extension;</div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    }</div>
<div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;  }</div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;}</div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;<span class="comment"></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">  517</span>&#160;<span class="comment"> * Obtain an array of installed projects off the extensions available.</span></div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</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="l00520"></a><span class="lineno">  520</span>&#160;<span class="comment"> * enabled.</span></div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;<span class="comment"> * If any extension lacks project information and it is found that the</span></div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</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="l00523"></a><span class="lineno">  523</span>&#160;<span class="comment"> * &#39;vcs&#39; attribute will be set on the extension. Example:</span></div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="comment"> *   $extensions[name]-&gt;vcs = &#39;cvs&#39;;</span></div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="comment"> * @param array $extensions</span></div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;<span class="comment"> *   Array of extensions as returned by drush_get_extensions().</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"> * @return</span></div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;<span class="comment"> *   Array of installed projects with info of version, status and provided</span></div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;<span class="comment"> * extensions.</span></div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"><a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">  533</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="l00534"></a><span class="lineno">  534</span>&#160;  <span class="keywordflow">if</span> (!isset($extensions)) {</div>
<div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    $extensions = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;  }</div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;  $projects = array(</div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    <span class="stringliteral">&#39;drupal&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;      <span class="stringliteral">&#39;label&#39;</span> =&gt; <span class="stringliteral">&#39;Drupal&#39;</span>,</div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;      <span class="stringliteral">&#39;version&#39;</span> =&gt; <a class="code" href="includes_2drupal_8inc.html#a203e989fd043d054d774954e2b2dff21">drush_drupal_version</a>(),</div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;      <span class="stringliteral">&#39;type&#39;</span> =&gt; <span class="stringliteral">&#39;core&#39;</span>,</div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;      <span class="stringliteral">&#39;extensions&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;    )</div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;  );</div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $extension) {</div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    <span class="comment">// The project name is not available in this cases:</span></div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    <span class="comment">// 1. the extension is part of drupal core.</span></div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</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="l00549"></a><span class="lineno">  549</span>&#160;    <span class="comment">// is not installed.</span></div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    <span class="comment">// 3. it is not a project hosted in drupal.org.</span></div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;    <span class="keywordflow">if</span> (empty($extension-&gt;info[<span class="stringliteral">&#39;project&#39;</span>])) {</div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</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="includes_2drupal_8inc.html#a203e989fd043d054d774954e2b2dff21">drush_drupal_version</a>())) {</div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;        $project = <span class="stringliteral">&#39;drupal&#39;</span>;</div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;      }</div>
<div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</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="l00557"></a><span class="lineno">  557</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="l00558"></a><span class="lineno">  558</span>&#160;        <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;environment&#39;</span>);</div>
<div class="line"><a name="l00559"></a><span class="lineno">  559</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="l00560"></a><span class="lineno">  560</span>&#160;          $extension-&gt;vcs = <span class="stringliteral">&#39;cvs&#39;</span>;</div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Extension !extension is fetched from cvs. Ignoring.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension_name)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;        }</div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</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="l00564"></a><span class="lineno">  564</span>&#160;          $extension-&gt;vcs = <span class="stringliteral">&#39;git&#39;</span>;</div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Extension !extension is fetched from git. Ignoring.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $extension_name)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;        }</div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;      }</div>
<div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    }</div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;        $project = $extension-&gt;info[<span class="stringliteral">&#39;project&#39;</span>];</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">// Create/update the project in $projects with the project data.</span></div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    <span class="keywordflow">if</span> (!isset($projects[$project])) {</div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;      $projects[$project] = array(</div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;        <span class="comment">// If there&#39;s an extension with matching name, pick its label.</span></div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;        <span class="comment">// Otherwise use just the project name. We avoid $extension-&gt;label</span></div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;        <span class="comment">// for the project label because the extension&#39;s label may have</span></div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;        <span class="comment">// no direct relation with the project name. For example,</span></div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</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="l00581"></a><span class="lineno">  581</span>&#160;        <span class="stringliteral">&#39;label&#39;</span> =&gt; isset($extensions[$project])?$extensions[$project]-&gt;label:$project,</div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</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="l00583"></a><span class="lineno">  583</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="l00584"></a><span class="lineno">  584</span>&#160;        <span class="stringliteral">&#39;status&#39;</span> =&gt; $extension-&gt;status,</div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;        <span class="stringliteral">&#39;extensions&#39;</span> =&gt; array(),</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;      );</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;      <span class="keywordflow">if</span> (isset($extension-&gt;info[<span class="stringliteral">&#39;project status url&#39;</span>])) {</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</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="l00589"></a><span class="lineno">  589</span>&#160;      }</div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    }</div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    elseif ($extension-&gt;status != 0) {</div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;      $projects[$project][<span class="stringliteral">&#39;status&#39;</span>] = $extension-&gt;status;</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;    $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="l00595"></a><span class="lineno">  595</span>&#160;  }</div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;</div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</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="l00598"></a><span class="lineno">  598</span>&#160;  <span class="comment">// with machine name.</span></div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</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="l00600"></a><span class="lineno">  600</span>&#160;  <span class="keywordflow">foreach</span> ($projects as $name =&gt; $project) {</div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="keywordflow">if</span> ($name == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    }</div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// If this project has no human label, see if we can find</span></div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    <span class="comment">// one &quot;main&quot; extension whose label we could use.</span></div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    <span class="keywordflow">if</span> ($project[<span class="stringliteral">&#39;label&#39;</span>] == $name)  {</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;      <span class="comment">// If there is only one extension, construct a label based on</span></div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;      <span class="comment">// the extension name.</span></div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;      <span class="keywordflow">if</span> (count($project[<span class="stringliteral">&#39;extensions&#39;</span>]) == 1) {</div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;        $extension = $extensions[$project[<span class="stringliteral">&#39;extensions&#39;</span>][0]];</div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</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="l00613"></a><span class="lineno">  613</span>&#160;      }</div>
<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;        <span class="comment">// Make a list of all of the extensions in this project</span></div>
<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;        <span class="comment">// that do not depend on any other extension in this</span></div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;        <span class="comment">// project.</span></div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        $candidates = array();</div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        <span class="keywordflow">foreach</span> ($project[<span class="stringliteral">&#39;extensions&#39;</span>] as $e) {</div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;          $has_project_dependency = FALSE;</div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</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="l00622"></a><span class="lineno">  622</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="l00623"></a><span class="lineno">  623</span>&#160;              <span class="keywordflow">if</span> (in_array($dependent, $project[<span class="stringliteral">&#39;extensions&#39;</span>])) {</div>
<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;                $has_project_dependency = TRUE;</div>
<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;              }</div>
<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;            }</div>
<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;          }</div>
<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;          <span class="keywordflow">if</span> ($has_project_dependency === FALSE) {</div>
<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;            $candidates[] = $extensions[$e]-&gt;info[<span class="stringliteral">&#39;name&#39;</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;        }</div>
<div class="line"><a name="l00632"></a><span class="lineno">  632</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="l00633"></a><span class="lineno">  633</span>&#160;        <span class="keywordflow">if</span> (count($candidates) == 1) {</div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</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="l00635"></a><span class="lineno">  635</span>&#160;        }</div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;      }</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;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Obtaining !project project path.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00640"></a><span class="lineno">  640</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="l00641"></a><span class="lineno">  641</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="l00642"></a><span class="lineno">  642</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="l00643"></a><span class="lineno">  643</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="l00644"></a><span class="lineno">  644</span>&#160;    <span class="comment">// the second condition here.</span></div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</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="l00646"></a><span class="lineno">  646</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;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>]))), <span class="stringliteral">&#39;error&#39;</span>);</div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    }</div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;      $projects[$name][<span class="stringliteral">&#39;path&#39;</span>] = $path;</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    }</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;  }</div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;</div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;  <span class="keywordflow">return</span> $projects;</div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;}</div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;<span class="comment"> * 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="l00658"></a><span class="lineno">  658</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;<span class="comment"> * @param $project_type</span></div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</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="l00661"></a><span class="lineno">  661</span>&#160;<span class="comment"> * @param $extensions</span></div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;<span class="comment"> *  Array of extension names.</span></div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"><a class="code" href="group__extensions.html#ga1d2b7b533a453be8eac7d6fd78512ddb">  664</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="l00665"></a><span class="lineno">  665</span>&#160;  <span class="comment">// Select the first path as the candidate to be the common prefix.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;  $extension = array_pop($extensions);</div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  <span class="keywordflow">while</span> (!($path = drupal_get_path($project_type, $extension))) {</div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;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)), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    $extension = array_pop($extensions);</div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  }</div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;</div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</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="l00673"></a><span class="lineno">  673</span>&#160;  <span class="comment">// the common prefix for all of them.</span></div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;  <span class="keywordflow">if</span> (count($extensions) &gt; 0) {</div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="comment">// Iterate over the other projects.</span></div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordflow">while</span>($extension = array_pop($extensions)) {</div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;      $path2 = drupal_get_path($project_type, $extension);</div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;      <span class="keywordflow">if</span> (!$path2) {</div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;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)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;      }</div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;      <span class="comment">// Option 1: same path.</span></div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;      <span class="keywordflow">if</span> ($path == $path2) {</div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;        <span class="keywordflow">continue</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="comment">// Option 2: $path is a prefix of $path2.</span></div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;      <span class="keywordflow">if</span> (strpos($path2, $path) === 0) {</div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;      }</div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;      <span class="comment">// Option 3: $path2 is a prefix of $path.</span></div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;      <span class="keywordflow">if</span> (strpos($path, $path2) === 0) {</div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;        $path = $path2;</div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;        <span class="keywordflow">continue</span>;</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="comment">// Option 4: no one is a prefix of the other. Find the common</span></div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;      <span class="comment">// prefix by iteratively strip the rigthtmost piece of $path.</span></div>
<div class="line"><a name="l00697"></a><span class="lineno">  697</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="l00698"></a><span class="lineno">  698</span>&#160;      <span class="comment">// other hand is a condition theorically impossible to reach.</span></div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;      <span class="keywordflow">do</span> {</div>
<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;        $path = dirname($path);</div>
<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;        <span class="keywordflow">if</span> (strpos($path2, $path) === 0) {</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;          <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;        }</div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;      } <span class="keywordflow">while</span> ($path != <span class="charliteral">&#39;.&#39;</span>);</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    }</div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;  }</div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;</div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;  <span class="keywordflow">return</span> $path;</div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;}</div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;<span class="comment"> * @} End of &quot;defgroup extensions&quot;.</span></div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;<span class="comment"> * Command callback. Show a list of extensions with type and status.</span></div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00718"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a61ebecaa80b51380169ddd81f751f0df">  718</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="l00719"></a><span class="lineno">  719</span>&#160;  <span class="comment">//--package</span></div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;  $package_filter = array();</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</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="l00722"></a><span class="lineno">  722</span>&#160;  <span class="keywordflow">if</span> (!empty($package)) {</div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;    $package_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $package);</div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;  }</div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;  <span class="keywordflow">if</span> (!empty($package_filter) &amp;&amp; (count($package_filter) == 1)) {</div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</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="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;  <span class="comment">//--type</span></div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</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="l00731"></a><span class="lineno">  731</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="l00732"></a><span class="lineno">  732</span>&#160;  <span class="keywordflow">if</span> (!empty($type_filter)) {</div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    $type_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $type_filter);</div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  }</div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    $type_filter = $all_types;</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;  }</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;  <span class="keywordflow">if</span> (count($type_filter) == 1) {</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</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="l00741"></a><span class="lineno">  741</span>&#160;  }</div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;  <span class="keywordflow">foreach</span> ($type_filter as $type) {</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</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="l00744"></a><span class="lineno">  744</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="l00745"></a><span class="lineno">  745</span>&#160;    }</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;  }</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;  <span class="comment">//--status</span></div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</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="l00750"></a><span class="lineno">  750</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="l00751"></a><span class="lineno">  751</span>&#160;  <span class="keywordflow">if</span> (!empty($status_filter)) {</div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    $status_filter = explode(<span class="charliteral">&#39;,&#39;</span>, $status_filter);</div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;  }</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    $status_filter = $all_status;</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;  }</div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;  <span class="keywordflow">if</span> (count($status_filter) == 1) {</div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</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="l00759"></a><span class="lineno">  759</span>&#160;  }</div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;</div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;  <span class="keywordflow">foreach</span> ($status_filter as $status) {</div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</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="l00763"></a><span class="lineno">  763</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;!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="l00764"></a><span class="lineno">  764</span>&#160;  }</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;  $result = array();</div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;  $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>(FALSE);</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;  uasort($extension_info, <span class="stringliteral">&#39;_drush_pm_sort_extensions&#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;  $major_version = <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;  <span class="keywordflow">foreach</span> ($extension_info as $key =&gt; $extension) {</div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</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="l00774"></a><span class="lineno">  774</span>&#160;      unset($extension_info[$key]);</div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    }</div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    $status = <a class="code" href="group__extensions.html#gad7c908db0c414731d0933c93c4b083ea">drush_get_extension_status</a>($extension);</div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    <span class="keywordflow">if</span> (!in_array($status, $status_filter)) {</div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;      unset($extension_info[$key]);</div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    }</div>
<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;</div>
<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    <span class="comment">// filter out core if --no-core specified</span></div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</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="l00785"></a><span class="lineno">  785</span>&#160;      <span class="keywordflow">if</span> (($extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>] == <span class="stringliteral">&#39;Core&#39;</span>) || ((array_key_exists(<span class="stringliteral">&#39;project&#39;</span>, $extension-&gt;info)) &amp;&amp; ($extension-&gt;info[<span class="stringliteral">&#39;project&#39;</span>] == <span class="stringliteral">&#39;drupal&#39;</span>))) {</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;      }</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;</div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    <span class="comment">// filter out non-core if --core specified</span></div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</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="l00793"></a><span class="lineno">  793</span>&#160;      <span class="keywordflow">if</span> (($extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>] != <span class="stringliteral">&#39;Core&#39;</span>) &amp;&amp; ((!array_key_exists(<span class="stringliteral">&#39;project&#39;</span>, $extension-&gt;info)) || ($extension-&gt;info[<span class="stringliteral">&#39;project&#39;</span>] != <span class="stringliteral">&#39;drupal&#39;</span>))) {</div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;      }</div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    }</div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;</div>
<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    <span class="comment">// filter by package</span></div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;    <span class="keywordflow">if</span> (!empty($package_filter)) {</div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</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="l00802"></a><span class="lineno">  802</span>&#160;        unset($extension_info[$key]);</div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;      }</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;    $row[<span class="stringliteral">&#39;package&#39;</span>] = $extension-&gt;info[<span class="stringliteral">&#39;package&#39;</span>];</div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    $row[<span class="stringliteral">&#39;name&#39;</span>] = $extension-&gt;label;</div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</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="l00810"></a><span class="lineno">  810</span>&#160;    $row[<span class="stringliteral">&#39;status&#39;</span>] = ucfirst($status);</div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;    <span class="comment">// Suppress notice when version is not present.</span></div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</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="l00813"></a><span class="lineno">  813</span>&#160;</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    $result[$key] = $row;</div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    unset($row);</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">// In Drush-5, we used to return $extension_info here.</span></div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;  <span class="keywordflow">return</span> $result;</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;}</div>
<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;<span class="comment"> * Helper function for pm-enable.</span></div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a9ac55f981042516472e063eef9d51b0c">  824</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a9ac55f981042516472e063eef9d51b0c">drush_pm_find_project_from_extension</a>($extension) {</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</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="l00826"></a><span class="lineno">  826</span>&#160;</div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;  <span class="keywordflow">if</span> (!isset($result)) {</div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;    <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;release_info&#39;</span>, <span class="stringliteral">&#39;updatexml&#39;</span>);</div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</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="l00830"></a><span class="lineno">  830</span>&#160;    <span class="comment">// as the requested extension, then we&#39;ll call that a match.</span></div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    $request = <a class="code" href="pm_8drush_8inc.html#a66b0def0d14711d5c10884363c8ae1b5">pm_parse_project_version</a>(array($extension));</div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="updatexml_8inc.html#a1273e7da7133ada1987f4dde8859aad1">release_info_check_project</a>($request[$extension])) {</div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;      $result = $extension;</div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    }</div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;  }</div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;</div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;  <span class="keywordflow">return</span> $result;</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="comment"></span></div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</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="l00842"></a><span class="lineno">  842</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00843"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#af9a0b321cd245d1e1f3424ae5c9acde9">  843</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="l00844"></a><span class="lineno">  844</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="l00845"></a><span class="lineno">  845</span>&#160;</div>
<div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;  $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;</div>
<div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;  $recheck = TRUE;</div>
<div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;  <span class="keywordflow">while</span> ($recheck) {</div>
<div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    $recheck = FALSE;</div>
<div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;</div>
<div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    <span class="comment">// Classify $args in themes, modules or unknown.</span></div>
<div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    $modules = array();</div>
<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    $themes = array();</div>
<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    $download = array();</div>
<div class="line"><a name="l00856"></a><span class="lineno">  856</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="l00857"></a><span class="lineno">  857</span>&#160;    $extensions = array_merge($modules, $themes);</div>
<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    $unknown = array_diff($args, $extensions);</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="comment">// If there&#39;re unknown extensions, try and download projects</span></div>
<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    <span class="comment">// with matching names.</span></div>
<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    <span class="keywordflow">if</span> (!empty($unknown)) {</div>
<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;      $found = array();</div>
<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;      <span class="keywordflow">foreach</span> ($unknown as $key =&gt; $name) {</div>
<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension was not found.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;        $project = <a class="code" href="pm_8drush_8inc.html#a9ac55f981042516472e063eef9d51b0c">drush_pm_find_project_from_extension</a>($name);</div>
<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;        <span class="keywordflow">if</span> (!empty($project)) {</div>
<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;          $found[] = $project;</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;      }</div>
<div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;      <span class="keywordflow">if</span> (!empty($found)) {</div>
<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;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))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00873"></a><span class="lineno">  873</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="l00874"></a><span class="lineno">  874</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;They are being downloaded.&quot;</span>), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;        }</div>
<div class="line"><a name="l00876"></a><span class="lineno">  876</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="l00877"></a><span class="lineno">  877</span>&#160;          $download = $found;</div>
<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;        }</div>
<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;      }</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;    <span class="comment">// Discard already enabled and incompatible extensions.</span></div>
<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    <span class="keywordflow">foreach</span> ($extensions as $name) {</div>
<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;      <span class="keywordflow">if</span> ($extension_info[$name]-&gt;status) {</div>
<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension is already enabled.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;      }</div>
<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;      <span class="comment">// Check if the extension is compatible with Drupal core and php version.</span></div>
<div class="line"><a name="l00888"></a><span class="lineno">  888</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="l00889"></a><span class="lineno">  889</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="l00890"></a><span class="lineno">  890</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="l00891"></a><span class="lineno">  891</span>&#160;          unset($modules[$name]);</div>
<div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        }</div>
<div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;          unset($themes[$name]);</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;      }</div>
<div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    }</div>
<div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;</div>
<div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;    <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;      <span class="comment">// Check module dependencies.</span></div>
<div class="line"><a name="l00901"></a><span class="lineno">  901</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="l00902"></a><span class="lineno">  902</span>&#160;      $unmet_dependencies = array();</div>
<div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;      <span class="keywordflow">foreach</span> ($dependencies as $module =&gt; $info) {</div>
<div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;        <span class="keywordflow">if</span> (!empty($info[<span class="stringliteral">&#39;unmet-dependencies&#39;</span>])) {</div>
<div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;          <span class="keywordflow">foreach</span> ($info[<span class="stringliteral">&#39;unmet-dependencies&#39;</span>] as $unmet_module) {</div>
<div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;            $unmet_project = <a class="code" href="pm_8drush_8inc.html#a9ac55f981042516472e063eef9d51b0c">drush_pm_find_project_from_extension</a>($unmet_module);</div>
<div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;            <span class="keywordflow">if</span> (!empty($unmet_project)) {</div>
<div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;              $unmet_dependencies[$module][$unmet_project] = $unmet_project;</div>
<div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;            }</div>
<div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;          }</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;      }</div>
<div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;      <span class="keywordflow">if</span> (!empty($unmet_dependencies)) {</div>
<div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;        $msgs = array();</div>
<div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;        $unmet_project_list = array();</div>
<div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;        <span class="keywordflow">foreach</span> ($unmet_dependencies as $module =&gt; $unmet_projects) {</div>
<div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;          $unmet_project_list = array_merge($unmet_project_list, $unmet_projects);</div>
<div class="line"><a name="l00918"></a><span class="lineno">  918</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="l00919"></a><span class="lineno">  919</span>&#160;        }</div>
<div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;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))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00921"></a><span class="lineno">  921</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="l00922"></a><span class="lineno">  922</span>&#160;          <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;They are being downloaded.&quot;</span>), <span class="stringliteral">&#39;ok&#39;</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;        <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="l00925"></a><span class="lineno">  925</span>&#160;          $download = array_merge($download, $unmet_project_list);</div>
<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        }</div>
<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;      }</div>
<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;    }</div>
<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;</div>
<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    <span class="keywordflow">if</span> (!empty($download)) {</div>
<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;      <span class="comment">// Disable DRUSH_AFFIRMATIVE context temporarily.</span></div>
<div class="line"><a name="l00932"></a><span class="lineno">  932</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="l00933"></a><span class="lineno">  933</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="l00934"></a><span class="lineno">  934</span>&#160;      <span class="comment">// Invoke a new process to download dependencies.</span></div>
<div class="line"><a name="l00935"></a><span class="lineno">  935</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="l00936"></a><span class="lineno">  936</span>&#160;      <span class="comment">// Restore DRUSH_AFFIRMATIVE context.</span></div>
<div class="line"><a name="l00937"></a><span class="lineno">  937</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="l00938"></a><span class="lineno">  938</span>&#160;      <span class="comment">// Refresh module cache after downloading the new modules.</span></div>
<div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;      $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;      $recheck = TRUE;</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;  }</div>
<div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;</div>
<div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;  <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;    $all_dependencies = array();</div>
<div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;    $dependencies_ok = TRUE;</div>
<div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    <span class="keywordflow">foreach</span> ($dependencies as $key =&gt; $info) {</div>
<div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;      <span class="keywordflow">if</span> (isset($info[<span class="stringliteral">&#39;error&#39;</span>])) {</div>
<div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;        unset($modules[$key]);</div>
<div class="line"><a name="l00950"></a><span class="lineno">  950</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="l00951"></a><span class="lineno">  951</span>&#160;      }</div>
<div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;      elseif (!empty($info[<span class="stringliteral">&#39;dependencies&#39;</span>])) {</div>
<div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;        <span class="comment">// Make sure we have an assoc array.</span></div>
<div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;        $assoc = array_combine($info[<span class="stringliteral">&#39;dependencies&#39;</span>], $info[<span class="stringliteral">&#39;dependencies&#39;</span>]);</div>
<div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        $all_dependencies = array_merge($all_dependencies, $assoc);</div>
<div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;      }</div>
<div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;    }</div>
<div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;    <span class="keywordflow">if</span> (!$dependencies_ok) {</div>
<div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    }</div>
<div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    $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="l00962"></a><span class="lineno">  962</span>&#160;    <span class="comment">// Discard modules which doesn&#39;t meet requirements.</span></div>
<div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    require_once DRUSH_DRUPAL_CORE . <span class="stringliteral">&#39;/includes/install.inc&#39;</span>;</div>
<div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    <span class="keywordflow">foreach</span> ($modules as $key =&gt; $module) {</div>
<div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;      <span class="comment">// Check to see if the module can be installed/enabled (hook_requirements).</span></div>
<div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;      <span class="comment">// See @system_modules_submit</span></div>
<div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;      <span class="keywordflow">if</span> (!drupal_check_module($module)) {</div>
<div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        unset($modules[$key]);</div>
<div class="line"><a name="l00969"></a><span class="lineno">  969</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="l00970"></a><span class="lineno">  970</span>&#160;        <a class="code" href="group__logging.html#ga15230dd6f6b5765f6c1447d4c2b73940">_drush_log_drupal_messages</a>();</div>
<div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;        <span class="keywordflow">return</span> FALSE;</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;    }</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;</div>
<div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;  $searchpath = array();</div>
<div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;  <span class="keywordflow">foreach</span> (array_merge($modules, $themes) as $name) {</div>
<div class="line"><a name="l00978"></a><span class="lineno">  978</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="l00979"></a><span class="lineno">  979</span>&#160;  }</div>
<div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;  <span class="comment">// Add all modules that passed validation to the drush</span></div>
<div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;  <span class="comment">// list of commandfiles (if they have any).  This</span></div>
<div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;  <span class="comment">// will allow these newly-enabled modules to participate</span></div>
<div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;  <span class="comment">// in the pre-pm_enable and post-pm_enable hooks.</span></div>
<div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;  <span class="keywordflow">if</span> (!empty($searchpath)) {</div>
<div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;    _drush_add_commandfiles($searchpath);</div>
<div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;  }</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;  <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="l00989"></a><span class="lineno">  989</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="l00990"></a><span class="lineno">  990</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="l00991"></a><span class="lineno">  991</span>&#160;</div>
<div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;}</div>
<div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;<span class="comment"> * Command callback. Enable one or more extensions from downloaded projects.</span></div>
<div class="line"><a name="l00997"></a><span class="lineno">  997</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="l00998"></a><span class="lineno">  998</span>&#160;<span class="comment"> * pm-enable validate hook, above.</span></div>
<div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01000"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#aa99b7d46939c1f550211d2c09a72b977"> 1000</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="l01001"></a><span class="lineno"> 1001</span>&#160;  <span class="comment">// Get the data built during the validate phase</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</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="l01003"></a><span class="lineno"> 1003</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="l01004"></a><span class="lineno"> 1004</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="l01005"></a><span class="lineno"> 1005</span>&#160;</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;  <span class="comment">// Inform the user which extensions will finally be enabled.</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;  $extensions = array_merge($modules, $themes);</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;  <span class="keywordflow">if</span> (empty($extensions)) {</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;There were no extensions that could be enabled.&#39;</span>), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;  }</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</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="l01013"></a><span class="lineno"> 1013</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="l01014"></a><span class="lineno"> 1014</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="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">// Enable themes.</span></div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;  <span class="keywordflow">if</span> (!empty($themes)) {</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;    <a class="code" href="commands_2core_2drupal_2environment_8inc.html#a1f1259b67a26416f3ec17b29dea1a1d9">drush_theme_enable</a>($themes);</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;  }</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;  <span class="comment">// Enable modules and pass dependency validation in form submit.</span></div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;  <span class="keywordflow">if</span> (!empty($modules)) {</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;    <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;environment&#39;</span>);</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;    <a class="code" href="commands_2core_2drupal_2environment_8inc.html#abfb699de57ec6ec22c83a4b0ab92ac4c">drush_module_enable</a>($modules);</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;  }</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="comment">// Inform the user of final status.</span></div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</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="l01031"></a><span class="lineno"> 1031</span>&#160;  $problem_extensions = array();</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;  $role = drush_role_get_class();</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;  <span class="keywordflow">foreach</span> ($result_extensions as $name =&gt; $extension) {</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    <span class="keywordflow">if</span> ($extension-&gt;status) {</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;!extension was enabled successfully.&#39;</span>, array(<span class="stringliteral">&#39;!extension&#39;</span> =&gt; $name)), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;      $perms = $role-&gt;getModulePerms($name);</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;      <span class="keywordflow">if</span> (!empty($perms)) {</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</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="l01039"></a><span class="lineno"> 1039</span>&#160;      }</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;    }</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;      $problem_extensions[] = $name;</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    }</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;  }</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;  <span class="keywordflow">if</span> (!empty($problem_extensions)) {</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</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="l01047"></a><span class="lineno"> 1047</span>&#160;  }</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;  <span class="comment">// Return the list of extensions enabled</span></div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;  <span class="keywordflow">return</span> $extensions;</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;}</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;<span class="comment"> * Command callback. Disable one or more extensions.</span></div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01055"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a836eda9c253a0e7edd01c683fe2d6d00"> 1055</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="l01056"></a><span class="lineno"> 1056</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="l01057"></a><span class="lineno"> 1057</span>&#160;  <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;pm&#39;</span>, <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>());</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;  _drush_pm_disable($args);</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="comment"></span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;<span class="comment"> * Add extensions that match extension_name*.</span></div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</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="l01065"></a><span class="lineno"> 1065</span>&#160;<span class="comment"> * names. It will identify extensions that have been passed in with a</span></div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;<span class="comment"> * trailing * and add all matching extensions to the array that is returned.</span></div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;<span class="comment"> * @param $extensions</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;<span class="comment"> *   An array of extensions, by reference.</span></div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;<span class="comment"> * @param $extension_info</span></div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;<span class="comment"> *   Optional. An array of extension info as returned by drush_get_extensions().</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01073"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a5f41049d5b474b8d5bbbe9f161ac1c90"> 1073</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="l01074"></a><span class="lineno"> 1074</span>&#160;  <span class="keywordflow">if</span> (empty($extension_info)) {</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;    $extension_info = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;  }</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $key =&gt; $extension) {</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    <span class="keywordflow">if</span> (($wildcard = rtrim($extension, <span class="charliteral">&#39;*&#39;</span>)) !== $extension) {</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;      <span class="keywordflow">foreach</span> (array_keys($extension_info) as $extension_name) {</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        <span class="keywordflow">if</span> (substr($extension_name, 0, strlen($wildcard)) == $wildcard) {</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;          $extensions[] = $extension_name;</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;      unset($extensions[$key]);</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    }</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;  }</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;}</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="comment"> * Command callback. Uninstall one or more modules.</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a89e844acc44eb017c1a12840164316af"> 1093</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="l01094"></a><span class="lineno"> 1094</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="l01095"></a><span class="lineno"> 1095</span>&#160;  <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;pm&#39;</span>, <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>());</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;  _drush_pm_uninstall($args);</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;<span class="comment"></span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;<span class="comment"> * Command callback. Show available releases for given project(s).</span></div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a6a5267ade011bc9e74e880668cff14af"> 1102</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="l01103"></a><span class="lineno"> 1103</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="l01104"></a><span class="lineno"> 1104</span>&#160;    $requests = array(<span class="stringliteral">&#39;drupal&#39;</span>);</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;  }</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;  <span class="comment">// Parse out project name and version.</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;  $requests = <a class="code" href="pm_8drush_8inc.html#a66b0def0d14711d5c10884363c8ae1b5">pm_parse_project_version</a>($requests);</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;  $info = <a class="code" href="updatexml_8inc.html#a40d4c136aadd10580d665514073a3c0b">release_info_get_releases</a>($requests);</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;  <a class="code" href="backend_8inc.html#ad8040331b08464a2a48b7ac8a00ed13c">drush_backend_set_result</a>($info);</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;  <span class="keywordflow">if</span> (!$info) {</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;No valid projects given.&#39;</span>), <span class="stringliteral">&#39;ok&#39;</span>);</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;  $all = <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="l01117"></a><span class="lineno"> 1117</span>&#160;  $dev = <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="l01118"></a><span class="lineno"> 1118</span>&#160;  <span class="keywordflow">foreach</span> ($info as $name =&gt; $project) {</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    $releases = <a class="code" href="updatexml_8inc.html#a6850a54b3ea4ca22b4e64b14851712bc">release_info_filter_releases</a>($project[<span class="stringliteral">&#39;releases&#39;</span>], $all, $dev);</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;    <span class="keywordflow">foreach</span> ($releases as $key =&gt; $release) {</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;      $rows[$key] = array(</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;        <span class="stringliteral">&#39;project&#39;</span> =&gt; $name,</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;        <span class="stringliteral">&#39;version&#39;</span> =&gt; $release[<span class="stringliteral">&#39;version&#39;</span>],</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</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="l01125"></a><span class="lineno"> 1125</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="l01126"></a><span class="lineno"> 1126</span>&#160;      );</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;  <span class="keywordflow">return</span> $rows;</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;}</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;<span class="comment"> * Command callback. Show release notes for given project(s).</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01135"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1bce10f51c87e2afae2e5e604c7a035f"> 1135</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="l01136"></a><span class="lineno"> 1136</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="l01137"></a><span class="lineno"> 1137</span>&#160;    $requests = array(<span class="stringliteral">&#39;drupal&#39;</span>);</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;  }</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;  $requests = <a class="code" href="pm_8drush_8inc.html#a66b0def0d14711d5c10884363c8ae1b5">pm_parse_project_version</a>($requests);</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a4c90192cc502c7c05a5b4554c7d50258">release_info_print_releasenotes</a>($requests);</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;}</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;<span class="comment"> * Command callback. Refresh update status information.</span></div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a3f9e999bef78b26d76d910ea8a4b1983"> 1147</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="l01148"></a><span class="lineno"> 1148</span>&#160;  <a class="code" href="commands_2pm_2update__info_2drupal_8inc.html#ac0ebe2ccf9fef03ac2038f783321b8d5">_pm_refresh</a>();</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;}</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;<span class="comment"> * Command callback. Execute pm-update.</span></div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01154"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a53ddf8818f1813dcb0a833a64c75d318"> 1154</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="l01155"></a><span class="lineno"> 1155</span>&#160;  <span class="comment">// Call pm-updatecode.  updatedb will be called in the post-update process.</span></div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</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="l01157"></a><span class="lineno"> 1157</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="l01158"></a><span class="lineno"> 1158</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="l01159"></a><span class="lineno"> 1159</span>&#160;}</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;<span class="comment"> * Post-command callback.</span></div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;<span class="comment"> * Execute updatedb command after an updatecode - user requested `update`.</span></div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01165"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a8e8de4df92563916a09695cd77887a3e"> 1165</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="l01166"></a><span class="lineno"> 1166</span>&#160;  <span class="comment">// Use drush_invoke_process to start a subprocess. Cleaner that way.</span></div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</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="l01168"></a><span class="lineno"> 1168</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="l01169"></a><span class="lineno"> 1169</span>&#160;  }</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;}</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;<span class="comment"> * Validate callback for updatecode command. Abort if &#39;backup&#39; directory exists.</span></div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01175"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#afb1934ef6eacb18b4c7d73332230bd52"> 1175</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="l01176"></a><span class="lineno"> 1176</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="l01177"></a><span class="lineno"> 1177</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="l01178"></a><span class="lineno"> 1178</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="l01179"></a><span class="lineno"> 1179</span>&#160;  }</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;<span class="comment"></span></div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;<span class="comment"> * Post-command callback for updatecode.</span></div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;<span class="comment"> * Execute pm-updatecode-postupdate in a backend process to not conflict with</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;<span class="comment"> * old code already in memory.</span></div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a05bb1cb687b1caa097ad691a4c9a3fc1"> 1188</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="l01189"></a><span class="lineno"> 1189</span>&#160;  <span class="comment">// Skip if updatecode was invoked by pm-update.</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;  <span class="comment">// This way we avoid being noisy, as updatedb is to be executed.</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</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="l01192"></a><span class="lineno"> 1192</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="l01193"></a><span class="lineno"> 1193</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="l01194"></a><span class="lineno"> 1194</span>&#160;    }</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;  }</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;}</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;<span class="comment"> * Command callback. Execute updatecode-postupdate.</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a46375206f98fbf1f6d5e5dc131d4d967"> 1201</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="l01202"></a><span class="lineno"> 1202</span>&#160;  <span class="comment">// Clear the cache, since some projects could have moved around.</span></div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;  drush_drupal_cache_clear_all();</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;  <span class="comment">// Notify of pending database updates.</span></div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;  <span class="comment">// Make sure the installation API is available</span></div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;  require_once DRUSH_DRUPAL_CORE . <span class="stringliteral">&#39;/includes/install.inc&#39;</span>;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;  <span class="comment">// Load all .install files.</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;  drupal_load_updates();</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;  <span class="comment">// @see system_requirements().</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</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="l01214"></a><span class="lineno"> 1214</span>&#160;    $updates = drupal_get_schema_versions($module);</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;    <span class="keywordflow">if</span> ($updates !== FALSE) {</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;      $default = drupal_get_installed_schema_version($module);</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;      <span class="keywordflow">if</span> (max($updates) &gt; $default) {</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;You have pending database updates. Run `drush updatedb` or visit update.php in your browser.&quot;</span>), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;        <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;      }</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;    }</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;  }</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;<span class="comment"></span></div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;<span class="comment"> * Sanitize user provided arguments to several pm commands.</span></div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</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="l01229"></a><span class="lineno"> 1229</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01230"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a34b2e74a73c176eed08207d9bcb4c587"> 1230</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="l01231"></a><span class="lineno"> 1231</span>&#160;  $arguments = <a class="code" href="drush_8inc.html#a6007ce294242d1f6e48cda703fbb8d3f">_convert_csv_to_array</a>($args);</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;  <span class="keywordflow">foreach</span> ($arguments as $key =&gt; $argument) {</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</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="l01234"></a><span class="lineno"> 1234</span>&#160;  }</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;  <span class="keywordflow">return</span> $arguments;</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;}</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;<span class="comment"> * Parse out the project name and version and return as a structured array.</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"> * @param $requests an array of project names</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#a66b0def0d14711d5c10884363c8ae1b5"> 1243</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#a66b0def0d14711d5c10884363c8ae1b5">pm_parse_project_version</a>($requests) {</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;  $requestdata = array();</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;  $drupal_version_default = <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;  <span class="keywordflow">if</span> (!$drupal_version_default) {</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;    $drupal_version_default = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;default-major&#39;</span>, 7);</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;  }</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;  $drupal_version_default .= <span class="stringliteral">&#39;.x&#39;</span>;</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;  $drupal_bootstrap = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt; 0;</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;  <span class="keywordflow">foreach</span>($requests as $request) {</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;    $drupal_version = $drupal_version_default;</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;    $project_version = NULL;</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    $version = NULL;</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;    $project = $request;</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;    <span class="comment">// project-HEAD or project-5.x-1.0-beta</span></div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    <span class="comment">// &#39;5.x-&#39; is optional, as is &#39;-beta&#39;</span></div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    preg_match(<span class="stringliteral">&#39;/-+(HEAD|(?:(\d+\.x)-+)?(\d+\.[\dx]+.*))$/&#39;</span>, $request, $matches);</div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;    <span class="keywordflow">if</span> (isset($matches[1])) {</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;      <span class="comment">// The project is whatever we have prior to the version part of the request.</span></div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;      $project = trim(substr($request, 0, strlen($request) - strlen($matches[0])), <span class="stringliteral">&#39; -&#39;</span>);</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;      <span class="keywordflow">if</span> ($matches[1] == <span class="stringliteral">&#39;HEAD&#39;</span> || $matches[2] == <span class="stringliteral">&#39;HEAD&#39;</span>) {</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<span class="stringliteral">&#39;DRUSH_PM_HEAD&#39;</span>, <span class="stringliteral">&#39;Can\&#39;t download HEAD releases because Drupal.org project information only provides for numbered release nodes.&#39;</span>, <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;        <span class="keywordflow">continue</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">if</span> (!empty($matches[2])) {</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;        <span class="comment">// We have a specified Drupal core version.</span></div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;        $drupal_version = trim($matches[2], <span class="stringliteral">&#39;-.&#39;</span>);</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;      <span class="keywordflow">if</span> (!empty($matches[3])) {</div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;        <span class="keywordflow">if</span> (!$drupal_bootstrap &amp;&amp; empty($matches[2]) &amp;&amp; $project != <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;          <span class="comment">// We are not working on a bootstrapped site, and the project is not Drupal itself,</span></div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;          <span class="comment">// so we assume this value is the Drupal core version and we want the stable project.</span></div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;          $drupal_version = trim($matches[3], <span class="stringliteral">&#39;-.&#39;</span>);</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;        }</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;          <span class="comment">// We are working on a bootstrapped site, or the user specified a Drupal version,</span></div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;          <span class="comment">// so this value must be a specified project version.</span></div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;          $project_version = trim($matches[3], <span class="stringliteral">&#39;-.&#39;</span>);</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;          <span class="keywordflow">if</span> (substr($project_version, -1, 1) == <span class="charliteral">&#39;x&#39;</span>) {</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;            <span class="comment">// If a dev branch was requested, we add a -dev suffix.</span></div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;            $project_version .= <span class="stringliteral">&#39;-dev&#39;</span>;</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;          }</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;        }</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;      }</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    }</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;    <span class="comment">// special checking for &#39;drupal-VERSION&#39;, == drupal latest stable release</span></div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    elseif ((substr($request,0,7) == <span class="stringliteral">&#39;drupal-&#39;</span>) &amp;&amp; (is_numeric(substr($request,7)))) {</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;      $project = <span class="stringliteral">&#39;drupal&#39;</span>;</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;      $drupal_version = substr($request,7) . <span class="stringliteral">&#39;.x&#39;</span>;</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;      $project_version = $version;</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;    <span class="keywordflow">if</span> ($project_version) {</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;      <span class="keywordflow">if</span> ($project == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;        <span class="comment">// For project Drupal, ensure the major version branch is correct, so</span></div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;        <span class="comment">// we can locate the requested or stable release for that branch.</span></div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;        $project_version_array = explode(<span class="charliteral">&#39;.&#39;</span>, $project_version);</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;        $drupal_version = $project_version_array[0] . <span class="stringliteral">&#39;.x&#39;</span>;</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;        <span class="comment">// We use the project version only, since it is core.</span></div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;        $version = $project_version;</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;      }</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;        <span class="comment">// For regular projects the version string includes the Drupal core version.</span></div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;        $version = $drupal_version . <span class="charliteral">&#39;-&#39;</span> . $project_version;</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;      }</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;    }</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;    $requestdata[$project] = array(</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;      <span class="stringliteral">&#39;name&#39;</span> =&gt; $project,</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;      <span class="stringliteral">&#39;version&#39;</span> =&gt; $version,</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;      <span class="stringliteral">&#39;drupal_version&#39;</span> =&gt; $drupal_version,</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;      <span class="stringliteral">&#39;project_version&#39;</span> =&gt; $project_version,</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;    );</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;  }</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;  <span class="keywordflow">return</span> $requestdata;</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;</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;<span class="comment"> * @defgroup engines Engine types</span></div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;<span class="comment"> * @{</span></div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;<span class="comment"> * Implementation of hook_drush_engine_type_info().</span></div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"><a class="code" href="group__engines.html#gac3ac3fde1aa909a1155a17e3a9cf5cb7"> 1327</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="l01328"></a><span class="lineno"> 1328</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;    <span class="stringliteral">&#39;package_handler&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;      <span class="stringliteral">&#39;option&#39;</span> =&gt; <span class="stringliteral">&#39;package-handler&#39;</span>,</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</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="l01332"></a><span class="lineno"> 1332</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;wget&#39;</span>,</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</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.&#39;</span>,</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;      ),</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;    ),</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;    <span class="stringliteral">&#39;release_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;      <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; TRUE,</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="stringliteral">&#39;update_info&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;      <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Determine how to fetch update info.&#39;</span>,</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;      <span class="stringliteral">&#39;add-options-to-command&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</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="l01345"></a><span class="lineno"> 1345</span>&#160;      ),</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;    ),</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;    <span class="stringliteral">&#39;version_control&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;      <span class="stringliteral">&#39;option&#39;</span> =&gt; <span class="stringliteral">&#39;version-control&#39;</span>,</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;backup&#39;</span>,</div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</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="l01351"></a><span class="lineno"> 1351</span>&#160;    ),</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;  );</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;}</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"> 1355</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;<span class="comment"> * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.</span></div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01358"></a><span class="lineno"><a class="code" href="group__engines.html#ga23826e01e6591dfb655c684cf9c82ed1"> 1358</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="l01359"></a><span class="lineno"> 1359</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;    <span class="stringliteral">&#39;wget&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</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="l01362"></a><span class="lineno"> 1362</span>&#160;    ),</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    <span class="stringliteral">&#39;git_drupalorg&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</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="l01365"></a><span class="lineno"> 1365</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</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="l01367"></a><span class="lineno"> 1367</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="l01368"></a><span class="lineno"> 1368</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="l01369"></a><span class="lineno"> 1369</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="l01370"></a><span class="lineno"> 1370</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="l01371"></a><span class="lineno"> 1371</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="l01372"></a><span class="lineno"> 1372</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="l01373"></a><span class="lineno"> 1373</span>&#160;      ),</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;        <span class="stringliteral">&#39;gitsubmodule&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</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="l01377"></a><span class="lineno"> 1377</span>&#160;        ),</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;      ),</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;    ),</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;  );</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;}</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;<span class="comment"> * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.</span></div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01386"></a><span class="lineno"><a class="code" href="group__engines.html#ga9a54c9d004aa0efb2c978f3914519a0b"> 1386</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="l01387"></a><span class="lineno"> 1387</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;    <span class="stringliteral">&#39;updatexml&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</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="l01390"></a><span class="lineno"> 1390</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</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="l01392"></a><span class="lineno"> 1392</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="l01393"></a><span class="lineno"> 1393</span>&#160;      ),</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;        <span class="stringliteral">&#39;cache&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</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="l01397"></a><span class="lineno"> 1397</span>&#160;        ),</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;        <span class="stringliteral">&#39;select&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</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="l01400"></a><span class="lineno"> 1400</span>&#160;        ),</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;    ),</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;  );</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;}</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;<span class="comment"> * Implements hook_drush_engine_ENGINE_TYPE().</span></div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01409"></a><span class="lineno"><a class="code" href="group__engines.html#gaaf102224e823b4d13c659f0dff2d6468"> 1409</a></span>&#160;<span class="keyword">function</span> <a class="code" href="group__engines.html#gaaf102224e823b4d13c659f0dff2d6468">pm_drush_engine_update_info</a>() {</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    <span class="stringliteral">&#39;drupal&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</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="l01413"></a><span class="lineno"> 1413</span>&#160;    ),</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;  );</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;}</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;<span class="comment"></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"> * Integration with VCS in order to easily commit your changes to projects.</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="group__engines.html#ga4c4be5afaca4f87930e3bb66a6dda7cc"> 1420</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="l01421"></a><span class="lineno"> 1421</span>&#160;  <span class="keywordflow">return</span> array(</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;    <span class="stringliteral">&#39;backup&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</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="l01424"></a><span class="lineno"> 1424</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;        <span class="stringliteral">&#39;no-backup&#39;</span> =&gt; <span class="stringliteral">&#39;Do not perform backups.&#39;</span>,</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</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="l01427"></a><span class="lineno"> 1427</span>&#160;      ),</div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;    ),</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;    <span class="stringliteral">&#39;bzr&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</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="l01431"></a><span class="lineno"> 1431</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="l01432"></a><span class="lineno"> 1432</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</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="l01434"></a><span class="lineno"> 1434</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="l01435"></a><span class="lineno"> 1435</span>&#160;      ),</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;        <span class="stringliteral">&#39;bzrcommit&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</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="l01439"></a><span class="lineno"> 1439</span>&#160;        ),</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;      ),</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;      <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</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="l01443"></a><span class="lineno"> 1443</span>&#160;      ),</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;    ),</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;    <span class="stringliteral">&#39;svn&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</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="l01447"></a><span class="lineno"> 1447</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="l01448"></a><span class="lineno"> 1448</span>&#160;      <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</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="l01450"></a><span class="lineno"> 1450</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="l01451"></a><span class="lineno"> 1451</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="l01452"></a><span class="lineno"> 1452</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="l01453"></a><span class="lineno"> 1453</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="l01454"></a><span class="lineno"> 1454</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="l01455"></a><span class="lineno"> 1455</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="l01456"></a><span class="lineno"> 1456</span>&#160;      ),</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;      <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;        <span class="stringliteral">&#39;svncommit&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</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="l01460"></a><span class="lineno"> 1460</span>&#160;        ),</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;      ),</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;      <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</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="l01464"></a><span class="lineno"> 1464</span>&#160;      ),</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;    ),</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;}</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;<span class="comment"> * @} End of &quot;Engine types&quot;.</span></div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;<span class="comment"> * Interface for version control systems.</span></div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</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="l01476"></a><span class="lineno"> 1476</span>&#160;<span class="comment"> * loaded at a time.</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"><a class="code" href="interfacedrush__version__control.html"> 1478</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="l01479"></a><span class="lineno"> 1479</span>&#160;  <span class="keyword">function</span> pre_update(&amp;$project);</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;  <span class="keyword">function</span> rollback($project);</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;  <span class="keyword">function</span> post_update($project);</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;  <span class="keyword">function</span> post_download($project);</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;  <span class="keyword">static</span> <span class="keyword">function</span> reserved_files();</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;}</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="comment"></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"> 1487</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="l01488"></a><span class="lineno"> 1488</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="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment"> * specific directory.</span></div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01491"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a7a7640133c515e06c96d0f4262b98c51"> 1491</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="l01492"></a><span class="lineno"> 1492</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="l01493"></a><span class="lineno"> 1493</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="l01494"></a><span class="lineno"> 1494</span>&#160;  <span class="comment">// If no version control was given, use a list of defaults.</span></div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;  <span class="keywordflow">if</span> (!$version_controls) {</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    <span class="comment">// Backup engine is the last option.</span></div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    $version_controls = array_reverse(array_keys($engine_info[<span class="stringliteral">&#39;engines&#39;</span>]));</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;  }</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    $version_controls = array($version_controls);</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="comment">// Find the first valid engine in the list, checking signatures if needed.</span></div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;  $engine = FALSE;</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;  <span class="keywordflow">while</span> (!$engine &amp;&amp; count($version_controls)) {</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;    $version_control = array_shift($version_controls);</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</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="l01508"></a><span class="lineno"> 1508</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="l01509"></a><span class="lineno"> 1509</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Verifying signature for !vcs version control engine.&#39;</span>, array(<span class="stringliteral">&#39;!vcs&#39;</span> =&gt; $version_control)), <span class="stringliteral">&#39;debug&#39;</span>);</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</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="l01511"></a><span class="lineno"> 1511</span>&#160;          $engine = $version_control;</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;        }</div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;      }</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;        $engine = $version_control;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;      }</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    }</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;  }</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;  <span class="keywordflow">if</span> (!$engine) {</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</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="l01521"></a><span class="lineno"> 1521</span>&#160;  }</div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;  $instance = <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;version_control&#39;</span>, $engine);</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;  <span class="keywordflow">return</span> $instance;</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;}</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;<span class="comment"> * Update the locked status of all of the candidate projects</span></div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;<span class="comment"> * to be updated.</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"> * @param array &amp;$projects</span></div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;<span class="comment"> *   The projects array from pm_updatecode.  $project[&#39;locked&#39;] will</span></div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;<span class="comment"> *   be set for every file where a persistent lockfile can be found.</span></div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;<span class="comment"> *   The &#39;lock&#39; and &#39;unlock&#39; operations are processed first.</span></div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<span class="comment"> * @param array $projects_to_lock</span></div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;<span class="comment"> *   A list of projects to create peristent lock files for</span></div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;<span class="comment"> * @param array $projects_to_unlock</span></div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;<span class="comment"> *   A list of projects to clear the persistent lock on</span></div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;<span class="comment"> * @param string $lock_message</span></div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;<span class="comment"> *   The reason the project is being locked; stored in the lockfile.</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"> * @return array</span></div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;<span class="comment"> *   A list of projects that are locked.</span></div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01545"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ae6681be57636d2db04f48bcc85588b2c"> 1545</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="l01546"></a><span class="lineno"> 1546</span>&#160;  $locked_result = array();</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;  <span class="comment">// Warn about ambiguous lock / unlock values</span></div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;  <span class="keywordflow">if</span> ($projects_to_lock == array(<span class="charliteral">&#39;1&#39;</span>)) {</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;    $projects_to_lock = array();</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Ignoring --lock with no value.&#39;</span>), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;  }</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;  <span class="keywordflow">if</span> ($projects_to_unlock == array(<span class="charliteral">&#39;1&#39;</span>)) {</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;    $projects_to_unlock = array();</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Ignoring --unlock with no value.&#39;</span>), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;  }</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;  <span class="comment">// Log if we are going to lock or unlock anything</span></div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;  <span class="keywordflow">if</span> (!empty($projects_to_unlock)) {</div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unlocking !projects&#39;</span>, array(<span class="stringliteral">&#39;!projects&#39;</span> =&gt; implode(<span class="charliteral">&#39;,&#39;</span>, $projects_to_unlock))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;  }</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;  <span class="keywordflow">if</span> (!empty($projects_to_lock)) {</div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Locking !projects&#39;</span>, array(<span class="stringliteral">&#39;!projects&#39;</span> =&gt; implode(<span class="charliteral">&#39;,&#39;</span>, $projects_to_lock))), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;  }</div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</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="l01567"></a><span class="lineno"> 1567</span>&#160;  <span class="keywordflow">foreach</span> ($projects as $name =&gt; $project) {</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;    <span class="keywordflow">if</span> ($name == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;    }</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;    $message = NULL;</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;    <span class="keywordflow">if</span> (isset($project[<span class="stringliteral">&#39;path&#39;</span>])) {</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</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="l01574"></a><span class="lineno"> 1574</span>&#160;</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;      <span class="comment">// Remove the lock file if the --unlock option was specified</span></div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</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="l01577"></a><span class="lineno"> 1577</span>&#160;        <a class="code" href="drush_8inc.html#a903c36790dbe5525fe9369c8476780af">drush_op</a>(<span class="stringliteral">&#39;unlink&#39;</span>, $lockfile);</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;</div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;      <span class="comment">// Create the lock file if the --lock option was specified</span></div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</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="l01582"></a><span class="lineno"> 1582</span>&#160;        <a class="code" href="drush_8inc.html#a903c36790dbe5525fe9369c8476780af">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="l01583"></a><span class="lineno"> 1583</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="l01584"></a><span class="lineno"> 1584</span>&#160;        <span class="comment">// or if we get permission denied from the file_put_contents.</span></div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</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="l01586"></a><span class="lineno"> 1586</span>&#160;        <span class="comment">// read from the lock file below.</span></div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</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="l01588"></a><span class="lineno"> 1588</span>&#160;      }</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;      <span class="comment">// If the persistent lock file exists, then mark the project as locked.</span></div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;      <span class="keywordflow">if</span> (file_exists($lockfile)) {</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;        $message = trim(file_get_contents($lockfile));</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;      }</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;    }</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;</div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;    <span class="comment">// If there is a message set, then mark the project as locked.</span></div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    <span class="keywordflow">if</span> (isset($message)) {</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</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="l01599"></a><span class="lineno"> 1599</span>&#160;      $locked_result[$name] = $project;</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;    }</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;  }</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;  <span class="keywordflow">return</span> $locked_result;</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;}</div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;<span class="comment"> * Returns the path to the extensions cache file.</span></div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01609"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a567926af6bf845ab261f8088ed3650e9"> 1609</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="l01610"></a><span class="lineno"> 1610</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="l01611"></a><span class="lineno"> 1611</span>&#160;}</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;<span class="comment"> * Load the extensions cache.</span></div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01616"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a1a9f970e8e1525f29446ccd2dc3d482c"> 1616</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="l01617"></a><span class="lineno"> 1617</span>&#160;  $extension_cache = array();</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</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="l01619"></a><span class="lineno"> 1619</span>&#160;</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;  <span class="keywordflow">if</span> (file_exists($cache_file)) {</div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;    include $cache_file;</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;  }</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;  <span class="keywordflow">if</span> (!array_key_exists(<span class="stringliteral">&#39;extension-map&#39;</span>, $extension_cache)) {</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;    $extension_cache[<span class="stringliteral">&#39;extension-map&#39;</span>] = array();</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;  <span class="keywordflow">return</span> $extension_cache;</div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;}</div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;<span class="comment"> * Lookup an extension in the extensions cache.</span></div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01632"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a62bdee36bea9dd3ce5edfd4efe81e375"> 1632</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="l01633"></a><span class="lineno"> 1633</span>&#160;  $result = NULL;</div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</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="l01635"></a><span class="lineno"> 1635</span>&#160;  <span class="keywordflow">if</span> (!empty($extension_cache) &amp;&amp; array_key_exists($extension, $extension_cache)) {</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;    $result = $extension_cache[$extension];</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;  }</div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;  <span class="keywordflow">return</span> $result;</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;<span class="comment"></span></div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;<span class="comment"> * Persists extensions cache.</span></div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;<span class="comment"> * #TODO# not implemented.</span></div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01646"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#a8a4d344103347ff57afdfb7c22bd2eb3"> 1646</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="l01647"></a><span class="lineno"> 1647</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;<span class="comment"> * Store extensions founds within a project in extensions cache.</span></div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01652"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ab0b677f8357246eb16b6c994cb63eaf7"> 1652</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="l01653"></a><span class="lineno"> 1653</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="l01654"></a><span class="lineno"> 1654</span>&#160;  <span class="keywordflow">foreach</span>($found as $extension) {</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    <span class="comment">// Simple cache does not handle conflicts</span></div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;    <span class="comment">// We could keep an array of projects, and count</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;    <span class="comment">// how many times each one has been seen...</span></div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;    $extension_cache[$extension] = $project[<span class="stringliteral">&#39;name&#39;</span>];</div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;  }</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</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="l01661"></a><span class="lineno"> 1661</span>&#160;}</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;<span class="comment"> * Print out all extensions (modules/themes/profiles) found in specified project.</span></div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</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="l01667"></a><span class="lineno"> 1667</span>&#160;<span class="comment"> * profiles. It handles two kind of projects: drupal core/profiles and</span></div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;<span class="comment"> * modules/themes.</span></div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;<span class="comment"> * It does nothing with theme engine projects.</span></div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01671"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#acf732982c7f481e1bfc50db3bd269de9"> 1671</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="l01672"></a><span class="lineno"> 1672</span>&#160;  <span class="comment">// Mask for drush_scan_directory, to match .info.yml files.</span></div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</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="l01674"></a><span class="lineno"> 1674</span>&#160;</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;  <span class="comment">// Mask for drush_scan_directory, to avoid tests directories.</span></div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</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="l01677"></a><span class="lineno"> 1677</span>&#160;</div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;  <span class="comment">// Drupal core and profiles can contain modules, themes and profiles.</span></div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</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="l01680"></a><span class="lineno"> 1680</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="l01681"></a><span class="lineno"> 1681</span>&#160;    <span class="comment">// Find all of the .info files</span></div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;    <span class="keywordflow">foreach</span> (<a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($project[<span class="stringliteral">&#39;project_install_location&#39;</span>], $mask, $nomask) as $filename =&gt; $info) {</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;      <span class="comment">// Extract extension name from filename.</span></div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;      $matches = array();</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;      preg_match($mask, $info-&gt;basename, $matches);</div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;      $name = $matches[1];</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;      <span class="comment">// Find the project type corresponding the .info file.</span></div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;     <span class="comment">// (Only drupal &gt;=7.x has .info for .profile)</span></div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;      $base = dirname($filename) . <span class="charliteral">&#39;/&#39;</span> . $name;</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;      <span class="keywordflow">if</span> (is_file($base . <span class="stringliteral">&#39;.module&#39;</span>)) {</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;        $found[<span class="stringliteral">&#39;module&#39;</span>][] = $name;</div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;      }</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</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="l01695"></a><span class="lineno"> 1695</span>&#160;        $found[<span class="stringliteral">&#39;profile&#39;</span>][] = $name;</div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;      }</div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;        $found[<span class="stringliteral">&#39;theme&#39;</span>][] = $name;</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;      }</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;    }</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;    <span class="comment">// Special case: find profiles for drupal &lt; 7.x (no .info)</span></div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</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="l01703"></a><span class="lineno"> 1703</span>&#160;      <span class="keywordflow">foreach</span> (drush_find_profiles($project[<span class="stringliteral">&#39;project_install_location&#39;</span>]) as $filename =&gt; $info) {</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;        $found[<span class="stringliteral">&#39;profile&#39;</span>][] = $info-&gt;name;</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;      }</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;    }</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    <span class="comment">// Log results.</span></div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;    $msg = <span class="stringliteral">&quot;Project !project contains:\n&quot;</span>;</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</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="l01710"></a><span class="lineno"> 1710</span>&#160;    <span class="keywordflow">foreach</span> (array_keys($found) as $type) {</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;      <span class="keywordflow">if</span> ($count = count($found[$type])) {</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;        $msg .= <span class="stringliteral">&quot; - !count_$type !type_$type: !found_$type\n&quot;</span>;</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</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="l01714"></a><span class="lineno"> 1714</span>&#160;        <span class="keywordflow">if</span> ($count &gt; 1) {</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</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="l01716"></a><span class="lineno"> 1716</span>&#160;        }</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;      }</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;    }</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>($msg, $args), <span class="stringliteral">&#39;success&#39;</span>);</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</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="l01721"></a><span class="lineno"> 1721</span>&#160;  }</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;  <span class="comment">// Modules and themes can only contain other extensions of the same type.</span></div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;  elseif (in_array($project[<span class="stringliteral">&#39;project_type&#39;</span>], array(<span class="stringliteral">&#39;module&#39;</span>, <span class="stringliteral">&#39;theme&#39;</span>))) {</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;    $found = array();</div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;    <span class="keywordflow">foreach</span> (<a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($project[<span class="stringliteral">&#39;project_install_location&#39;</span>], $mask, $nomask) as $filename =&gt; $info) {</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;      <span class="comment">// Extract extension name from filename.</span></div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;      $matches = array();</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;      preg_match($mask, $info-&gt;basename, $matches);</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;      $found[] = $matches[1];</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;    <span class="comment">// If there is only one module / theme in the project, only print out</span></div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;    <span class="comment">// the message if is different than the project name.</span></div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;    <span class="keywordflow">if</span> (count($found) == 1) {</div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;      <span class="keywordflow">if</span> ($found[0] != $project[<span class="stringliteral">&#39;name&#39;</span>]) {</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;        $msg = <span class="stringliteral">&quot;Project !project contains a !type named !found.&quot;</span>;</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;      }</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;    }</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;    <span class="comment">// If there are multiple modules or themes in the project, list them all.</span></div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;      $msg = <span class="stringliteral">&quot;Project !project contains !count !types: !found.&quot;</span>;</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;    }</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;    <span class="keywordflow">if</span> (isset($msg)) {</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;      <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>($msg, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $project[<span class="stringliteral">&#39;name&#39;</span>], <span class="stringliteral">&#39;!count&#39;</span> =&gt; count($found), <span class="stringliteral">&#39;!type&#39;</span> =&gt; $project[<span class="stringliteral">&#39;project_type&#39;</span>], <span class="stringliteral">&#39;!found&#39;</span> =&gt; implode(<span class="stringliteral">&#39;, &#39;</span>, $found))));</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;    }</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;    <a class="code" href="group__outputfunctions.html#ga03664ee5326159c3f8e6c97aa93c7981">drush_print_pipe</a>($found);</div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;    <span class="comment">// Cache results.</span></div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;    <a class="code" href="pm_8drush_8inc.html#ab0b677f8357246eb16b6c994cb63eaf7">drush_pm_cache_project_extensions</a>($project, $found);</div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;  }</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;}</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;<span class="comment"> * Return an array of empty directories.</span></div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;<span class="comment"> * Walk a directory and return an array of subdirectories that are empty. Will</span></div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;<span class="comment"> * return the given directory if it&#39;s empty.</span></div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;<span class="comment"> * If a list of items to exclude is provided, subdirectories will be condidered</span></div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;<span class="comment"> * empty even if they include any of the items in the list.</span></div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;<span class="comment"> * @param string $dir</span></div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;<span class="comment"> *   Path to the directory to work in.</span></div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;<span class="comment"> * @param array $exclude</span></div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;<span class="comment"> *   Array of files or directory to exclude in the check.</span></div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;<span class="comment"> *   A list of directory paths that are empty. A directory is deemed to be empty</span></div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;<span class="comment"> *   if it only contains excluded files or directories.</span></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"><a class="code" href="pm_8drush_8inc.html#ab63ba263a636da9a21cd05af4c1613af"> 1768</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#ab63ba263a636da9a21cd05af4c1613af">drush_find_empty_directories</a>($dir, $exclude = array()) {</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;  <span class="comment">// Skip files.</span></div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;  <span class="keywordflow">if</span> (!is_dir($dir)) {</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    <span class="keywordflow">return</span> array();</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;  }</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;  $to_exclude = array_merge(array(<span class="charliteral">&#39;.&#39;</span>, <span class="stringliteral">&#39;..&#39;</span>), $exclude);</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;  $empty_dirs = array();</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;  $dir_is_empty = TRUE;</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;  <span class="keywordflow">foreach</span> (scandir($dir) as $file) {</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;    <span class="comment">// Skip excluded directories.</span></div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;    <span class="keywordflow">if</span> (in_array($file, $to_exclude)) {</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;    }</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;    <span class="comment">// Recurse into sub-directories to find potentially empty ones.</span></div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;    $subdir = $dir . <span class="charliteral">&#39;/&#39;</span> . $file;</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;    $empty_dirs += <a class="code" href="pm_8drush_8inc.html#ab63ba263a636da9a21cd05af4c1613af">drush_find_empty_directories</a>($subdir, $exclude);</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;    <span class="comment">// $empty_dir will not contain $subdir, if it is a file or if the</span></div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;    <span class="comment">// sub-directory is not empty. $subdir is only set if it is empty.</span></div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;    <span class="keywordflow">if</span> (!isset($empty_dirs[$subdir])) {</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;      $dir_is_empty = FALSE;</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;</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;  <span class="keywordflow">if</span> ($dir_is_empty) {</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    $empty_dirs[$dir] = $dir;</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="keywordflow">return</span> $empty_dirs;</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;}</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;<span class="comment"></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"> * Inject metadata into all .info files for a given project.</span></div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;<span class="comment"> * @param string $project_dir</span></div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;<span class="comment"> *   The full path to the root directory of the project to operate on.</span></div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;<span class="comment"> * @param string $project_name</span></div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;<span class="comment"> *   The project machine name (AKA shortname).</span></div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;<span class="comment"> * @param string $version</span></div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;<span class="comment"> *   The version string to inject into the .info file(s).</span></div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;<span class="comment"> * @return boolean</span></div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;<span class="comment"> *   TRUE on success, FALSE on any failures appending data to .info files.</span></div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01810"></a><span class="lineno"><a class="code" href="pm_8drush_8inc.html#ae5c95f9279eaddddd401970d1065c023"> 1810</a></span>&#160;<span class="keyword">function</span> <a class="code" href="pm_8drush_8inc.html#ae5c95f9279eaddddd401970d1065c023">drush_pm_inject_info_file_metadata</a>($project_dir, $project_name, $version) {</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;  $info_files = <a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($project_dir, <span class="stringliteral">&#39;/.*\.info$/&#39;</span>);</div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;  <span class="keywordflow">if</span> (!empty($info_files)) {</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    <span class="comment">// Construct the string of metadata to append to all the .info files.</span></div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;    <span class="comment">// Taken straight from: http://drupalcode.org/project/drupalorg.git/blob/refs/heads/6.x-3.x:/drupalorg_project/plugins/release_packager/DrupalorgProjectPackageRelease.class.php#l192</span></div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;    $info = <span class="stringliteral">&quot;\n\n; Information added by drush on &quot;</span> . date(<span class="stringliteral">&#39;Y-m-d&#39;</span>) . <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;    $info .= <span class="stringliteral">&quot;version = \&quot;$version\&quot;\n&quot;</span>;</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;    <span class="comment">// .info files started with 5.x, so we don&#39;t have to worry about version</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;    <span class="comment">// strings like &quot;4.7.x-1.0&quot; in this regular expression. If we can&#39;t parse</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;    <span class="comment">// the version (also from an old &quot;HEAD&quot; release), or the version isn&#39;t at</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;    <span class="comment">// least 6.x, don&#39;t add any &quot;core&quot; attribute at all.</span></div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;    $matches = array();</div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;    <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/^((\d+)\.x)-.*/&#39;</span>, $version, $matches) &amp;&amp; $matches[2] &gt;= 6) {</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;      $info .= <span class="stringliteral">&quot;core = \&quot;$matches[1]\&quot;\n&quot;</span>;</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;    }</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-gitprojectinfo&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;      $info .= <span class="stringliteral">&quot;project = \&quot;$project_name\&quot;\n&quot;</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;    $info .= <span class="stringliteral">&#39;datestamp = &quot;&#39;</span>. time() .<span class="stringliteral">&quot;\&quot;\n&quot;</span>;</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;    $info .= <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;    <span class="keywordflow">foreach</span> ($info_files as $info_file) {</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="group__filesystemfunctions.html#gaa937217ceef1edbab4bdcd37301d1990">drush_file_append_data</a>($info_file-&gt;filename, $info)) {</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;      }</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    }</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="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Oct 8 2014 09:04:54 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>