1
0
Fork 0
mirror of https://github.com/composer/composer synced 2025-05-11 01:22:54 +00:00

Add a new RepositorySet class and restrict pool usage to the solver

Breaking change for the plugin interface so bumping the version of
composer-plugin-api to 2.0.0

First step for a refactoring of the package metadata loading mechanism
This commit is contained in:
Nils Adermann 2018-09-10 15:23:40 +02:00
parent 92dc2cd9ad
commit 6ef65e5319
24 changed files with 265 additions and 198 deletions

View file

@ -29,6 +29,7 @@ use Composer\Repository\CompositeRepository;
use Composer\Repository\PlatformRepository;
use Composer\Repository\RepositoryFactory;
use Composer\Repository\RepositoryInterface;
use Composer\Repository\RepositorySet;
use Composer\Semver\Constraint\ConstraintInterface;
use Composer\Semver\Semver;
use Composer\Spdx\SpdxLicenses;
@ -52,8 +53,8 @@ class ShowCommand extends BaseCommand
protected $versionParser;
protected $colors;
/** @var Pool */
private $pool;
/** @var RepositorySet */
private $repositorySet;
protected function configure()
{
@ -523,19 +524,13 @@ EOT
$constraint = is_string($version) ? $this->versionParser->parseConstraints($version) : $version;
$policy = new DefaultPolicy();
$pool = new Pool('dev');
$pool->addRepository($repos);
$repositorySet = new RepositorySet(new Pool('dev'));
$repositorySet->addRepository($repos);
$matchedPackage = null;
$versions = array();
$matches = $pool->whatProvides($name, $constraint);
$matches = $repositorySet->findPackages($name, $constraint);
foreach ($matches as $index => $package) {
// skip providers/replacers
if ($package->getName() !== $name) {
unset($matches[$index]);
continue;
}
// select an exact match if it is in the installed repo and no specific version was required
if (null === $version && $installedRepo->hasPackage($package)) {
$matchedPackage = $package;
@ -546,8 +541,8 @@ EOT
}
// select preferred package according to policy rules
if (!$matchedPackage && $matches && $preferred = $policy->selectPreferredPackages($pool, array(), $matches)) {
$matchedPackage = $pool->literalToPackage($preferred[0]);
if (!$matchedPackage && $matches && $preferred = $policy->selectPreferredPackages($repositorySet->getPoolTemp(), array(), $matches)) { // TODO get rid of the pool call
$matchedPackage = $repositorySet->getPoolTemp()->literalToPackage($preferred[0]);
}
return array($matchedPackage, $versions);
@ -961,9 +956,9 @@ EOT
*/
private function findLatestPackage(PackageInterface $package, Composer $composer, $phpVersion, $minorOnly = false)
{
// find the latest version allowed in this pool
// find the latest version allowed in this repo set
$name = $package->getName();
$versionSelector = new VersionSelector($this->getPool($composer));
$versionSelector = new VersionSelector($this->getRepositorySet($composer));
$stability = $composer->getPackage()->getMinimumStability();
$flags = $composer->getPackage()->getStabilityFlags();
if (isset($flags[$name])) {
@ -987,13 +982,13 @@ EOT
return $versionSelector->findBestCandidate($name, $targetVersion, $phpVersion, $bestStability);
}
private function getPool(Composer $composer)
private function getRepositorySet(Composer $composer)
{
if (!$this->pool) {
$this->pool = new Pool($composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags());
$this->pool->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories()));
if (!$this->repositorySet) {
$this->repositorySet = new RepositorySet(new Pool($composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags()));
$this->repositorySet->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories()));
}
return $this->pool;
return $this->repositorySet;
}
}