com web/php: Fix #72707: Filter releases by minor version: include/branches.inc releases/index.php
| From: | Peter Kokot | Date: | Sat, 17 Nov 2018 05:20:55 +0000 |
| Subject: | com web/php: Fix #72707: Filter releases by minor version: include/branches.inc releases/index.php | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-27438@lists.php.net to get a copy of this message | ||
Commit: b7231b60cdd3d1bbf03621216b889d19995756a4
Author: zrhoffman <zach@zrhoffman.net> Wed, 31 Oct 2018 23:07:18 -0500
Committer: Peter Kokot <peterkokot@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;