Ver código fonte

Prioritize repository over package versions in the default policy, fixes #3509

Jordi Boggiano 10 anos atrás
pai
commit
d6620195e5

+ 7 - 7
doc/dev/DefaultPolicy.md

@@ -12,6 +12,13 @@ resulting order in which the solver will try to install them.
 
 
 The rules are to be applied in the order of these descriptions.
 The rules are to be applied in the order of these descriptions.
 
 
+### Repository priorities
+
+Packages Repo1.Av1, Repo2.Av1
+
+* priority(Repo1) >= priority(Repo2) => (Repo1.Av1, Repo2.Av1)
+* priority(Repo1) <  priority(Repo2) => (Repo2.Av1, Repo1.Av1)
+
 ### Package versions
 ### Package versions
 
 
 Packages: Av1, Av2, Av3
 Packages: Av1, Av2, Av3
@@ -22,13 +29,6 @@ Request: install A
 
 
 * (Av3)
 * (Av3)
 
 
-### Repository priorities
-
-Packages Repo1.Av1, Repo2.Av1
-
-* priority(Repo1) >= priority(Repo2) => (Repo1.Av1, Repo2.Av1)
-* priority(Repo1) <  priority(Repo2) => (Repo2.Av1, Repo1.Av1)
-
 ### Virtual Packages (provides)
 ### Virtual Packages (provides)
 
 
 Packages Av1, Bv1
 Packages Av1, Bv1

+ 2 - 2
src/Composer/DependencyResolver/DefaultPolicy.php

@@ -82,10 +82,10 @@ class DefaultPolicy implements PolicyInterface
         }
         }
 
 
         foreach ($packages as &$literals) {
         foreach ($packages as &$literals) {
-            $literals = $this->pruneToBestVersion($pool, $literals);
-
             $literals = $this->pruneToHighestPriorityOrInstalled($pool, $installedMap, $literals);
             $literals = $this->pruneToHighestPriorityOrInstalled($pool, $installedMap, $literals);
 
 
+            $literals = $this->pruneToBestVersion($pool, $literals);
+
             $literals = $this->pruneRemoteAliases($pool, $literals);
             $literals = $this->pruneRemoteAliases($pool, $literals);
         }
         }
 
 

+ 30 - 0
tests/Composer/Test/Fixtures/installer/install-prefers-repos-over-package-versions.test

@@ -0,0 +1,30 @@
+--TEST--
+Install prefers higher priority repositories over higher priority package versions
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                { "name": "a/a", "version": "1.0.0" }
+            ]
+        },
+        {
+            "type": "package",
+            "package": [
+                { "name": "a/a", "version": "1.1.0" },
+                { "name": "b/b", "version": "1.1.0" },
+                { "name": "b/b", "version": "1.0.0" }
+            ]
+        }
+    ],
+    "require": {
+        "a/a": "*",
+        "b/b": "*"
+    }
+}
+--RUN--
+install
+--EXPECT--
+Installing a/a (1.0.0)
+Installing b/b (1.1.0)