Browse Source

Merge pull request #808 from palex-fpt/not-equal-operator

Add '<>' operator to Version Parser
Jordi Boggiano 12 years ago
parent
commit
4fcc114f97

+ 16 - 0
src/Composer/Package/LinkConstraint/VersionConstraint.php

@@ -36,6 +36,10 @@ class VersionConstraint extends SpecificConstraint
             $operator = '==';
         }
 
+        if ('<>' === $operator) {
+            $operator = '!=';
+        }
+
         $this->operator = $operator;
         $this->version = $version;
     }
@@ -49,6 +53,18 @@ class VersionConstraint extends SpecificConstraint
         $noEqualOp = str_replace('=', '', $this->operator);
         $providerNoEqualOp = str_replace('=', '', $provider->operator);
 
+        $isEqualOp = '==' === $this->operator;
+        $isNonEqualOp = '!=' === $this->operator;
+        $isProviderEqualOp = '==' === $provider->operator;
+        $isProviderNonEqualOp = '!=' === $provider->operator;
+
+        // '!=' operator is match when other operator is not '==' operator or version is not match
+        // these kinds of comparisons always have a solution
+        if ($isNonEqualOp || $isProviderNonEqualOp) {
+            return !$isEqualOp && !$isProviderEqualOp
+                || version_compare($provider->version, $this->version, '!=');
+        }
+
         // an example for the condition is <= 2.0 & < 1.0
         // these kinds of comparisons always have a solution
         if ($this->operator != '==' && $noEqualOp == $providerNoEqualOp) {

+ 1 - 1
src/Composer/Package/Version/VersionParser.php

@@ -233,7 +233,7 @@ class VersionParser
         }
 
         // match operators constraints
-        if (preg_match('{^(>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
+        if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
             try {
                 $version = $this->normalize($matches[2]);
 

+ 24 - 0
tests/Composer/Test/DependencyResolver/SolverTest.php

@@ -115,6 +115,30 @@ class SolverTest extends TestCase
         ));
     }
 
+    public function testSolverInstallHonoursNotEqualOperator()
+    {
+        $this->repo->addPackage($packageA = $this->getPackage('A', '1.0'));
+        $this->repo->addPackage($packageB = $this->getPackage('B', '1.0'));
+        $this->repo->addPackage($newPackageB11 = $this->getPackage('B', '1.1'));
+        $this->repo->addPackage($newPackageB12 = $this->getPackage('B', '1.2'));
+        $this->repo->addPackage($newPackageB13 = $this->getPackage('B', '1.3'));
+
+        $packageA->setRequires(array(
+            new Link('A', 'B', $this->getVersionConstraint('<=', '1.3'), 'requires'),
+            new Link('A', 'B', $this->getVersionConstraint('<>', '1.3'), 'requires'),
+            new Link('A', 'B', $this->getVersionConstraint('!=', '1.2'), 'requires'),
+        ));
+
+        $this->reposComplete();
+
+        $this->request->install('A');
+
+        $this->checkSolverResult(array(
+            array('job' => 'install', 'package' => $newPackageB11),
+            array('job' => 'install', 'package' => $packageA),
+        ));
+    }
+
     public function testSolverInstallWithDepsInOrder()
     {
         $this->repo->addPackage($packageA = $this->getPackage('A', '1.0'));

+ 8 - 0
tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php

@@ -27,6 +27,12 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase
             array('<=', '2', '>=', '1'),
             array('>=', '1', '<=', '2'),
             array('==', '2', '>=', '2'),
+            array('!=', '1', '!=', '1'),
+            array('!=', '1', '==', '2'),
+            array('!=', '1', '<',  '1'),
+            array('!=', '1', '<=', '1'),
+            array('!=', '1', '>',  '1'),
+            array('!=', '1', '>=', '1'),
         );
     }
 
@@ -53,6 +59,8 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase
             array('<=', '1', '>=', '2'),
             array('>=', '2', '<=', '1'),
             array('==', '2', '<', '2'),
+            array('!=', '1', '==', '1'),
+            array('==', '1', '!=', '1'),
         );
     }
 

+ 2 - 0
tests/Composer/Test/Package/Version/VersionParserTest.php

@@ -143,6 +143,8 @@ class VersionParserTest extends \PHPUnit_Framework_TestCase
             'match any/2'       => array('*.*',         new MultiConstraint(array())),
             'match any/3'       => array('*.x.*',       new MultiConstraint(array())),
             'match any/4'       => array('x.x.x.*',     new MultiConstraint(array())),
+            'not equal'         => array('<>1.0.0',     new VersionConstraint('<>', '1.0.0.0')),
+            'not equal/2'       => array('!=1.0.0',     new VersionConstraint('!=', '1.0.0.0')),
             'greater than'      => array('>1.0.0',      new VersionConstraint('>', '1.0.0.0')),
             'lesser than'       => array('<1.2.3.4',    new VersionConstraint('<', '1.2.3.4')),
             'less/eq than'      => array('<=1.2.3',     new VersionConstraint('<=', '1.2.3.0')),