From 099741a4a8deb33b23bc7cefbf233793ba687bd5 Mon Sep 17 00:00:00 2001 From: Marton Kiss Date: Sun, 2 Nov 2014 15:20:48 +0100 Subject: [PATCH] Fix release manifest element order issue Production releases must be insterted into first position of releases element in the manifest xml. This bug prevented the proper execution of drush dl tool, and failed to update the site to the latest version. Change-Id: I1d913c3ca90e00d6f9801ca2e0039df29730603e --- scripts/release-manifest.php | 61 ++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/scripts/release-manifest.php b/scripts/release-manifest.php index 5c2a245..43b8248 100755 --- a/scripts/release-manifest.php +++ b/scripts/release-manifest.php @@ -100,6 +100,65 @@ function write_log($type, $message) { echo sprintf("%s [%s] %s\n", date('c'), $type, $message); } +/** + * Convert an array into SimpleXML recursively. + */ +function __append_elements($item, &$parent) { + foreach ($item as $k => $v) { + if (is_array($v)) { + $element = $parent->addChild($k); + __append_elements($v, $element); + } else { + $parent->addChild($k, $v); + } + } +} + +/** + * Convert a SimpleXML into an array recursively. + */ +function simple_xml_to_array($xml){ + $array = (array)$xml; + foreach ($array as $key => $value){ + if($value instanceof SimpleXMLElement) { + $array[$key] = simple_xml_to_array($value); + } else { + $array[$key] = $value; + } + } + return $array; +} + +/** + * Reorder release elements into a descending list by version_patch. + * Fix drush download issues. + */ +function order_release_elements($xml) { + $prod_releases = array(); + $dev_releases = array(); + $releases = $xml->xpath('releases/release'); + foreach ($releases as $i => $release) { + if (isset($release->version_patch)) { + $prod_releases[(int)$release->version_patch] = simple_xml_to_array($release); + } else { + $dev_releases[(string)$release->version_extra] = simple_xml_to_array($release); + } + } + unset($xml->releases); + $releases = $xml->addChild('releases'); + // reverse-order prod releases here + krsort($prod_releases); + foreach ($prod_releases as $item) { + $release = $releases->addChild('release'); + __append_elements($item, $release); + } + foreach ($dev_releases as $item) { + $release = $releases->addChild('release'); + __append_elements($item, $release); + } + return $xml; +} + /** * Validate and decode a Drupal format version string * into a key-value array. @@ -254,6 +313,8 @@ try { $xml = simplexml_load_string($manifest_template); } append_release($xml, $params['version'], $params['releasetar'], $params['md5']); + // reorder xml here + $xml = order_release_elements($xml); $xml_content = $xml->asXML(); write_log(_LOG_DEBUG_, sprintf("Generated manifest:\n %s", $xml_content)); file_put_contents($config['outfile'], $xml_content);