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

Reply via email to