Commit: b7231b60cdd3d1bbf03621216b889d19995756a4 Author: zrhoffman <z...@zrhoffman.net> Wed, 31 Oct 2018 23:07:18 -0500 Committer: Peter Kokot <peterko...@gmail.com> Sat, 17 Nov 2018 06:20:55 +0100 Parents: dfadd340848dc4f26f2216438c542e7b0b9ad5bf Branches: master
Link: http://git.php.net/?p=web/php.git;a=commitdiff;h=b7231b60cdd3d1bbf03621216b889d19995756a4 Log: Fix #72707: Filter releases by minor version - Rewrite version-specific part of releases API to loop over releases only once - Releases API: filter by minor or patch version, if provided - Remove unused variable - Rewrite version_array() to use array_pad(). Intended behavior: - If count($versionArray) is less than $length, version_array() should pad it with 0s to $length. - If count($versionArray) is greater than $length, version_array() should slice it to $length. - If $length is not set, leave $versionArray as-is after exploding it. - Remove unused variable - Still print "Unknown version" if the major version is found but the minor or patch version is not. - Remove excess white space - Bind array_replace_recursive() result to new variable instead of mutating $RELEASES global - Only set $machineReadable to its first element if $machineReadable is not empty. Bugs: https://bugs.php.net/72707 Changed paths: M include/branches.inc M releases/index.php Diff: diff --git a/include/branches.inc b/include/branches.inc index c7f685b..2445f86 100644 --- a/include/branches.inc +++ b/include/branches.inc @@ -330,3 +330,48 @@ function get_branch_support_state($branch) { return null; } + +function compare_version($arrayA, $versionB) +{ + static $sortValues = array( + true => 1, + false => -1, + ); + + $length = count($arrayA); + $arrayB = version_array($versionB, $length); + + if (!is_array($arrayA) || !is_array($arrayB)) { + return $sortValues[$arrayA > $arrayB]; + } + + foreach ($arrayA as $index => $componentA) { + $componentA = $arrayA[$index]; + $componentB = $arrayB[$index]; + if ($componentA != $componentB) { + return $sortValues[$componentA > $componentB]; + } + } + + return 0; +} + +function version_array($version, $length = null) +{ + $versionArray = array_map( + 'intval', + explode('.', $version) + ); + + if (is_int($length)) { + $versionArray = count($versionArray) < $length + ? array_pad($versionArray, $length, 0) + : array_slice( + $versionArray, + 0, + $length + ); + } + + return $versionArray; +} diff --git a/releases/index.php b/releases/index.php index dc9c96c..bb4531d 100644 --- a/releases/index.php +++ b/releases/index.php @@ -10,42 +10,47 @@ if (isset($_GET["serialize"]) || isset($_GET["json"])) { $machineReadable = array(); if (isset($_GET["version"])) { - $ver = (int)$_GET["version"]; + $versionArray = version_array($_GET["version"]); + $ver = $versionArray[0]; if (isset($RELEASES[$ver])) { - list($version, $r) = each($RELEASES[$ver]); + $combinedReleases = array_replace_recursive($RELEASES, $OLDRELEASES); if (isset($_GET["max"])) { $max = (int)$_GET["max"]; - if ($max == -1) { $max = PHP_INT_MAX; } - - $machineReadable = array($version => $r); + $maxSet = true; + } else { + $max = 1; + $maxSet = false; + } - $count = 1; + if ($max == -1) { + $max = PHP_INT_MAX; + } - /* check if other $RELEASES[$ver] are there */ - /* e.g., 5_3, 5_4, and 5_5 all exist and have a release */ - while(($z = each($RELEASES[$ver])) && $count++ < $max) { - $machineReadable[$z[0]] = $z[1]; + $count = 0; + foreach ($combinedReleases[$ver] as $version => $release) { + if ($max <= $count) { + break; } - foreach($OLDRELEASES[$ver] as $version => $release) { - if ($max <= $count++) { - break; - } - + if (compare_version($versionArray, $version) == 0) { $machineReadable[$version] = $release; + $count++; } - } else { - $r["version"] = $version; + } - $machineReadable = $r; + if (!$maxSet && !empty($machineReadable)) { + $version = key($machineReadable); + $machineReadable = current($machineReadable); + $machineReadable["version"] = $version; } - } else { + } + + if (empty($machineReadable)) { $machineReadable = array("error" => "Unknown version"); } } else { - $machineReadable = array(); foreach($RELEASES as $major => $release) { list($version, $r) = each($release); $r["version"] = $version; -- PHP Webmaster List Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php