Эх сурвалжийг харах

Ensure multi conflict rules are only used for 3+ literals

Implements the equals method correctly on multi conflict rules. If there
are fewer literals a regular Rule2Literals is enough to represent the
basic conflict rule.
Nils Adermann 5 жил өмнө
parent
commit
dc0f2e7e46

+ 8 - 1
src/Composer/DependencyResolver/MultiConflictRule.php

@@ -34,6 +34,10 @@ class MultiConflictRule extends Rule
     {
         parent::__construct($reason, $reasonData, $job);
 
+        if (count($literals) < 3) {
+            throw new \RuntimeException("multi conflict rule requires at least 3 literals");
+        }
+
         // sort all packages ascending by id
         sort($literals);
 
@@ -62,7 +66,10 @@ class MultiConflictRule extends Rule
      */
     public function equals(Rule $rule)
     {
-        return $this->literals === $rule->getLiterals();
+        if ($rule instanceof MultiConflictRule) {
+            return $this->literals === $rule->getLiterals();
+        }
+        return false;
     }
 
     public function isAssertion()

+ 4 - 0
src/Composer/DependencyResolver/RuleSetGenerator.php

@@ -136,6 +136,10 @@ class RuleSetGenerator
             $literals[] = -$package->id;
         }
 
+        if (count($literals) == 2) {
+            return new Rule2Literals($literals[0], $literals[1], $reason, $reasonData);
+        }
+
         return new MultiConflictRule($literals, $reason, $reasonData);
     }