فهرست منبع

Fix parsing of inferred stability flags that are more stable than the min stability

Jordi Boggiano 12 سال پیش
والد
کامیت
d740f50277
2فایلهای تغییر یافته به همراه48 افزوده شده و 9 حذف شده
  1. 11 9
      src/Composer/Package/Loader/RootPackageLoader.php
  2. 37 0
      tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php

+ 11 - 9
src/Composer/Package/Loader/RootPackageLoader.php

@@ -70,6 +70,10 @@ class RootPackageLoader extends ArrayLoader
             $realPackage = $package->getAliasOf();
         }
 
+        if (isset($config['minimum-stability'])) {
+            $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability']));
+        }
+
         $aliases = array();
         $stabilityFlags = array();
         $references = array();
@@ -82,7 +86,7 @@ class RootPackageLoader extends ArrayLoader
                     $links[$link->getTarget()] = $link->getConstraint()->getPrettyString();
                 }
                 $aliases = $this->extractAliases($links, $aliases);
-                $stabilityFlags = $this->extractStabilityFlags($links, $stabilityFlags);
+                $stabilityFlags = $this->extractStabilityFlags($links, $stabilityFlags, $realPackage->getMinimumStability());
                 $references = $this->extractReferences($links, $references);
             }
         }
@@ -91,10 +95,6 @@ class RootPackageLoader extends ArrayLoader
         $realPackage->setStabilityFlags($stabilityFlags);
         $realPackage->setReferences($references);
 
-        if (isset($config['minimum-stability'])) {
-            $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability']));
-        }
-
         if (isset($config['prefer-stable'])) {
             $realPackage->setPreferStable((bool) $config['prefer-stable']);
         }
@@ -124,11 +124,12 @@ class RootPackageLoader extends ArrayLoader
         return $aliases;
     }
 
-    private function extractStabilityFlags(array $requires, array $stabilityFlags)
+    private function extractStabilityFlags(array $requires, array $stabilityFlags, $minimumStability)
     {
         $stabilities = BasePackage::$stabilities;
+        $minimumStability = $stabilities[$minimumStability];
         foreach ($requires as $reqName => $reqVersion) {
-            // parse explicit stability flags
+            // parse explicit stability flags to the most unstable
             if (preg_match('{^[^,\s]*?@('.implode('|', array_keys($stabilities)).')$}i', $reqVersion, $match)) {
                 $name = strtolower($reqName);
                 $stability = $stabilities[VersionParser::normalizeStability($match[1])];
@@ -141,12 +142,13 @@ class RootPackageLoader extends ArrayLoader
                 continue;
             }
 
-            // infer flags for requirements that have an explicit -dev or -beta version specified for example
+            // infer flags for requirements that have an explicit -dev or -beta version specified but only
+            // for those that are more unstable than the minimumStability or existing flags
             $reqVersion = preg_replace('{^([^,\s@]+) as .+$}', '$1', $reqVersion);
             if (preg_match('{^[^,\s@]+$}', $reqVersion) && 'stable' !== ($stabilityName = VersionParser::parseStability($reqVersion))) {
                 $name = strtolower($reqName);
                 $stability = $stabilities[$stabilityName];
-                if (isset($stabilityFlags[$name]) && $stabilityFlags[$name] > $stability) {
+                if ((isset($stabilityFlags[$name]) && $stabilityFlags[$name] > $stability) || ($minimumStability > $stability)) {
                     continue;
                 }
                 $stabilityFlags[$name] = $stability;

+ 37 - 0
tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php

@@ -14,6 +14,7 @@ namespace Composer\Test\Package\Loader;
 
 use Composer\Config;
 use Composer\Package\Loader\RootPackageLoader;
+use Composer\Package\BasePackage;
 use Composer\Test\Mock\ProcessExecutorMock;
 use Composer\Repository\RepositoryManager;
 
@@ -49,4 +50,40 @@ class RootPackageLoaderTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals("dev-$commitHash", $package->getVersion());
     }
+
+    protected function loadPackage($data)
+    {
+        $manager = $this->getMockBuilder('\\Composer\\Repository\\RepositoryManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $processExecutor = new ProcessExecutorMock(function($command, &$output = null, $cwd = null) {
+            return 1;
+        });
+
+        $config = new Config;
+        $config->merge(array('repositories' => array('packagist' => false)));
+
+        $loader = new RootPackageLoader($manager, $config);
+
+        return $loader->load($data);
+    }
+
+    public function testStabilityFlagsParsing()
+    {
+        $package = $this->loadPackage(array(
+            'require' => array(
+                'foo/bar' => '~2.1.0-beta2',
+                'bar/baz' => '1.0.x-dev as 1.2.0',
+                'qux/quux' => '1.0.*@rc',
+            ),
+            'minimum-stability' => 'alpha',
+        ));
+
+        $this->assertEquals('alpha', $package->getMinimumStability());
+        $this->assertEquals(array(
+            'bar/baz' => BasePackage::STABILITY_DEV,
+            'qux/quux' => BasePackage::STABILITY_RC,
+        ), $package->getStabilityFlags());
+    }
 }