diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index 817d5ed48..8e225d803 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -71,11 +71,21 @@ class VersionSelector $candidatePriority = $candidate->getStabilityPriority(); $currentPriority = $package->getStabilityPriority(); - // candidate is less stable than our preferred stability, and we have a package that is more stable than it, so we skip it + // candidate is less stable than our preferred stability, + // and current package is more stable than candidate, skip it if ($minPriority < $candidatePriority && $currentPriority < $candidatePriority) { continue; } - // candidate is more stable than our preferred stability, and current package is less stable than preferred stability, then we select the candidate always + + // candidate is less stable than our preferred stability, + // and current package is less stable than candidate, select candidate + if ($minPriority < $candidatePriority && $candidatePriority < $currentPriority) { + $package = $candidate; + continue; + } + + // candidate is more stable than our preferred stability, + // and current package is less stable than preferred stability, select candidate if ($minPriority >= $candidatePriority && $minPriority < $currentPriority) { $package = $candidate; continue; diff --git a/tests/Composer/Test/Package/Version/VersionSelectorTest.php b/tests/Composer/Test/Package/Version/VersionSelectorTest.php index f8f292f3d..c28ac3c17 100644 --- a/tests/Composer/Test/Package/Version/VersionSelectorTest.php +++ b/tests/Composer/Test/Package/Version/VersionSelectorTest.php @@ -88,6 +88,33 @@ class VersionSelectorTest extends \PHPUnit_Framework_TestCase $this->assertSame($package1, $best, 'Latest most stable version should be returned (1.0.0)'); } + public function testMostStableVersionIsReturnedRegardlessOfOrder() + { + $packageName = 'foobar'; + + $package1 = $this->createPackage('2.x-dev'); + $package2 = $this->createPackage('2.0.0-beta3'); + $packages = array($package1, $package2); + + $pool = $this->createMockPool(); + $pool->expects($this->at(0)) + ->method('whatProvides') + ->with($packageName, null, true) + ->will($this->returnValue($packages)); + + $pool->expects($this->at(1)) + ->method('whatProvides') + ->with($packageName, null, true) + ->will($this->returnValue(array_reverse($packages))); + + $versionSelector = new VersionSelector($pool); + $best = $versionSelector->findBestCandidate($packageName, null, null); + $this->assertSame($package2, $best, 'Expecting 2.0.0-beta3, cause beta is more stable than dev'); + + $best = $versionSelector->findBestCandidate($packageName, null, null); + $this->assertSame($package2, $best, 'Expecting 2.0.0-beta3, cause beta is more stable than dev'); + } + public function testHighestVersionIsReturned() { $packageName = 'foobar';