Drush: commands/pm/release_info/updatexml.inc Source File

  1. 7.x doxygen/html/updatexml_8inc_source.html
  2. master doxygen/html/updatexml_8inc_source.html
updatexml.inc
Go to the documentation of this file.
1 <?php
2 
3 /**
4  * @file
5  * Drush release info engine for update.drupal.org and compatible services.
6  *
7  * This engine does connect directly to the update service. It doesn't depend
8  * on a bootstraped site.
9  */
10 
11 define('RELEASE_INFO_DEFAULT_URL', 'http://updates.drupal.org/release-history');
12 
13 
14 /**
15  * Obtain the most appropiate release for the requested project.
16  *
17  * @param Array &$request
18  * A project request as returned by pm_parse_project_version(). The array will
19  * be expanded with the project type.
20  * @param String $restrict_to
21  * One of:
22  * 'dev': Forces choosing a -dev release.
23  * 'version': Forces choosing a point release.
24  * '': No restriction.
25  * Default is ''.
26  * @param String $select
27  * Strategy for selecting a release, should be one of:
28  * - auto: Try to select the latest release, if none found allow the user
29  * to choose.
30  * - always: Force the user to choose a release.
31  * - never: Try to select the latest release, if none found then fail.
32  * - ignore: Ignore and return NULL.
33  * If no supported release is found, allow to ask the user to choose one.
34  * @param Boolean $all
35  * In case $select = TRUE this indicates that all available releases will be
36  * offered the user to choose.
37  *
38  * @return
39  * The selected release xml object.
40  */
41 function release_info_fetch(&$request, $restrict_to = '', $select = 'never', $all = FALSE) {
42  if (!in_array($select, array('auto', 'never', 'always', 'ignore'))) {
43  return drush_set_error('DRUSH_PM_UNKNOWN_SELECT_STRATEGY', dt("Error: select strategy must be one of: auto, never, always, ignore", array()));
44  }
45 
46  $xml = updatexml_get_release_history_xml($request);
47  if (!$xml) {
48  return FALSE;
49  }
50 
51  $request['project_type'] = updatexml_determine_project_type($xml);
52 
53  if ($select != 'always') {
54  if ($restrict_to == 'dev') {
55  $release = updatexml_dev_release($request, $xml);
56  if ($release === FALSE) {
57  return drush_set_error('DRUSN_PM_NO_DEV_RELEASE', dt('There is no development release for project !project.', array('!project' => $request['name'])));
58  }
59  }
60  if (empty($release)) {
61  $release = updatexml_specific_release_version($request, $xml);
62  if ($release === FALSE) {
63  return drush_set_error('DRUSH_PM_COULD_NOT_FIND_VERSION', dt("Could not locate !project version !version.", array('!project' => $request['name'], '!version' => $request['version'])));
64  }
65  }
66  // If there was no specific release requested, try to identify the most appropriate release.
67  if (empty($release)) {
68  $release = updatexml_most_appropriate_release($request, $xml);
69  }
70  if ($release) {
71  return $release;
72  }
73  else {
74  $message = dt('There are no stable releases for project !project.', array('!project' => $request['name']));
75  if ($select == 'never') {
76  return drush_set_error('DRUSH_PM_NO_STABLE_RELEASE', $message);
77  }
78  drush_log($message, 'warning');
79  if ($select == 'ignore') {
80  return;
81  }
82  }
83  }
84 
85  $project_info = updatexml_get_releases_from_xml($xml, $request['name']);
86  $releases = release_info_filter_releases($project_info['releases'], $all, $restrict_to);
87  $options = array();
88  foreach($releases as $version => $release) {
89  $options[$version] = array($version, '-', gmdate('Y-M-d', $release['date']), '-', implode(', ', $release['release_status']));
90  }
91  $choice = drush_choice($options, dt('Choose one of the available releases for !project:', array('!project' => $request['name'])));
92  if (!$choice) {
93  return drush_user_abort();
94  }
95 
96  return $project_info['releases'][$choice];
97 }
98 
99 /**
100  * Obtain releases info for given requests and fill in status information.
101  *
102  * @param $requests
103  * An array of project names optionally with a version.
104  */
105 function release_info_get_releases($requests) {
106  $info = array();
107 
108  foreach ($requests as $name => $request) {
109  $xml = updatexml_get_release_history_xml($request);
110  if (!$xml) {
111  continue;
112  }
113 
114  $project_info = updatexml_get_releases_from_xml($xml, $name);
115  $info[$name] = $project_info;
116  }
117 
118  return $info;
119 }
120 
121 /**
122  * Check if a project is available in a update service.
123  *
124  * Optionally check for consistency by comparing given project type and
125  * the type obtained from the update service.
126  */
127 function release_info_check_project($request, $type = NULL) {
128  $xml = updatexml_get_release_history_xml($request);
129  if (!$xml) {
130  return FALSE;
131  }
132 
133  if ($type) {
134  $project_type = updatexml_determine_project_type($xml);
135  if ($project_type != $type) {
136  return FALSE;
137  }
138  }
139 
140  return TRUE;
141 }
142 
143 /**
144  * Prints release notes for given projects.
145  *
146  * @param $requests
147  * An array of drupal.org project names optionally with a version.
148  * @param $print_status
149  * Boolean. Used by pm-download to not print a informative note.
150  * @param $tmpfile
151  * If provided, a file that contains contents to show before the
152  * release notes.
153  */
154 function release_info_print_releasenotes($requests, $print_status = TRUE, $tmpfile = NULL) {
155  $info = release_info_get_releases($requests);
156  if (!$info) {
157  return drush_log(dt('No valid projects given.'), 'ok');
158  }
159 
160  if (!isset($tmpfile)) {
161  $tmpfile = drush_tempnam('rln-' . implode('-', array_keys($requests)) . '.');
162  }
163 
164  foreach ($info as $name => $project) {
165  $selected_versions = array();
166  // If the request includes version, show the release notes for this version.
167  if (isset($requests[$name]['version'])) {
168  $selected_versions[] = $requests[$name]['version'];
169  }
170  else {
171  // If requested project is installed,
172  // show release notes for the installed version and all newer versions.
173  if (isset($project['recommended'], $project['installed'])) {
174  $releases = array_reverse($project['releases']);
175  foreach($releases as $version => $release) {
176  if ($release['date'] >= $project['releases'][$project['installed']]['date']) {
177  $release += array('version_extra' => '');
178  $project['releases'][$project['installed']] += array('version_extra' => '');
179  if ($release['version_extra'] == 'dev' && $project['releases'][$project['installed']]['version_extra'] != 'dev') {
180  continue;
181  }
182  $selected_versions[] = $version;
183  }
184  }
185  }
186  else {
187  // Project is not installed and user did not specify a version,
188  // so show the release notes for the recommended version.
189  $selected_versions[] = $project['recommended'];
190  }
191  }
192 
193  foreach ($selected_versions as $version) {
194  if (!isset($project['releases'][$version]['release_link'])) {
195  drush_log(dt("Project !project does not have release notes for version !version.", array('!project' => $name, '!version' => $version)), 'warning');
196  continue;
197  }
198  $release_link = $project['releases'][$version]['release_link'];
199  $filename = drush_download_file($release_link, drush_tempnam($name));
200  @$dom = DOMDocument::loadHTMLFile($filename);
201  if ($dom) {
202  drush_log(dt("Successfully parsed and loaded the HTML contained in the release notes' page for !project (!version) project.", array('!project' => $name, '!version' => $version)), 'notice');
203  }
204  else {
205  drush_log(dt("Error while requesting the release notes page for !project project.", array('!project' => $name)), 'error');
206  continue;
207  }
208  $xml = simplexml_import_dom($dom);
209  $node_content = $xml->xpath('//div[@class="node node-project-release clearfix"]');
210 
211  // Prepare the project notes to print.
212  $notes_last_update = $node_content[0]->div[1]->div[0]->asXML();
213  unset($node_content[0]->div);
214  $project_notes = $node_content[0]->asXML();
215 
216  // Build the status message.
217  $status_msg = '> ' . implode(', ', $project['releases'][$version]['release_status']);
218  $break = '<br>';
219  $notes_header = dt("<hr>
220  > RELEASE NOTES FOR '!name' PROJECT, VERSION !version:!break
221  > !time.!break
222  !status
223 <hr>
224 ", array('!status' => $print_status ? $status_msg : '', '!name' => strtoupper($name), '!break' => $break, '!version' => $version, '!time' => $notes_last_update));
225 
226  // Finally print the release notes for the requested project.
227  if (drush_get_option('html', FALSE)) {
228  $print = $notes_header . $project_notes;
229  }
230  else {
231  $print = drush_html_to_text($notes_header . $project_notes . "\n", array('br', 'p', 'ul', 'ol', 'li', 'hr'));
232  if (drush_drupal_major_version() < 7) { $print .= "\n"; }
233  }
234  file_put_contents($tmpfile, $print, FILE_APPEND);
235  }
236  }
237  drush_print_file($tmpfile);
238 }
239 
240 /**
241  * Helper function for release_info_filter_releases().
242  */
243 function _release_info_compare_date($a, $b) {
244  if ($a['date'] == $b['date']) {
245  return 0;
246  }
247  if ($a['version_major'] == $b['version_major']) {
248  return ($a['date'] > $b['date']) ? -1 : 1;
249  }
250  return ($a['version_major'] > $b['version_major']) ? -1 : 1;
251 }
252 
253 /**
254  * Filter a list of releases.
255  *
256  * @param $releases
257  * Array of release information
258  * @param $all
259  * Show all releases. If FALSE, shows only the first release that is
260  * Recommended or Supported or Security or Installed.
261  * @param String $restrict_to
262  * If set to 'dev', show only development release.
263  * @param $show_all_until_installed
264  * If TRUE, then all releases will be shown until the INSTALLED release
265  * is found, at which point the algorithm will stop.
266  */
267 function release_info_filter_releases($releases, $all = FALSE, $restrict_to = '', $show_all_until_installed = TRUE) {
268  // Start off by sorting releases by release date.
269  uasort($releases, '_release_info_compare_date');
270  // Find version_major for the installed release.
271  $installed_version_major = FALSE;
272  foreach ($releases as $version => $release_info) {
273  if (in_array("Installed", $release_info['release_status'])) {
274  $installed_version_major = $release_info['version_major'];
275  }
276  }
277  // Now iterate through and filter out the releases we're interested in.
278  $options = array();
279  $limits_list = array();
280  $dev = $restrict_to == 'dev';
281  foreach ($releases as $version => $release_info) {
282  if (!$dev || ((array_key_exists('version_extra', $release_info)) && ($release_info['version_extra'] == 'dev'))) {
283  $saw_unique_status = FALSE;
284  foreach ($release_info['release_status'] as $one_status) {
285  // We will show the first release of a given kind;
286  // after we show the first security release, we show
287  // no other. We do this on a per-major-version basis,
288  // though, so if a project has three major versions, then
289  // we will show the first security release from each.
290  // This rule is overridden by $all and $show_all_until_installed.
291  $test_key = $release_info['version_major'] . $one_status;
292  if (!array_key_exists($test_key, $limits_list)) {
293  $limits_list[$test_key] = TRUE;
294  $saw_unique_status = TRUE;
295  // Once we see the "Installed" release we will stop
296  // showing all releases
297  if ($one_status == "Installed") {
298  $show_all_until_installed = FALSE;
299  $installed_release_date = $release_info['date'];
300  }
301  }
302  }
303  if ($all || ($show_all_until_installed && ($installed_version_major == $release_info['version_major'])) || $saw_unique_status) {
304  $options[$release_info['version']] = $release_info;
305  }
306  }
307  }
308  // If "show all until installed" is still true, that means that
309  // we never encountered the installed release anywhere in releases,
310  // and therefore we did not filter out any releases at all. If this
311  // is the case, then call ourselves again, this time with
312  // $show_all_until_installed set to FALSE from the beginning.
313  // The other situation we might encounter is when we do not encounter
314  // the installed release, and $options is still empty. This means
315  // that there were no supported or recommented or security or development
316  // releases found. If this is the case, then we will force ALL to TRUE
317  // and show everything on the second iteration.
318  if (($all === FALSE) && ($show_all_until_installed === TRUE)) {
319  $options = release_info_filter_releases($releases, empty($options), $restrict_to, FALSE);
320  }
321  return $options;
322 }
323 
324 /**
325  * No longer used by Drush core. Called by tests in releaseInfoTest.php.
326  * See equivalent logic in release_info_fetch.
327  */
328 function updatexml_parse_release($request, $xml, $restrict_to = '') {
329  if ($restrict_to == 'dev') {
330  return updatexml_dev_release($request, $xml);
331  }
332  $release = updatexml_specific_release_version($request, $xml);
333  if (is_array($release) && !empty($release)) {
334  return $release;
335  }
336  return updatexml_most_appropriate_release($request, $xml);
337 }
338 
339 /**
340  * Pick a specific version from XML list.
341  *
342  * @param array $request
343  * An array with project and version strings as returned by
344  * pm_parse_project_version().
345  * @param resource $xml
346  * A handle to the XML document.
347  * @param String $restrict_to
348  * One of:
349  * 'dev': Forces a -dev release.
350  * 'version': Forces a point release.
351  * '': No restriction (auto-selects latest recommended or supported release
352  * if requested release is not found).
353  * Default is ''.
354  * @return
355  * array - The selected release xml object. Empty if user did not specify a
356  * specific release.
357  * FALSE - The specified version could not be found.
358  */
359 function updatexml_specific_release_version($request, $xml) {
360  if (!empty($request['version'])) {
361  $matches = array();
362  // See if we only have a branch version.
363  if (preg_match('/^\d+\.x-(\d+)$/', $request['version'], $matches)) {
364  $xpath_releases = "/project/releases/release[status='published'][version_major=" . (string)$matches[1] . "]";
365  $releases = @$xml->xpath($xpath_releases);
366  }
367  else {
368  // In some cases, the request only says something like '7.x-3.x' but the
369  // version strings include '-dev' on the end, so we need to append that
370  // here for the xpath to match below.
371  if (substr($request['version'], -2) == '.x') {
372  $request['version'] .= '-dev';
373  }
374  $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $request['version'] . "']");
375  }
376  if (empty($releases)) {
377  return FALSE;
378  }
379  return updatexml_best_release_found($releases);
380  }
381  return array();
382 }
383 
384 /**
385  * Pick the first dev release from XML list.
386  *
387  * @param array $request
388  * An array with project and version strings as returned by
389  * pm_parse_project_version().
390  * @param resource $xml
391  * A handle to the XML document.
392  * @return
393  * array - The selected release xml object.
394  * FALSE - No dev releases were found.
395  */
396 function updatexml_dev_release($request, $xml) {
397  $releases = @$xml->xpath("/project/releases/release[status='published'][version_extra='dev']");
398  if (empty($releases)) {
399  return FALSE;
400  }
401  return updatexml_best_release_found($releases);
402 }
403 
404 /**
405  * Pick most appropriate release from XML list.
406  *
407  * @param array $request
408  * An array with project and version strings as returned by
409  * pm_parse_project_version().
410  * @param resource $xml
411  * A handle to the XML document.
412  * @return
413  * array - The selected release xml object.
414  * FALSE - No releases were found.
415  */
416 function updatexml_most_appropriate_release($request, $xml) {
417  $releases = array();
418  foreach(array('recommended_major', 'supported_majors') as $release_type) {
419  if ($versions = $xml->xpath("/project/$release_type")) {
420  $xpath = "/project/releases/release[status='published'][version_major=" . (string)$versions[0] . "]";
421  $releases = @$xml->xpath($xpath);
422  if (!empty($releases)) {
423  break;
424  }
425  }
426  }
427 
428  return updatexml_best_release_found($releases);
429 }
430 
431 /**
432  * Given a list of candidate releases, return the best one.
433  * This will be the first stable release if there are stable
434  * releases; otherwise, it will be any available release.
435  */
436 function updatexml_best_release_found($releases) {
437  // If there are releases found, let's try first to fetch one with no
438  // 'version_extra'. Otherwise, use all.
439  if (!empty($releases)) {
440  $stable_releases = array();
441  foreach ($releases as $one_release) {
442  if (!array_key_exists('version_extra', $one_release)) {
443  $stable_releases[] = $one_release;
444  }
445  }
446  if (!empty($stable_releases)) {
447  $releases = $stable_releases;
448  }
449  }
450 
451  if (empty($releases)) {
452  return FALSE;
453  }
454 
455  // First published release is just the first value in $releases.
456  return (array)$releases[0];
457 }
458 
459 function updatexml_get_url($request) {
460  $status_url = isset($request['status url']) ? $request['status url'] : RELEASE_INFO_DEFAULT_URL;
461  return $status_url . '/' . $request['name'] . '/' . $request['drupal_version'];
462 }
463 
464 /**
465  * Download the release history xml for the specified request.
466  */
468  $url = updatexml_get_url($request);
469  drush_log('Downloading release history from ' . $url);
470  // Some hosts have allow_url_fopen disabled.
471  if ($path = drush_download_file($url, drush_tempnam($request['name']), drush_get_option('cache-duration-releasexml', 24*3600))) {
472  $xml = simplexml_load_file($path);
473  }
474  if (!$xml) {
475  // We are not getting here since drupal.org always serves an XML response.
476  return drush_set_error('DRUSH_PM_DOWNLOAD_FAILED', dt('Could not download project status information from !url', array('!url' => $url)));
477  }
478  if ($error = $xml->xpath('/error')) {
479  // Don't set an error here since it stops processing during site-upgrade.
480  drush_log($error[0], 'warning'); // 'DRUSH_PM_COULD_NOT_LOAD_UPDATE_FILE',
481  return FALSE;
482  }
483  // Unpublished project?
484  $project_status = $xml->xpath('/project/project_status');
485  if ($project_status[0][0] == 'unpublished') {
486  return drush_set_error('DRUSH_PM_PROJECT_UNPUBLISHED', dt("Project !project is unpublished and has no releases available.", array('!project' => $request['name'])), 'warning');
487  }
488 
489  return $xml;
490 }
491 
492 
493 /**
494  * Obtain releases for a project's xml as returned by the update service.
495  */
496 function updatexml_get_releases_from_xml($xml, $project) {
497  // If bootstraped, we can obtain which is the installed release of a project.
498  static $installed_projects = FALSE;
499  if (!$installed_projects) {
500  if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_FULL) {
501  $installed_projects = drush_get_projects();
502  }
503  else {
504  $installed_projects = array();
505  }
506  }
507 
508  foreach (array('title', 'short_name', 'dc:creator', 'api_version', 'recommended_major', 'supported_majors', 'default_major', 'project_status', 'link') as $item) {
509  if (array_key_exists($item, $xml)) {
510  $value = $xml->xpath($item);
511  $project_info[$item] = (string)$value[0];
512  }
513  }
514 
515  $recommended_major = @$xml->xpath("/project/recommended_major");
516  $recommended_major = empty($recommended_major)?"":(string)$recommended_major[0];
517  $supported_majors = @$xml->xpath("/project/supported_majors");
518  $supported_majors = empty($supported_majors)?array():array_flip(explode(',', (string)$supported_majors[0]));
519  $releases_xml = @$xml->xpath("/project/releases/release[status='published']");
520  $recommended_version = NULL;
521  $latest_version = NULL;
522  $releases = array();
523  foreach ($releases_xml as $release) {
524  $release_info = array();
525  foreach (array('name', 'version', 'tag', 'version_major', 'version_extra', 'status', 'release_link', 'download_link', 'date', 'mdhash', 'filesize') as $item) {
526  if (array_key_exists($item, $release)) {
527  $value = $release->xpath($item);
528  $release_info[$item] = (string)$value[0];
529  }
530  }
531  $statuses = array();
532  if (array_key_exists($release_info['version_major'], $supported_majors)) {
533  $statuses[] = "Supported";
534  unset($supported_majors[$release_info['version_major']]);
535  }
536  if ($release_info['version_major'] == $recommended_major) {
537  if (!isset($latest_version)) {
538  $latest_version = $release_info['version'];
539  }
540  // The first stable version (no 'version extra') in the recommended major
541  // is the recommended release
542  if (empty($release_info['version_extra']) && (!isset($recommended_version))) {
543  $statuses[] = "Recommended";
544  $recommended_version = $release_info['version'];
545  }
546  }
547  if (!empty($release_info['version_extra']) && ($release_info['version_extra'] == "dev")) {
548  $statuses[] = "Development";
549  }
550  foreach ($release->xpath('terms/term/value') as $release_type) {
551  // There are three kinds of release types that we recognize:
552  // "Bug fixes", "New features" and "Security update".
553  // We will add "Security" for security updates, and nothing
554  // for the other kinds.
555  if (strpos($release_type, "Security") !== FALSE) {
556  $statuses[] = "Security";
557  }
558  }
559  // Add to status whether the project is installed.
560  if (isset($installed_projects[$project])) {
561  if ($installed_projects[$project]['version'] == $release_info['version']) {
562  $statuses[] = dt('Installed');
563  $project_info['installed'] = $release_info['version'];
564  }
565  }
566  $release_info['release_status'] = $statuses;
567  $releases[$release_info['version']] = $release_info;
568  }
569  // If there is no -stable- release in the recommended major,
570  // then take the latest verion in the recommended major to be
571  // the recommended release.
572  if (!isset($recommended_version) && isset($latest_version)) {
573  $recommended_version = $latest_version;
574  $releases[$recommended_version]['release_status'][] = "Recommended";
575  }
576 
577  $project_info['releases'] = $releases;
578  $project_info['recommended'] = $recommended_version;
579 
580  return $project_info;
581 }
582 
583 /**
584  * Determine a project type from its update service xml.
585  */
587  $project_types = array(
588  'core' => 'project_core',
589  'profile' => 'project_distribution',
590  'module' => 'project_module',
591  'theme' => 'project_theme',
592  'theme engine' => 'project_theme_engine',
593  'translation' => 'project_translation'
594  );
595 
596  $type = (string)$xml->type;
597  // Probably unused but kept for possible legacy compat.
598  $type = ($type == 'profile-legacy') ? 'profile' : $type;
599  $type = array_search($type, $project_types);
600  return $type;
601 }
602 

File

doxygen/html/updatexml_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/release_info/updatexml.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><li class="navelem"><a class="el" href="dir_85ba0a2264122952f251df2e94992348.html">release_info</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">updatexml.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="updatexml_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"> * Drush release info engine for update.drupal.org and compatible services.</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"> * This engine does connect directly to the update service. It doesn&#39;t depend</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * on a bootstraped site.</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;</div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;define(<span class="stringliteral">&#39;RELEASE_INFO_DEFAULT_URL&#39;</span>, <span class="stringliteral">&#39;http://updates.drupal.org/release-history&#39;</span>);</div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</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"> * Obtain the most appropiate release for the requested project.</span></div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * @param Array &amp;$request</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> *   A project request as returned by pm_parse_project_version(). The array will</span></div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> *   be expanded with the project type.</span></div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * @param String $restrict_to</span></div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> *   One of:</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> *     &#39;dev&#39;: Forces choosing a -dev release.</span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> *     &#39;version&#39;: Forces choosing a point release.</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> *     &#39;&#39;: No restriction.</span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> *   Default is &#39;&#39;.</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * @param String $select</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> *   Strategy for selecting a release, should be one of:</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> *    - auto: Try to select the latest release, if none found allow the user</span></div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment"> *            to choose.</span></div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="comment"> *    - always: Force the user to choose a release.</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> *    - never: Try to select the latest release, if none found then fail.</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> *    - ignore: Ignore and return NULL.</span></div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> *   If no supported release is found, allow to ask the user to choose one.</span></div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment"> * @param Boolean $all</span></div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment"> *   In case $select = TRUE this indicates that all available releases will be</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"> *  offered the user to choose.</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">   38</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="comment"> *  The selected release xml object.</span></div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a7fe4c8cdddd122b232c8daf5484444f9">   41</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a7fe4c8cdddd122b232c8daf5484444f9">release_info_fetch</a>(&amp;$request, $restrict_to = <span class="stringliteral">&#39;&#39;</span>, $select = <span class="stringliteral">&#39;never&#39;</span>, $all = FALSE) {</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;  <span class="keywordflow">if</span> (!in_array($select, array(<span class="stringliteral">&#39;auto&#39;</span>, <span class="stringliteral">&#39;never&#39;</span>, <span class="stringliteral">&#39;always&#39;</span>, <span class="stringliteral">&#39;ignore&#39;</span>))) {</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</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_UNKNOWN_SELECT_STRATEGY&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Error: select strategy must be one of: auto, never, always, ignore&quot;</span>, array()));</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;</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;  $xml = <a class="code" href="updatexml_8inc.html#a2131dceb4ad05da633f876f3feaa6064">updatexml_get_release_history_xml</a>($request);</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;  <span class="keywordflow">if</span> (!$xml) {</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;  }</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;  $request[<span class="stringliteral">&#39;project_type&#39;</span>] = <a class="code" href="updatexml_8inc.html#ae556ea1b63e6891e533346ac95941058">updatexml_determine_project_type</a>($xml);</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;  <span class="keywordflow">if</span> ($select != <span class="stringliteral">&#39;always&#39;</span>) {</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="keywordflow">if</span> ($restrict_to == <span class="stringliteral">&#39;dev&#39;</span>) {</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;      $release = <a class="code" href="updatexml_8inc.html#a1e73b712ba22db38fb129740f4293914">updatexml_dev_release</a>($request, $xml);</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;      <span class="keywordflow">if</span> ($release === FALSE) {</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSN_PM_NO_DEV_RELEASE&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;There is no development release for project !project.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>])));</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;      }</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    }</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="keywordflow">if</span> (empty($release)) {</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;      $release = <a class="code" href="updatexml_8inc.html#ad751aa32c24838c1055d7bfcdf119bb4">updatexml_specific_release_version</a>($request, $xml);</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;      <span class="keywordflow">if</span> ($release === FALSE) {</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</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_COULD_NOT_FIND_VERSION&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Could not locate !project version !version.&quot;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>], <span class="stringliteral">&#39;!version&#39;</span> =&gt; $request[<span class="stringliteral">&#39;version&#39;</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;    }</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <span class="comment">// If there was no specific release requested, try to identify the most appropriate release.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    <span class="keywordflow">if</span> (empty($release)) {</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;      $release = <a class="code" href="updatexml_8inc.html#a356068cfa3be6860ce7553c681888d58">updatexml_most_appropriate_release</a>($request, $xml);</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    }</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    <span class="keywordflow">if</span> ($release) {</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;      <span class="keywordflow">return</span> $release;</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    }</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;      $message = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;There are no stable releases for project !project.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>]));</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;      <span class="keywordflow">if</span> ($select == <span class="stringliteral">&#39;never&#39;</span>) {</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</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_STABLE_RELEASE&#39;</span>, $message);</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;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>($message, <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;      <span class="keywordflow">if</span> ($select == <span class="stringliteral">&#39;ignore&#39;</span>) {</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;        <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;      }</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    }</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  }</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;  $project_info = <a class="code" href="updatexml_8inc.html#a77d3e30a6d929bcfcbddaf167177dfab">updatexml_get_releases_from_xml</a>($xml, $request[<span class="stringliteral">&#39;name&#39;</span>]);</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  $releases = <a class="code" href="updatexml_8inc.html#a6850a54b3ea4ca22b4e64b14851712bc">release_info_filter_releases</a>($project_info[<span class="stringliteral">&#39;releases&#39;</span>], $all, $restrict_to);</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;  $options = array();</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;  <span class="keywordflow">foreach</span>($releases as $version =&gt; $release) {</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    $options[$version] = array($version, <span class="charliteral">&#39;-&#39;</span>, gmdate(<span class="stringliteral">&#39;Y-M-d&#39;</span>, $release[<span class="stringliteral">&#39;date&#39;</span>]), <span class="charliteral">&#39;-&#39;</span>, implode(<span class="stringliteral">&#39;, &#39;</span>, $release[<span class="stringliteral">&#39;release_status&#39;</span>]));</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;  }</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;  $choice = <a class="code" href="group__userinput.html#ga7e823bcd58051b17e6e5601340f0c784">drush_choice</a>($options, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Choose one of the available releases for !project:&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>])));</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;  <span class="keywordflow">if</span> (!$choice) {</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</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="l00094"></a><span class="lineno">   94</span>&#160;  }</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="keywordflow">return</span> $project_info[<span class="stringliteral">&#39;releases&#39;</span>][$choice];</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;}</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="comment"> * Obtain releases info for given requests and fill in status information.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="comment"> * @param $requests</span></div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="comment"> *   An array of project names optionally with a version.</span></div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a40d4c136aadd10580d665514073a3c0b">  105</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a40d4c136aadd10580d665514073a3c0b">release_info_get_releases</a>($requests) {</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;  $info = array();</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="keywordflow">foreach</span> ($requests as $name =&gt; $request) {</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    $xml = <a class="code" href="updatexml_8inc.html#a2131dceb4ad05da633f876f3feaa6064">updatexml_get_release_history_xml</a>($request);</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="keywordflow">if</span> (!$xml) {</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    }</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;    $project_info = <a class="code" href="updatexml_8inc.html#a77d3e30a6d929bcfcbddaf167177dfab">updatexml_get_releases_from_xml</a>($xml, $name);</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    $info[$name] = $project_info;</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;  }</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;  <span class="keywordflow">return</span> $info;</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;}</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="comment"> * Check if a project is available in a update service.</span></div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment"> * Optionally check for consistency by comparing given project type and</span></div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment"> * the type obtained from the update service.</span></div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a1273e7da7133ada1987f4dde8859aad1">  127</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a1273e7da7133ada1987f4dde8859aad1">release_info_check_project</a>($request, $type = NULL) {</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;  $xml = <a class="code" href="updatexml_8inc.html#a2131dceb4ad05da633f876f3feaa6064">updatexml_get_release_history_xml</a>($request);</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;  <span class="keywordflow">if</span> (!$xml) {</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;  }</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="keywordflow">if</span> ($type) {</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    $project_type = <a class="code" href="updatexml_8inc.html#ae556ea1b63e6891e533346ac95941058">updatexml_determine_project_type</a>($xml);</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="keywordflow">if</span> ($project_type != $type) {</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    }</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;  }</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;}</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="comment"> * Prints release notes for given projects.</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment"> * @param $requests</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment"> *   An array of drupal.org project names optionally with a version.</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="comment"> * @param $print_status</span></div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="comment"> *   Boolean. Used by pm-download to not print a informative note.</span></div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="comment"> * @param $tmpfile</span></div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="comment"> *   If provided, a file that contains contents to show before the</span></div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="comment"> *   release notes.</span></div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a4c90192cc502c7c05a5b4554c7d50258">  154</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a4c90192cc502c7c05a5b4554c7d50258">release_info_print_releasenotes</a>($requests, $print_status = TRUE, $tmpfile = NULL) {</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;  $info = <a class="code" href="updatexml_8inc.html#a40d4c136aadd10580d665514073a3c0b">release_info_get_releases</a>($requests);</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;  <span class="keywordflow">if</span> (!$info) {</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</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="l00158"></a><span class="lineno">  158</span>&#160;  }</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;  <span class="keywordflow">if</span> (!isset($tmpfile)) {</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    $tmpfile = <a class="code" href="group__filesystemfunctions.html#ga01729c5c432a2f30974966d888146d09">drush_tempnam</a>(<span class="stringliteral">&#39;rln-&#39;</span> . implode(<span class="charliteral">&#39;-&#39;</span>, array_keys($requests)) . <span class="charliteral">&#39;.&#39;</span>);</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;  }</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;  <span class="keywordflow">foreach</span> ($info as $name =&gt; $project) {</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    $selected_versions = array();</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    <span class="comment">// If the request includes version, show the release notes for this version.</span></div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    <span class="keywordflow">if</span> (isset($requests[$name][<span class="stringliteral">&#39;version&#39;</span>])) {</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;      $selected_versions[] = $requests[$name][<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    }</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;      <span class="comment">// If requested project is installed,</span></div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;      <span class="comment">// show release notes for the installed version and all newer versions.</span></div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;      <span class="keywordflow">if</span> (isset($project[<span class="stringliteral">&#39;recommended&#39;</span>], $project[<span class="stringliteral">&#39;installed&#39;</span>])) {</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;        $releases = array_reverse($project[<span class="stringliteral">&#39;releases&#39;</span>]);</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;        <span class="keywordflow">foreach</span>($releases as $version =&gt; $release) {</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;          <span class="keywordflow">if</span> ($release[<span class="stringliteral">&#39;date&#39;</span>] &gt;= $project[<span class="stringliteral">&#39;releases&#39;</span>][$project[<span class="stringliteral">&#39;installed&#39;</span>]][<span class="stringliteral">&#39;date&#39;</span>]) {</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;            $release += array(<span class="stringliteral">&#39;version_extra&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>);</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;            $project[<span class="stringliteral">&#39;releases&#39;</span>][$project[<span class="stringliteral">&#39;installed&#39;</span>]] += array(<span class="stringliteral">&#39;version_extra&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>);</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;            <span class="keywordflow">if</span> ($release[<span class="stringliteral">&#39;version_extra&#39;</span>] == <span class="stringliteral">&#39;dev&#39;</span> &amp;&amp; $project[<span class="stringliteral">&#39;releases&#39;</span>][$project[<span class="stringliteral">&#39;installed&#39;</span>]][<span class="stringliteral">&#39;version_extra&#39;</span>] != <span class="stringliteral">&#39;dev&#39;</span>) {</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;              <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;            }</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;            $selected_versions[] = $version;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;          }</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;        }</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;      }</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;        <span class="comment">// Project is not installed and user did not specify a version,</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;        <span class="comment">// so show the release notes for the recommended version.</span></div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;        $selected_versions[] = $project[<span class="stringliteral">&#39;recommended&#39;</span>];</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;      }</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;</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="keywordflow">foreach</span> ($selected_versions as $version) {</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;      <span class="keywordflow">if</span> (!isset($project[<span class="stringliteral">&#39;releases&#39;</span>][$version][<span class="stringliteral">&#39;release_link&#39;</span>])) {</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</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;Project !project does not have release notes for version !version.&quot;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!version&#39;</span> =&gt; $version)), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;      }</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;      $release_link = $project[<span class="stringliteral">&#39;releases&#39;</span>][$version][<span class="stringliteral">&#39;release_link&#39;</span>];</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;      $filename = <a class="code" href="drush_8inc.html#a9cce12bffedae74c4a45174c59c79311">drush_download_file</a>($release_link, <a class="code" href="group__filesystemfunctions.html#ga01729c5c432a2f30974966d888146d09">drush_tempnam</a>($name));</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;      @$dom = DOMDocument::loadHTMLFile($filename);</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;      <span class="keywordflow">if</span> ($dom) {</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</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;Successfully parsed and loaded the HTML contained in the release notes&#39; page for !project (!version) project.&quot;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;!version&#39;</span> =&gt; $version)), <span class="stringliteral">&#39;notice&#39;</span>);</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;      }</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</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;Error while requesting the release notes page for !project project.&quot;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $name)), <span class="stringliteral">&#39;error&#39;</span>);</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;      }</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;      $xml = simplexml_import_dom($dom);</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;      $node_content = $xml-&gt;xpath(<span class="stringliteral">&#39;//div[@class=&quot;node node-project-release clearfix&quot;]&#39;</span>);</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="comment">// Prepare the project notes to print.</span></div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;      $notes_last_update = $node_content[0]-&gt;div[1]-&gt;div[0]-&gt;asXML();</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;      unset($node_content[0]-&gt;div);</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;      $project_notes = $node_content[0]-&gt;asXML();</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;      <span class="comment">// Build the status message.</span></div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;      $status_msg = <span class="stringliteral">&#39;&gt; &#39;</span> . implode(<span class="stringliteral">&#39;, &#39;</span>, $project[<span class="stringliteral">&#39;releases&#39;</span>][$version][<span class="stringliteral">&#39;release_status&#39;</span>]);</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;      $break = <span class="stringliteral">&#39;&lt;br&gt;&#39;</span>;</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;      $notes_header = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;&lt;hr&gt;</span></div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="stringliteral"> &gt; RELEASE NOTES FOR &#39;!name&#39; PROJECT, VERSION !version:!break</span></div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;<span class="stringliteral"> &gt; !time.!break</span></div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;<span class="stringliteral"> !status</span></div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;<span class="stringliteral">&lt;hr&gt;</span></div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;<span class="stringliteral">&quot;</span>, array(<span class="stringliteral">&#39;!status&#39;</span> =&gt; $print_status ? $status_msg : <span class="stringliteral">&#39;&#39;</span>, <span class="stringliteral">&#39;!name&#39;</span> =&gt; strtoupper($name), <span class="stringliteral">&#39;!break&#39;</span> =&gt; $break, <span class="stringliteral">&#39;!version&#39;</span> =&gt; $version, <span class="stringliteral">&#39;!time&#39;</span> =&gt; $notes_last_update));</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;      <span class="comment">// Finally print the release notes for the requested project.</span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;html&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;        $print = $notes_header . $project_notes;</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;      }</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        $print = <a class="code" href="group__outputfunctions.html#gaf5119cf7ab3248aac5314f1dcb3d4c75">drush_html_to_text</a>($notes_header . $project_notes . <span class="stringliteral">&quot;\n&quot;</span>, array(<span class="stringliteral">&#39;br&#39;</span>, <span class="charliteral">&#39;p&#39;</span>, <span class="stringliteral">&#39;ul&#39;</span>, <span class="stringliteral">&#39;ol&#39;</span>, <span class="stringliteral">&#39;li&#39;</span>, <span class="stringliteral">&#39;hr&#39;</span>));</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() &lt; 7) { $print .= <span class="stringliteral">&quot;\n&quot;</span>; }</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;      }</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;      file_put_contents($tmpfile, $print, FILE_APPEND);</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    }</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;  }</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;  <a class="code" href="group__outputfunctions.html#ga8059aaf93da4ec3f4c5d3821928a9002">drush_print_file</a>($tmpfile);</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;}</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="comment"> * Helper function for release_info_filter_releases().</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a915a7987817963f4faf46727136b5013">  243</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a915a7987817963f4faf46727136b5013">_release_info_compare_date</a>($a, $b) {</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    <span class="keywordflow">if</span> ($a[<span class="stringliteral">&#39;date&#39;</span>] == $b[<span class="stringliteral">&#39;date&#39;</span>]) {</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;        <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    }</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    <span class="keywordflow">if</span> ($a[<span class="stringliteral">&#39;version_major&#39;</span>] == $b[<span class="stringliteral">&#39;version_major&#39;</span>]) {</div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;      <span class="keywordflow">return</span> ($a[<span class="stringliteral">&#39;date&#39;</span>] &gt; $b[<span class="stringliteral">&#39;date&#39;</span>]) ? -1 : 1;</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    }</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="keywordflow">return</span> ($a[<span class="stringliteral">&#39;version_major&#39;</span>] &gt; $b[<span class="stringliteral">&#39;version_major&#39;</span>]) ? -1 : 1;</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;}</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;<span class="comment"> * Filter a list of releases.</span></div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;<span class="comment"> * @param $releases</span></div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;<span class="comment"> *   Array of release information</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="comment"> * @param $all</span></div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="comment"> *   Show all releases. If FALSE, shows only the first release that is</span></div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="comment"> *   Recommended or Supported or Security or Installed.</span></div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment"> * @param String $restrict_to</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="comment"> *   If set to &#39;dev&#39;, show only development release.</span></div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;<span class="comment"> * @param $show_all_until_installed</span></div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;<span class="comment"> *   If TRUE, then all releases will be shown until the INSTALLED release</span></div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="comment"> *   is found, at which point the algorithm will stop.</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a6850a54b3ea4ca22b4e64b14851712bc">  267</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a6850a54b3ea4ca22b4e64b14851712bc">release_info_filter_releases</a>($releases, $all = FALSE, $restrict_to = <span class="stringliteral">&#39;&#39;</span>, $show_all_until_installed = TRUE) {</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;  <span class="comment">// Start off by sorting releases by release date.</span></div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;  uasort($releases, <span class="stringliteral">&#39;_release_info_compare_date&#39;</span>);</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;  <span class="comment">// Find version_major for the installed release.</span></div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;  $installed_version_major = FALSE;</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;  <span class="keywordflow">foreach</span> ($releases as $version =&gt; $release_info) {</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="keywordflow">if</span> (in_array(<span class="stringliteral">&quot;Installed&quot;</span>, $release_info[<span class="stringliteral">&#39;release_status&#39;</span>])) {</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;      $installed_version_major = $release_info[<span class="stringliteral">&#39;version_major&#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;  }</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="comment">// Now iterate through and filter out the releases we&#39;re interested in.</span></div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;  $options = array();</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;  $limits_list = array();</div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;  $dev = $restrict_to == <span class="stringliteral">&#39;dev&#39;</span>;</div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;  <span class="keywordflow">foreach</span> ($releases as $version =&gt; $release_info) {</div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    <span class="keywordflow">if</span> (!$dev || ((array_key_exists(<span class="stringliteral">&#39;version_extra&#39;</span>, $release_info)) &amp;&amp; ($release_info[<span class="stringliteral">&#39;version_extra&#39;</span>] == <span class="stringliteral">&#39;dev&#39;</span>))) {</div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;      $saw_unique_status = FALSE;</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;      <span class="keywordflow">foreach</span> ($release_info[<span class="stringliteral">&#39;release_status&#39;</span>] as $one_status) {</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;        <span class="comment">// We will show the first release of a given kind;</span></div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;        <span class="comment">// after we show the first security release, we show</span></div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;        <span class="comment">// no other.  We do this on a per-major-version basis,</span></div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;        <span class="comment">// though, so if a project has three major versions, then</span></div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;        <span class="comment">// we will show the first security release from each.</span></div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;        <span class="comment">// This rule is overridden by $all and $show_all_until_installed.</span></div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;        $test_key = $release_info[<span class="stringliteral">&#39;version_major&#39;</span>] . $one_status;</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;        <span class="keywordflow">if</span> (!array_key_exists($test_key, $limits_list)) {</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;          $limits_list[$test_key] = TRUE;</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;          $saw_unique_status = TRUE;</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;          <span class="comment">// Once we see the &quot;Installed&quot; release we will stop</span></div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;          <span class="comment">// showing all releases</span></div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;          <span class="keywordflow">if</span> ($one_status == <span class="stringliteral">&quot;Installed&quot;</span>) {</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;            $show_all_until_installed = FALSE;</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;            $installed_release_date = $release_info[<span class="stringliteral">&#39;date&#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;        }</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;      }</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;      <span class="keywordflow">if</span> ($all || ($show_all_until_installed &amp;&amp; ($installed_version_major == $release_info[<span class="stringliteral">&#39;version_major&#39;</span>])) || $saw_unique_status) {</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        $options[$release_info[<span class="stringliteral">&#39;version&#39;</span>]] = $release_info;</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;      }</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    }</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;  }</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;  <span class="comment">// If &quot;show all until installed&quot; is still true, that means that</span></div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  <span class="comment">// we never encountered the installed release anywhere in releases,</span></div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;  <span class="comment">// and therefore we did not filter out any releases at all.  If this</span></div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;  <span class="comment">// is the case, then call ourselves again, this time with</span></div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;  <span class="comment">// $show_all_until_installed set to FALSE from the beginning.</span></div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;  <span class="comment">// The other situation we might encounter is when we do not encounter</span></div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;  <span class="comment">// the installed release, and $options is still empty.  This means</span></div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;  <span class="comment">// that there were no supported or recommented or security or development</span></div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;  <span class="comment">// releases found.  If this is the case, then we will force ALL to TRUE</span></div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;  <span class="comment">// and show everything on the second iteration.</span></div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;  <span class="keywordflow">if</span> (($all === FALSE) &amp;&amp; ($show_all_until_installed === TRUE)) {</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    $options = <a class="code" href="updatexml_8inc.html#a6850a54b3ea4ca22b4e64b14851712bc">release_info_filter_releases</a>($releases, empty($options), $restrict_to, FALSE);</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;  }</div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;  <span class="keywordflow">return</span> $options;</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;}</div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;<span class="comment"> * No longer used by Drush core.  Called by tests in releaseInfoTest.php.</span></div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;<span class="comment"> * See equivalent logic in release_info_fetch.</span></div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00328"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#aa9851a9fc6d5b1fe85341357d059321a">  328</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#aa9851a9fc6d5b1fe85341357d059321a">updatexml_parse_release</a>($request, $xml, $restrict_to = <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;  <span class="keywordflow">if</span> ($restrict_to == <span class="stringliteral">&#39;dev&#39;</span>) {</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a1e73b712ba22db38fb129740f4293914">updatexml_dev_release</a>($request, $xml);</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;  }</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;  $release = <a class="code" href="updatexml_8inc.html#ad751aa32c24838c1055d7bfcdf119bb4">updatexml_specific_release_version</a>($request, $xml);</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;  <span class="keywordflow">if</span> (is_array($release) &amp;&amp; !empty($release)) {</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordflow">return</span> $release;</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="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a356068cfa3be6860ce7553c681888d58">updatexml_most_appropriate_release</a>($request, $xml);</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;}</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;<span class="comment"> * Pick a specific version from XML list.</span></div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="comment"> * @param array $request</span></div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="comment"> *   An array with project and version strings as returned by</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="comment"> *   pm_parse_project_version().</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="comment"> * @param resource $xml</span></div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="comment"> *   A handle to the XML document.</span></div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="comment"> * @param String $restrict_to</span></div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="comment"> *   One of:</span></div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;<span class="comment"> *     &#39;dev&#39;: Forces a -dev release.</span></div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="comment"> *     &#39;version&#39;: Forces a point release.</span></div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;<span class="comment"> *     &#39;&#39;: No restriction (auto-selects latest recommended or supported release</span></div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="comment"> *         if requested release is not found).</span></div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;<span class="comment"> *   Default is &#39;&#39;.</span></div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;<span class="comment"> *  array  - The selected release xml object. Empty if user did not specify a</span></div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;<span class="comment"> *    specific release.</span></div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;<span class="comment"> *  FALSE - The specified version could not be found.</span></div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#ad751aa32c24838c1055d7bfcdf119bb4">  359</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#ad751aa32c24838c1055d7bfcdf119bb4">updatexml_specific_release_version</a>($request, $xml) {</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;  <span class="keywordflow">if</span> (!empty($request[<span class="stringliteral">&#39;version&#39;</span>])) {</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    $matches = array();</div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    <span class="comment">// See if we only have a branch version.</span></div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;    <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/^\d+\.x-(\d+)$/&#39;</span>, $request[<span class="stringliteral">&#39;version&#39;</span>], $matches)) {</div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;      $xpath_releases = <span class="stringliteral">&quot;/project/releases/release[status=&#39;published&#39;][version_major=&quot;</span> . (string)$matches[1] . <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;      $releases = @$xml-&gt;xpath($xpath_releases);</div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;    }</div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;      <span class="comment">// In some cases, the request only says something like &#39;7.x-3.x&#39; but the</span></div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;      <span class="comment">// version strings include &#39;-dev&#39; on the end, so we need to append that</span></div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;      <span class="comment">// here for the xpath to match below.</span></div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;      <span class="keywordflow">if</span> (substr($request[<span class="stringliteral">&#39;version&#39;</span>], -2) == <span class="stringliteral">&#39;.x&#39;</span>) {</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;        $request[<span class="stringliteral">&#39;version&#39;</span>] .= <span class="stringliteral">&#39;-dev&#39;</span>;</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;      $releases = $xml-&gt;xpath(<span class="stringliteral">&quot;/project/releases/release[status=&#39;published&#39;][version=&#39;&quot;</span> . $request[<span class="stringliteral">&#39;version&#39;</span>] . <span class="stringliteral">&quot;&#39;]&quot;</span>);</div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    }</div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <span class="keywordflow">if</span> (empty($releases)) {</div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    }</div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a6622ddef8e364513df626b131b8f6bfc">updatexml_best_release_found</a>($releases);</div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;  }</div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;  <span class="keywordflow">return</span> array();</div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;}</div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="comment"></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">  385</span>&#160;<span class="comment"> * Pick the first dev release from XML list.</span></div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;<span class="comment"> * @param array $request</span></div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;<span class="comment"> *   An array with project and version strings as returned by</span></div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;<span class="comment"> *   pm_parse_project_version().</span></div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="comment"> * @param resource $xml</span></div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="comment"> *   A handle to the XML document.</span></div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="comment"> *  array  - The selected release xml object.</span></div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;<span class="comment"> *  FALSE  - No dev releases were found.</span></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"><a class="code" href="updatexml_8inc.html#a1e73b712ba22db38fb129740f4293914">  396</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a1e73b712ba22db38fb129740f4293914">updatexml_dev_release</a>($request, $xml) {</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;  $releases = @$xml-&gt;xpath(<span class="stringliteral">&quot;/project/releases/release[status=&#39;published&#39;][version_extra=&#39;dev&#39;]&quot;</span>);</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;  <span class="keywordflow">if</span> (empty($releases)) {</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;  }</div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a6622ddef8e364513df626b131b8f6bfc">updatexml_best_release_found</a>($releases);</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;}</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">/**</span></div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="comment"> * Pick most appropriate release from XML list.</span></div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;<span class="comment"> * @param array $request</span></div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="comment"> *   An array with project and version strings as returned by</span></div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="comment"> *   pm_parse_project_version().</span></div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment"> * @param resource $xml</span></div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;<span class="comment"> *   A handle to the XML document.</span></div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;<span class="comment"> *  array  - The selected release xml object.</span></div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="comment"> *  FALSE  - No releases were found.</span></div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00416"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a356068cfa3be6860ce7553c681888d58">  416</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a356068cfa3be6860ce7553c681888d58">updatexml_most_appropriate_release</a>($request, $xml) {</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;  $releases = array();</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;  <span class="keywordflow">foreach</span>(array(<span class="stringliteral">&#39;recommended_major&#39;</span>, <span class="stringliteral">&#39;supported_majors&#39;</span>) as $release_type) {</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    <span class="keywordflow">if</span> ($versions = $xml-&gt;xpath(<span class="stringliteral">&quot;/project/$release_type&quot;</span>)) {</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;      $xpath = <span class="stringliteral">&quot;/project/releases/release[status=&#39;published&#39;][version_major=&quot;</span> . (string)$versions[0] . <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;      $releases = @$xml-&gt;xpath($xpath);</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;      <span class="keywordflow">if</span> (!empty($releases)) {</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;        <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;      }</div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    }</div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;  }</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="updatexml_8inc.html#a6622ddef8e364513df626b131b8f6bfc">updatexml_best_release_found</a>($releases);</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;}</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;<span class="comment"> * Given a list of candidate releases, return the best one.</span></div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;<span class="comment"> * This will be the first stable release if there are stable</span></div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;<span class="comment"> * releases; otherwise, it will be any available release.</span></div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00436"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a6622ddef8e364513df626b131b8f6bfc">  436</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a6622ddef8e364513df626b131b8f6bfc">updatexml_best_release_found</a>($releases) {</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;  <span class="comment">// If there are releases found, let&#39;s try first to fetch one with no</span></div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;  <span class="comment">// &#39;version_extra&#39;. Otherwise, use all.</span></div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;  <span class="keywordflow">if</span> (!empty($releases)) {</div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    $stable_releases = array();</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    <span class="keywordflow">foreach</span> ($releases as $one_release) {</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;      <span class="keywordflow">if</span> (!array_key_exists(<span class="stringliteral">&#39;version_extra&#39;</span>, $one_release)) {</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        $stable_releases[] = $one_release;</div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;      }</div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    }</div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="keywordflow">if</span> (!empty($stable_releases)) {</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;      $releases = $stable_releases;</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;    }</div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;  }</div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;</div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;  <span class="keywordflow">if</span> (empty($releases)) {</div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;  }</div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;  <span class="comment">// First published release is just the first value in $releases.</span></div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;  <span class="keywordflow">return</span> (array)$releases[0];</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;}</div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;<span class="keyword">function</span> updatexml_get_url($request) {</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;  $status_url = isset($request[<span class="stringliteral">&#39;status url&#39;</span>]) ? $request[<span class="stringliteral">&#39;status url&#39;</span>] : RELEASE_INFO_DEFAULT_URL;</div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;  <span class="keywordflow">return</span> $status_url . <span class="charliteral">&#39;/&#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="charliteral">&#39;/&#39;</span> . $request[<span class="stringliteral">&#39;drupal_version&#39;</span>];</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;<span class="comment"></span></div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;<span class="comment"> * Download the release history xml for the specified request.</span></div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a2131dceb4ad05da633f876f3feaa6064">  467</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a2131dceb4ad05da633f876f3feaa6064">updatexml_get_release_history_xml</a>($request) {</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;  $url =  updatexml_get_url($request);</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;  <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<span class="stringliteral">&#39;Downloading release history from &#39;</span> . $url);</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;  <span class="comment">// Some hosts have allow_url_fopen disabled.</span></div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;  <span class="keywordflow">if</span> ($path = <a class="code" href="drush_8inc.html#a9cce12bffedae74c4a45174c59c79311">drush_download_file</a>($url, <a class="code" href="group__filesystemfunctions.html#ga01729c5c432a2f30974966d888146d09">drush_tempnam</a>($request[<span class="stringliteral">&#39;name&#39;</span>]), <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;cache-duration-releasexml&#39;</span>, 24*3600))) {</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    $xml = simplexml_load_file($path);</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;  }</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;  <span class="keywordflow">if</span> (!$xml) {</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    <span class="comment">// We are not getting here since drupal.org always serves an XML response.</span></div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</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_DOWNLOAD_FAILED&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Could not download project status information from !url&#39;</span>, array(<span class="stringliteral">&#39;!url&#39;</span> =&gt; $url)));</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;  }</div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;  <span class="keywordflow">if</span> ($error = $xml-&gt;xpath(<span class="stringliteral">&#39;/error&#39;</span>)) {</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    <span class="comment">// Don&#39;t set an error here since it stops processing during site-upgrade.</span></div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>($error[0], <span class="stringliteral">&#39;warning&#39;</span>); <span class="comment">// &#39;DRUSH_PM_COULD_NOT_LOAD_UPDATE_FILE&#39;,</span></div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    <span class="keywordflow">return</span> FALSE;</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="comment">// Unpublished project?</span></div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;  $project_status = $xml-&gt;xpath(<span class="stringliteral">&#39;/project/project_status&#39;</span>);</div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;  <span class="keywordflow">if</span> ($project_status[0][0] == <span class="stringliteral">&#39;unpublished&#39;</span>) {</div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</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_PROJECT_UNPUBLISHED&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Project !project is unpublished and has no releases available.&quot;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>])), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;  }</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="keywordflow">return</span> $xml;</div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;}</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="comment"> * Obtain releases for a project&#39;s xml as returned by the update service.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#a77d3e30a6d929bcfcbddaf167177dfab">  496</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#a77d3e30a6d929bcfcbddaf167177dfab">updatexml_get_releases_from_xml</a>($xml, $project) {</div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;  <span class="comment">// If bootstraped, we can obtain which is the installed release of a project.</span></div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;  <span class="keyword">static</span> $installed_projects = FALSE;</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;  <span class="keywordflow">if</span> (!$installed_projects) {</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt;= <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a6ea86b0ce6756b159a3fdef78fdff159">DRUSH_BOOTSTRAP_DRUPAL_FULL</a>) {</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;      $installed_projects = <a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>();</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    }</div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;      $installed_projects = array();</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;  }</div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;</div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;  <span class="keywordflow">foreach</span> (array(<span class="stringliteral">&#39;title&#39;</span>, <span class="stringliteral">&#39;short_name&#39;</span>, <span class="stringliteral">&#39;dc:creator&#39;</span>, <span class="stringliteral">&#39;api_version&#39;</span>, <span class="stringliteral">&#39;recommended_major&#39;</span>, <span class="stringliteral">&#39;supported_majors&#39;</span>, <span class="stringliteral">&#39;default_major&#39;</span>, <span class="stringliteral">&#39;project_status&#39;</span>, <span class="stringliteral">&#39;link&#39;</span>) as $item) {</div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    <span class="keywordflow">if</span> (array_key_exists($item, $xml)) {</div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;      $value = $xml-&gt;xpath($item);</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;      $project_info[$item] = (string)$value[0];</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;  $recommended_major = @$xml-&gt;xpath(<span class="stringliteral">&quot;/project/recommended_major&quot;</span>);</div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;  $recommended_major = empty($recommended_major)?<span class="stringliteral">&quot;&quot;</span>:(string)$recommended_major[0];</div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;  $supported_majors = @$xml-&gt;xpath(<span class="stringliteral">&quot;/project/supported_majors&quot;</span>);</div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;  $supported_majors = empty($supported_majors)?array():array_flip(explode(<span class="charliteral">&#39;,&#39;</span>, (<span class="keywordtype">string</span>)$supported_majors[0]));</div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;  $releases_xml = @$xml-&gt;xpath(<span class="stringliteral">&quot;/project/releases/release[status=&#39;published&#39;]&quot;</span>);</div>
<div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;  $recommended_version = NULL;</div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;  $latest_version = NULL;</div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;  $releases = array();</div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;  <span class="keywordflow">foreach</span> ($releases_xml as $release) {</div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;    $release_info = array();</div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;    <span class="keywordflow">foreach</span> (array(<span class="stringliteral">&#39;name&#39;</span>, <span class="stringliteral">&#39;version&#39;</span>, <span class="stringliteral">&#39;tag&#39;</span>, <span class="stringliteral">&#39;version_major&#39;</span>, <span class="stringliteral">&#39;version_extra&#39;</span>, <span class="stringliteral">&#39;status&#39;</span>, <span class="stringliteral">&#39;release_link&#39;</span>, <span class="stringliteral">&#39;download_link&#39;</span>, <span class="stringliteral">&#39;date&#39;</span>, <span class="stringliteral">&#39;mdhash&#39;</span>, <span class="stringliteral">&#39;filesize&#39;</span>) as $item) {</div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;      <span class="keywordflow">if</span> (array_key_exists($item, $release)) {</div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;        $value = $release-&gt;xpath($item);</div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;        $release_info[$item] = (string)$value[0];</div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;      }</div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;    }</div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    $statuses = array();</div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    <span class="keywordflow">if</span> (array_key_exists($release_info[<span class="stringliteral">&#39;version_major&#39;</span>], $supported_majors)) {</div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;      $statuses[] = <span class="stringliteral">&quot;Supported&quot;</span>;</div>
<div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;      unset($supported_majors[$release_info[<span class="stringliteral">&#39;version_major&#39;</span>]]);</div>
<div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    }</div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    <span class="keywordflow">if</span> ($release_info[<span class="stringliteral">&#39;version_major&#39;</span>] == $recommended_major) {</div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;      <span class="keywordflow">if</span> (!isset($latest_version)) {</div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;        $latest_version = $release_info[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;      }</div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;      <span class="comment">// The first stable version (no &#39;version extra&#39;) in the recommended major</span></div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;      <span class="comment">// is the recommended release</span></div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;      <span class="keywordflow">if</span> (empty($release_info[<span class="stringliteral">&#39;version_extra&#39;</span>]) &amp;&amp; (!isset($recommended_version))) {</div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;        $statuses[] = <span class="stringliteral">&quot;Recommended&quot;</span>;</div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;        $recommended_version = $release_info[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;      }</div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    }</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    <span class="keywordflow">if</span> (!empty($release_info[<span class="stringliteral">&#39;version_extra&#39;</span>]) &amp;&amp; ($release_info[<span class="stringliteral">&#39;version_extra&#39;</span>] == <span class="stringliteral">&quot;dev&quot;</span>)) {</div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;      $statuses[] = <span class="stringliteral">&quot;Development&quot;</span>;</div>
<div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;    }</div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    <span class="keywordflow">foreach</span> ($release-&gt;xpath(<span class="stringliteral">&#39;terms/term/value&#39;</span>) as $release_type) {</div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;      <span class="comment">// There are three kinds of release types that we recognize:</span></div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;      <span class="comment">// &quot;Bug fixes&quot;, &quot;New features&quot; and &quot;Security update&quot;.</span></div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;      <span class="comment">// We will add &quot;Security&quot; for security updates, and nothing</span></div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;      <span class="comment">// for the other kinds.</span></div>
<div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;      <span class="keywordflow">if</span> (strpos($release_type, <span class="stringliteral">&quot;Security&quot;</span>) !== FALSE) {</div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;        $statuses[] = <span class="stringliteral">&quot;Security&quot;</span>;</div>
<div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;      }</div>
<div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    }</div>
<div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;    <span class="comment">// Add to status whether the project is installed.</span></div>
<div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    <span class="keywordflow">if</span> (isset($installed_projects[$project])) {</div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;      <span class="keywordflow">if</span> ($installed_projects[$project][<span class="stringliteral">&#39;version&#39;</span>] == $release_info[<span class="stringliteral">&#39;version&#39;</span>]) {</div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;         $statuses[] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Installed&#39;</span>);</div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;         $project_info[<span class="stringliteral">&#39;installed&#39;</span>] = $release_info[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;       }</div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    }</div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;    $release_info[<span class="stringliteral">&#39;release_status&#39;</span>] = $statuses;</div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    $releases[$release_info[<span class="stringliteral">&#39;version&#39;</span>]] = $release_info;</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;  <span class="comment">// If there is no -stable- release in the recommended major,</span></div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;  <span class="comment">// then take the latest verion in the recommended major to be</span></div>
<div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;  <span class="comment">// the recommended release.</span></div>
<div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;  <span class="keywordflow">if</span> (!isset($recommended_version) &amp;&amp; isset($latest_version)) {</div>
<div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    $recommended_version = $latest_version;</div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    $releases[$recommended_version][<span class="stringliteral">&#39;release_status&#39;</span>][] = <span class="stringliteral">&quot;Recommended&quot;</span>;</div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;  }</div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;</div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;  $project_info[<span class="stringliteral">&#39;releases&#39;</span>] = $releases;</div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;  $project_info[<span class="stringliteral">&#39;recommended&#39;</span>] = $recommended_version;</div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;</div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;  <span class="keywordflow">return</span> $project_info;</div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;}</div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;<span class="comment"> * Determine a project type from its update service xml.</span></div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00586"></a><span class="lineno"><a class="code" href="updatexml_8inc.html#ae556ea1b63e6891e533346ac95941058">  586</a></span>&#160;<span class="keyword">function</span> <a class="code" href="updatexml_8inc.html#ae556ea1b63e6891e533346ac95941058">updatexml_determine_project_type</a>($xml) {</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;  $project_types = array(</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    <span class="stringliteral">&#39;core&#39;</span> =&gt; <span class="stringliteral">&#39;project_core&#39;</span>,</div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    <span class="stringliteral">&#39;profile&#39;</span> =&gt; <span class="stringliteral">&#39;project_distribution&#39;</span>,</div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    <span class="stringliteral">&#39;module&#39;</span> =&gt; <span class="stringliteral">&#39;project_module&#39;</span>,</div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    <span class="stringliteral">&#39;theme&#39;</span> =&gt; <span class="stringliteral">&#39;project_theme&#39;</span>,</div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    <span class="stringliteral">&#39;theme engine&#39;</span> =&gt; <span class="stringliteral">&#39;project_theme_engine&#39;</span>,</div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    <span class="stringliteral">&#39;translation&#39;</span> =&gt; <span class="stringliteral">&#39;project_translation&#39;</span></div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;  );</div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;</div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;  $type = (string)$xml-&gt;type;</div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;  <span class="comment">// Probably unused but kept for possible legacy compat.</span></div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;  $type = ($type == <span class="stringliteral">&#39;profile-legacy&#39;</span>) ? <span class="stringliteral">&#39;profile&#39;</span> : $type;</div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;  $type = array_search($type, $project_types);</div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;  <span class="keywordflow">return</span> $type;</div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;}</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</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>