1
0
Fork 0

Make sure the default branch alias is never used as a constraint by the VersionSelector

pull/9532/head
Jordi Boggiano 2020-11-26 14:24:16 +01:00
parent d00edab884
commit 62bd81bf7a
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC
3 changed files with 37 additions and 4 deletions

View File

@ -346,7 +346,11 @@ class ArrayLoader implements LoaderInterface
}
// normalize without -dev and ensure it's a numeric branch that is parseable
$validatedTargetBranch = $this->versionParser->normalizeBranch(substr($targetBranch, 0, -4));
if ($targetBranch === VersionParser::DEFAULT_BRANCH_ALIAS) {
$validatedTargetBranch = VersionParser::DEFAULT_BRANCH_ALIAS;
} else {
$validatedTargetBranch = $this->versionParser->normalizeBranch(substr($targetBranch, 0, -4));
}
if ('-dev' !== substr($validatedTargetBranch, -4)) {
continue;
}

View File

@ -13,6 +13,7 @@
namespace Composer\Package\Version;
use Composer\Package\BasePackage;
use Composer\Package\AliasPackage;
use Composer\Package\PackageInterface;
use Composer\Composer;
use Composer\Package\Loader\ArrayLoader;
@ -127,11 +128,16 @@ class VersionSelector
}
}
// if we end up with 9999999-dev as selected package, make sure we use the original version instead of the alias
if ($package instanceof AliasPackage && $package->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) {
$package = $package->getAliasOf();
}
return $package;
}
/**
* Given a concrete version, this returns a ~ constraint (when possible)
* Given a concrete version, this returns a ^ constraint (when possible)
* that should be used, for example, in composer.json.
*
* For example:
@ -155,7 +161,7 @@ class VersionSelector
$loader = new ArrayLoader($this->getParser());
$dumper = new ArrayDumper();
$extra = $loader->getBranchAlias($dumper->dump($package));
if ($extra) {
if ($extra && $extra !== VersionParser::DEFAULT_BRANCH_ALIAS) {
$extra = preg_replace('{^(\d+\.\d+\.\d+)(\.9999999)-dev$}', '$1.0', $extra, -1, $count);
if ($count) {
$extra = str_replace('.9999999', '.0', $extra);

View File

@ -15,8 +15,9 @@ namespace Composer\Test\Package\Version;
use Composer\Package\Version\VersionSelector;
use Composer\Package\Package;
use Composer\Package\Link;
use Composer\Package\AliasPackage;
use Composer\Repository\PlatformRepository;
use Composer\Semver\VersionParser;
use Composer\Package\Version\VersionParser;
use Composer\Test\TestCase;
class VersionSelectorTest extends TestCase
@ -233,6 +234,27 @@ class VersionSelectorTest extends TestCase
$this->assertSame($package2, $best, 'Latest version should be returned (1.1.0-beta)');
}
public function testDefaultBranchAliasIsNeverReturned()
{
$packageName = 'foobar';
$package = $this->createPackage('1.1.0-beta');
$package2 = $this->createPackage('dev-main');
$package2Alias = new AliasPackage($package2, VersionParser::DEFAULT_BRANCH_ALIAS, VersionParser::DEFAULT_BRANCH_ALIAS);
$packages = array($package, $package2Alias);
$repositorySet = $this->createMockRepositorySet();
$repositorySet->expects($this->once())
->method('findPackages')
->with($packageName, null)
->will($this->returnValue($packages));
$versionSelector = new VersionSelector($repositorySet);
$best = $versionSelector->findBestCandidate($packageName, null, 'dev');
$this->assertSame($package2, $best, 'Latest version should be returned (dev-main)');
}
public function testFalseReturnedOnNoPackages()
{
$repositorySet = $this->createMockRepositorySet();
@ -316,6 +338,7 @@ class VersionSelectorTest extends TestCase
array('dev-master', true, 'dev', '^2.0@dev', '2.x-dev'),
array('dev-master', true, 'dev', '^0.3.0@dev', '0.3.x-dev'),
array('dev-master', true, 'dev', '^0.0.3@dev', '0.0.3.x-dev'),
array('dev-master', true, 'dev', 'dev-master', VersionParser::DEFAULT_BRANCH_ALIAS),
// numeric alias
array('3.x-dev', true, 'dev', '^3.0@dev', '3.0.x-dev'),
array('3.x-dev', true, 'dev', '^3.0@dev', '3.0-dev'),