From 2f7130200adfe876e94884a524ae1cf61cd20e93 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 Jul 2012 20:25:22 +0200 Subject: [PATCH 1/3] Prevent seeing dev versions as equal when they are not, fixes #848 --- src/Composer/DependencyResolver/DefaultPolicy.php | 2 +- src/Composer/Package/LinkConstraint/VersionConstraint.php | 5 +++++ .../Test/Package/LinkConstraint/VersionConstraintTest.php | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Composer/DependencyResolver/DefaultPolicy.php b/src/Composer/DependencyResolver/DefaultPolicy.php index 108a8d44e..5d5e3653f 100644 --- a/src/Composer/DependencyResolver/DefaultPolicy.php +++ b/src/Composer/DependencyResolver/DefaultPolicy.php @@ -49,7 +49,7 @@ class DefaultPolicy implements PolicyInterface public function selectPreferedPackages(Pool $pool, array $installedMap, array $literals) { - $packages = $this->groupLiteralsByNamePreferInstalled($pool,$installedMap, $literals); + $packages = $this->groupLiteralsByNamePreferInstalled($pool, $installedMap, $literals); foreach ($packages as &$literals) { $policy = $this; diff --git a/src/Composer/Package/LinkConstraint/VersionConstraint.php b/src/Composer/Package/LinkConstraint/VersionConstraint.php index e88c418b3..d4e0e257a 100644 --- a/src/Composer/Package/LinkConstraint/VersionConstraint.php +++ b/src/Composer/Package/LinkConstraint/VersionConstraint.php @@ -58,6 +58,11 @@ class VersionConstraint extends SpecificConstraint $isProviderEqualOp = '==' === $provider->operator; $isProviderNonEqualOp = '!=' === $provider->operator; + // dev- versions can not be compared with version_compare + if ('dev-' === substr($provider->version, 0, 4) && 'dev-' === substr($this->version, 0, 4)) { + return $isEqualOp && $isProviderEqualOp && $provider->version === $this->version ? true : false; + } + // '!=' 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) { diff --git a/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php b/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php index cdd6e67f5..55bceda2d 100644 --- a/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php +++ b/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php @@ -33,6 +33,7 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase array('!=', '1', '<=', '1'), array('!=', '1', '>', '1'), array('!=', '1', '>=', '1'), + array('==', 'dev-foo-bar', '==', 'dev-foo-bar'), ); } @@ -61,6 +62,7 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase array('==', '2', '<', '2'), array('!=', '1', '==', '1'), array('==', '1', '!=', '1'), + array('==', 'dev-foo-dist', '==', 'dev-foo-zist'), ); } From bbdbfc97ea0f4f7c0f7238151d2676882c561ff1 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Wed, 11 Jul 2012 20:36:44 +0200 Subject: [PATCH 2/3] Remove useless ternary operator --- src/Composer/Package/LinkConstraint/VersionConstraint.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Package/LinkConstraint/VersionConstraint.php b/src/Composer/Package/LinkConstraint/VersionConstraint.php index d4e0e257a..47d2e69cf 100644 --- a/src/Composer/Package/LinkConstraint/VersionConstraint.php +++ b/src/Composer/Package/LinkConstraint/VersionConstraint.php @@ -60,7 +60,7 @@ class VersionConstraint extends SpecificConstraint // dev- versions can not be compared with version_compare if ('dev-' === substr($provider->version, 0, 4) && 'dev-' === substr($this->version, 0, 4)) { - return $isEqualOp && $isProviderEqualOp && $provider->version === $this->version ? true : false; + return $isEqualOp && $isProviderEqualOp && $provider->version === $this->version; } // '!=' operator is match when other operator is not '==' operator or version is not match From 560c3254d47945e40b0d4dfbefdebd5e1ce67429 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Wed, 11 Jul 2012 20:48:57 +0200 Subject: [PATCH 3/3] Correctly treat dev versions for other types of comparisons and add tests --- .../LinkConstraint/VersionConstraint.php | 18 +++++++++++------- .../LinkConstraint/VersionConstraintTest.php | 9 +++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Composer/Package/LinkConstraint/VersionConstraint.php b/src/Composer/Package/LinkConstraint/VersionConstraint.php index 47d2e69cf..8eb69dfd3 100644 --- a/src/Composer/Package/LinkConstraint/VersionConstraint.php +++ b/src/Composer/Package/LinkConstraint/VersionConstraint.php @@ -44,6 +44,15 @@ class VersionConstraint extends SpecificConstraint $this->version = $version; } + public function versionCompare($a, $b, $operator) + { + if ('dev-' === substr($a, 0, 4) && 'dev-' === substr($b, 0, 4)) { + return $operator == '==' && $a === $b; + } + + return version_compare($a, $b, $operator); + } + /** * * @param VersionConstraint $provider @@ -58,16 +67,11 @@ class VersionConstraint extends SpecificConstraint $isProviderEqualOp = '==' === $provider->operator; $isProviderNonEqualOp = '!=' === $provider->operator; - // dev- versions can not be compared with version_compare - if ('dev-' === substr($provider->version, 0, 4) && 'dev-' === substr($this->version, 0, 4)) { - return $isEqualOp && $isProviderEqualOp && $provider->version === $this->version; - } - // '!=' 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, '!='); + || $this->versionCompare($provider->version, $this->version, '!='); } // an example for the condition is <= 2.0 & < 1.0 @@ -76,7 +80,7 @@ class VersionConstraint extends SpecificConstraint return true; } - if (version_compare($provider->version, $this->version, $this->operator)) { + if ($this->versionCompare($provider->version, $this->version, $this->operator)) { // special case, e.g. require >= 1.0 and provide < 1.0 // 1.0 >= 1.0 but 1.0 is outside of the provided interval if ($provider->version == $this->version && $provider->operator == $providerNoEqualOp && $this->operator != $noEqualOp) { diff --git a/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php b/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php index 55bceda2d..eb6663822 100644 --- a/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php +++ b/tests/Composer/Test/Package/LinkConstraint/VersionConstraintTest.php @@ -34,6 +34,12 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase array('!=', '1', '>', '1'), array('!=', '1', '>=', '1'), array('==', 'dev-foo-bar', '==', 'dev-foo-bar'), + array('==', 'dev-foo-xyz', '==', 'dev-foo-xyz'), + array('>=', 'dev-foo-bar', '>=', 'dev-foo-xyz'), + array('<=', 'dev-foo-bar', '<', 'dev-foo-xyz'), + array('!=', 'dev-foo-bar', '<', 'dev-foo-xyz'), + array('>=', 'dev-foo-bar', '!=', 'dev-foo-bar'), + array('!=', 'dev-foo-bar', '!=', 'dev-foo-xyz'), ); } @@ -63,6 +69,9 @@ class VersionConstraintTest extends \PHPUnit_Framework_TestCase array('!=', '1', '==', '1'), array('==', '1', '!=', '1'), array('==', 'dev-foo-dist', '==', 'dev-foo-zist'), + array('==', 'dev-foo-bist', '==', 'dev-foo-aist'), + array('<=', 'dev-foo-bist', '>=', 'dev-foo-aist'), + array('>=', 'dev-foo-bist', '<', 'dev-foo-aist'), ); }