1
0
Fork 0
mirror of https://github.com/composer/composer synced 2025-05-10 09:02:59 +00:00

Move construction of pool from repo set into a pool builder

Pool construction depends on the install request now, so only required
packages get loaded, add some structure for future asynchronously
loading composer repositories
This commit is contained in:
Nils Adermann 2018-09-12 11:49:09 +02:00
parent 4c7d271a36
commit c0f19f6c57
20 changed files with 357 additions and 248 deletions

View file

@ -13,6 +13,8 @@
namespace Composer\Repository;
use Composer\DependencyResolver\Pool;
use Composer\DependencyResolver\PoolBuilder;
use Composer\DependencyResolver\Request;
use Composer\Package\BasePackage;
use Composer\Package\Version\VersionParser;
use Composer\Repository\CompositeRepository;
@ -31,9 +33,6 @@ class RepositorySet
/** @var RepositoryInterface[] */
private $repositories = array();
/** @var ComposerRepository[] */
private $providerRepos = array();
private $acceptableStabilities;
private $stabilityFlags;
protected $filterRequires;
@ -79,9 +78,6 @@ class RepositorySet
foreach ($repos as $repo) {
$this->repositories[] = $repo;
if ($repo instanceof ComposerRepository && $repo->hasProviders()) {
$this->providerRepos[] = $repo;
}
}
}
@ -133,20 +129,43 @@ class RepositorySet
return $candidates;
}
public function getPriority(RepositoryInterface $repo)
{
$priority = array_search($repo, $this->repositories, true);
if (false === $priority) {
throw new \RuntimeException("Could not determine repository priority. The repository was not registered in the pool.");
}
return -$priority;
}
/**
* Create a pool for dependency resolution from the packages in this repository set.
*
* @return Pool
*/
public function createPool()
public function createPool(Request $request)
{
$this->pool = new Pool($this->acceptableStabilities, $this->stabilityFlags, $this->filterRequires);
$poolBuilder = new PoolBuilder(array($this, 'isPackageAcceptable'), $this->filterRequires);
foreach ($this->repositories as $repository) {
$this->pool->addRepository($repository, $this->rootAliases);
return $this->pool = $poolBuilder->buildPool($this->repositories, $this->rootAliases, $request);
}
// TODO unify this with above in some simpler version without "request"?
public function createPoolForPackage($packageName)
{
return $this->createPoolForPackages(array($packageName));
}
public function createPoolForPackages($packageNames)
{
$request = new Request();
foreach ($packageNames as $packageName) {
$request->install($packageName);
}
return $this->pool;
return $this->createPool($request);
}
/**