1
0
Fork 0

Internalize pool creation in repository set, store root aliases in set

The pool is still exposed too early in a few places which will require
further refactoring
pull/7625/head
Nils Adermann 2018-09-11 13:33:29 +02:00
parent 6ef65e5319
commit 1228bcdffc
17 changed files with 248 additions and 133 deletions

View File

@ -12,7 +12,6 @@
namespace Composer\Command; namespace Composer\Command;
use Composer\DependencyResolver\Pool;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
@ -79,7 +78,7 @@ class BaseDependencyCommand extends BaseCommand
$composer->getRepositoryManager()->getLocalRepository(), $composer->getRepositoryManager()->getLocalRepository(),
new PlatformRepository(array(), $platformOverrides), new PlatformRepository(array(), $platformOverrides),
)); ));
$repositorySet = new RepositorySet(new Pool()); $repositorySet = new RepositorySet();
$repositorySet->addRepository($repository); $repositorySet->addRepository($repository);
// Parse package name and constraint // Parse package name and constraint

View File

@ -20,7 +20,6 @@ use Composer\Installer\InstallationManager;
use Composer\Installer\SuggestedPackagesReporter; use Composer\Installer\SuggestedPackagesReporter;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\DependencyResolver\Pool;
use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\InstallOperation;
use Composer\Package\Version\VersionSelector; use Composer\Package\Version\VersionSelector;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
@ -291,7 +290,7 @@ EOT
throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities))); throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities)));
} }
$repositorySet = new RepositorySet(new Pool($stability)); $repositorySet = new RepositorySet(array(), $stability);
$repositorySet->addRepository($sourceRepo); $repositorySet->addRepository($sourceRepo);
$phpVersion = null; $phpVersion = null;

View File

@ -12,7 +12,6 @@
namespace Composer\Command; namespace Composer\Command;
use Composer\DependencyResolver\Pool;
use Composer\Factory; use Composer\Factory;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
@ -643,7 +642,7 @@ EOT
$key = $minimumStability ?: 'default'; $key = $minimumStability ?: 'default';
if (!isset($this->repositorySets[$key])) { if (!isset($this->repositorySets[$key])) {
$this->repositorySets[$key] = $repositorySet = new RepositorySet(new Pool($minimumStability ?: $this->getMinimumStability($input))); $this->repositorySets[$key] = $repositorySet = new RepositorySet(array(), $minimumStability ?: $this->getMinimumStability($input));
$repositorySet->addRepository($this->getRepos()); $repositorySet->addRepository($this->getRepos());
} }

View File

@ -14,7 +14,6 @@ namespace Composer\Command;
use Composer\Composer; use Composer\Composer;
use Composer\DependencyResolver\DefaultPolicy; use Composer\DependencyResolver\DefaultPolicy;
use Composer\DependencyResolver\Pool;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\Package\CompletePackageInterface; use Composer\Package\CompletePackageInterface;
@ -524,7 +523,7 @@ EOT
$constraint = is_string($version) ? $this->versionParser->parseConstraints($version) : $version; $constraint = is_string($version) ? $this->versionParser->parseConstraints($version) : $version;
$policy = new DefaultPolicy(); $policy = new DefaultPolicy();
$repositorySet = new RepositorySet(new Pool('dev')); $repositorySet = new RepositorySet(array(), 'dev');
$repositorySet->addRepository($repos); $repositorySet->addRepository($repos);
$matchedPackage = null; $matchedPackage = null;
@ -985,7 +984,7 @@ EOT
private function getRepositorySet(Composer $composer) private function getRepositorySet(Composer $composer)
{ {
if (!$this->repositorySet) { if (!$this->repositorySet) {
$this->repositorySet = new RepositorySet(new Pool($composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags())); $this->repositorySet = new RepositorySet(array(), $composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags());
$this->repositorySet->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories())); $this->repositorySet->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories()));
} }

View File

@ -54,22 +54,12 @@ class Pool implements \Countable
protected $whitelist = null; protected $whitelist = null;
protected $id = 1; protected $id = 1;
public function __construct($minimumStability = 'stable', array $stabilityFlags = array(), array $filterRequires = array()) public function __construct(array $acceptableStabilities, array $stabilityFlags = array(), array $filterRequires = array())
{ {
$this->versionParser = new VersionParser; $this->acceptableStabilities = $acceptableStabilities;
$this->acceptableStabilities = array();
foreach (BasePackage::$stabilities as $stability => $value) {
if ($value <= BasePackage::$stabilities[$minimumStability]) {
$this->acceptableStabilities[$stability] = $value;
}
}
$this->stabilityFlags = $stabilityFlags; $this->stabilityFlags = $stabilityFlags;
$this->filterRequires = $filterRequires; $this->filterRequires = $filterRequires;
foreach ($filterRequires as $name => $constraint) { $this->versionParser = new VersionParser;
if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name)) {
unset($this->filterRequires[$name]);
}
}
} }
public function setWhitelist($whitelist) public function setWhitelist($whitelist)
@ -202,7 +192,7 @@ class Pool implements \Countable
$candidates = array(); $candidates = array();
foreach ($this->providerRepos as $repo) { foreach ($this->providerRepos as $repo) {
foreach ($repo->whatProvides($this, $name, $bypassFilters) as $candidate) { foreach ($repo->whatProvides($name, $bypassFilters, array($this, 'isPackageAcceptable')) as $candidate) {
$candidates[] = $candidate; $candidates[] = $candidate;
if ($candidate->id < 1) { if ($candidate->id < 1) {
$candidate->setId($this->id++); $candidate->setId($this->id++);

View File

@ -20,7 +20,6 @@ use Composer\DependencyResolver\Operation\UninstallOperation;
use Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation; use Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation;
use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\Operation\OperationInterface;
use Composer\DependencyResolver\PolicyInterface; use Composer\DependencyResolver\PolicyInterface;
use Composer\DependencyResolver\Pool;
use Composer\DependencyResolver\Request; use Composer\DependencyResolver\Request;
use Composer\DependencyResolver\Rule; use Composer\DependencyResolver\Rule;
use Composer\DependencyResolver\Solver; use Composer\DependencyResolver\Solver;
@ -371,19 +370,19 @@ class Installer
// creating repository set // creating repository set
$policy = $this->createPolicy(); $policy = $this->createPolicy();
$repositorySet = $this->createRepositorySet($this->update ? null : $lockedRepository); $repositorySet = $this->createRepositorySet($aliases, $this->update ? null : $lockedRepository);
$repositorySet->addRepository($installedRepo, $aliases); $repositorySet->addRepository($installedRepo);
if ($this->update) { if ($this->update) {
$repositories = $this->repositoryManager->getRepositories(); $repositories = $this->repositoryManager->getRepositories();
foreach ($repositories as $repository) { foreach ($repositories as $repository) {
$repositorySet->addRepository($repository, $aliases); $repositorySet->addRepository($repository);
} }
} }
// Add the locked repository after the others in case we are doing a // Add the locked repository after the others in case we are doing a
// partial update so missing packages can be found there still. // partial update so missing packages can be found there still.
// For installs from lock it's the only one added so it is first // For installs from lock it's the only one added so it is first
if ($lockedRepository) { if ($lockedRepository) {
$repositorySet->addRepository($lockedRepository, $aliases); $repositorySet->addRepository($lockedRepository);
} }
// creating requirements request // creating requirements request
@ -465,6 +464,8 @@ class Installer
} }
} }
$repositorySet->getPoolTemp(); // TODO remove this, but ensures ids are set before dev packages are processed in advance of solver
// force dev packages to have the latest links if we update or install from a (potentially new) lock // force dev packages to have the latest links if we update or install from a (potentially new) lock
$this->processDevPackages($localRepo, $repositorySet, $policy, $repositories, $installedRepo, $lockedRepository, 'force-links'); $this->processDevPackages($localRepo, $repositorySet, $policy, $repositories, $installedRepo, $lockedRepository, 'force-links');
@ -685,9 +686,9 @@ class Installer
unset($tempLocalRepo, $loader, $dumper); unset($tempLocalRepo, $loader, $dumper);
$policy = $this->createPolicy(); $policy = $this->createPolicy();
$repositorySet = $this->createRepositorySet(); $repositorySet = $this->createRepositorySet($aliases);
$installedRepo = $this->createInstalledRepo($localRepo, $platformRepo); $installedRepo = $this->createInstalledRepo($localRepo, $platformRepo);
$repositorySet->addRepository($installedRepo, $aliases); $repositorySet->addRepository($installedRepo);
// creating requirements request without dev requirements // creating requirements request without dev requirements
$request = $this->createRequest($this->package, $platformRepo); $request = $this->createRequest($this->package, $platformRepo);
@ -844,17 +845,12 @@ class Installer
return $installedRepo; return $installedRepo;
} }
private function createRepositorySet($lockedRepository = null)
{
$pool = $this->createPool($lockedRepository);
return new RepositorySet($pool);
}
/** /**
* @param RepositoryInterface|null $lockedRepository * @param array $rootAliases
* @return Pool * @param RepositoryInterface|null $lockedRepository
* @return RepositorySet
*/ */
private function createPool(RepositoryInterface $lockedRepository = null) private function createRepositorySet(array $rootAliases = array(), $lockedRepository = null)
{ {
if ($this->update) { if ($this->update) {
$minimumStability = $this->package->getMinimumStability(); $minimumStability = $this->package->getMinimumStability();
@ -886,7 +882,7 @@ class Installer
} }
} }
return new Pool($minimumStability, $stabilityFlags, $rootConstraints); return new RepositorySet($rootAliases, $minimumStability, $stabilityFlags, $rootConstraints);
} }
/** /**
@ -1319,7 +1315,7 @@ class Installer
} }
} }
$repositorySet = new RepositorySet(new Pool('dev')); $repositorySet = new RepositorySet(array(), 'dev');
$repositorySet->addRepository($localOrLockRepo); $repositorySet->addRepository($localOrLockRepo);
$seen = array(); $seen = array();
@ -1354,11 +1350,11 @@ class Installer
while (!$packageQueue->isEmpty()) { while (!$packageQueue->isEmpty()) {
$package = $packageQueue->dequeue(); $package = $packageQueue->dequeue();
if (isset($seen[$package->getId()])) { if (isset($seen[spl_object_hash($package)])) {
continue; continue;
} }
$seen[$package->getId()] = true; $seen[spl_object_hash($package)] = true;
$this->updateWhitelist[$package->getName()] = true; $this->updateWhitelist[$package->getName()] = true;
if (!$this->whitelistDependencies && !$this->whitelistAllDependencies) { if (!$this->whitelistDependencies && !$this->whitelistAllDependencies) {

View File

@ -23,7 +23,6 @@ use Composer\Package\PackageInterface;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Repository\RepositorySet; use Composer\Repository\RepositorySet;
use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\Constraint;
use Composer\DependencyResolver\Pool;
use Composer\Plugin\Capability\Capability; use Composer\Plugin\Capability\Capability;
/** /**
@ -158,7 +157,7 @@ class PluginManager
$localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
$globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null;
$repositorySet = new RepositorySet(new Pool('dev')); $repositorySet = new RepositorySet(array(), 'dev');
$repositorySet->addRepository($localRepo); $repositorySet->addRepository($localRepo);
if ($globalRepo) { if ($globalRepo) {
$repositorySet->addRepository($globalRepo); $repositorySet->addRepository($globalRepo);

View File

@ -16,7 +16,6 @@ use Composer\Package\Loader\ArrayLoader;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionParser;
use Composer\DependencyResolver\Pool;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\Cache; use Composer\Cache;
use Composer\Config; use Composer\Config;
@ -136,7 +135,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
foreach ($this->getProviderNames() as $providerName) { foreach ($this->getProviderNames() as $providerName) {
if ($name === $providerName) { if ($name === $providerName) {
$packages = $this->whatProvides(new Pool('dev'), $providerName); $packages = $this->whatProvides($providerName);
foreach ($packages as $package) { foreach ($packages as $package) {
if ($name === $package->getName()) { if ($name === $package->getName()) {
$pkgConstraint = new Constraint('==', $package->getVersion()); $pkgConstraint = new Constraint('==', $package->getVersion());
@ -170,7 +169,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
foreach ($this->getProviderNames() as $providerName) { foreach ($this->getProviderNames() as $providerName) {
if ($name === $providerName) { if ($name === $providerName) {
$candidates = $this->whatProvides(new Pool('dev'), $providerName); $candidates = $this->whatProvides($providerName); // TODO what is the point of this?
foreach ($candidates as $package) { foreach ($candidates as $package) {
if ($name === $package->getName()) { if ($name === $package->getName()) {
$pkgConstraint = new Constraint('==', $package->getVersion()); $pkgConstraint = new Constraint('==', $package->getVersion());
@ -289,12 +288,12 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
} }
/** /**
* @param Pool $pool * @param string $name package name
* @param string $name package name * @param bool $bypassFilters If set to true, this bypasses the stability filtering, and forces a recompute without cache
* @param bool $bypassFilters If set to true, this bypasses the stability filtering, and forces a recompute without cache * @param callable $isPackageAcceptableCallable
* @return array|mixed * @return array|mixed
*/ */
public function whatProvides(Pool $pool, $name, $bypassFilters = false) public function whatProvides($name, $bypassFilters = false, $isPackageAcceptableCallable = null)
{ {
if (isset($this->providers[$name]) && !$bypassFilters) { if (isset($this->providers[$name]) && !$bypassFilters) {
return $this->providers[$name]; return $this->providers[$name];
@ -395,7 +394,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
} }
} }
} else { } else {
if (!$bypassFilters && !$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { if (!$bypassFilters && (!$isPackageAcceptableCallable || !call_user_func($isPackageAcceptableCallable, strtolower($version['name']), VersionParser::parseStability($version['version'])))) {
continue; continue;
} }

View File

@ -24,36 +24,132 @@ use Composer\Semver\Constraint\ConstraintInterface;
*/ */
class RepositorySet class RepositorySet
{ {
private $pool; /** @var array */
private $rootAliases;
public function __construct(Pool $pool) /** @var RepositoryInterface[] */
private $repositories;
/** @var ComposerRepository[] */
private $providerRepos;
private $acceptableStabilities;
private $stabilityFlags;
protected $filterRequires;
/** @var Pool */
private $pool; // TODO remove this
public function __construct(array $rootAliases = array(), $minimumStability = 'stable', array $stabilityFlags = array(), array $filterRequires = array())
{ {
$this->pool = $pool; $this->rootAliases = $rootAliases;
$this->acceptableStabilities = array();
foreach (BasePackage::$stabilities as $stability => $value) {
if ($value <= BasePackage::$stabilities[$minimumStability]) {
$this->acceptableStabilities[$stability] = $value;
}
}
$this->stabilityFlags = $stabilityFlags;
$this->filterRequires = $filterRequires;
foreach ($filterRequires as $name => $constraint) {
if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name)) {
unset($this->filterRequires[$name]);
}
}
} }
public function addRepository(RepositoryInterface $repo, $rootAliases = array()) /**
* Adds a repository to this repository set
*
* @param RepositoryInterface $repo A package repository
*/
public function addRepository(RepositoryInterface $repo)
{ {
return $this->pool->addRepository($repo, $rootAliases); if ($repo instanceof CompositeRepository) {
$repos = $repo->getRepositories();
} else {
$repos = array($repo);
}
foreach ($repos as $repo) {
$this->repositories[] = $repo;
if ($repo instanceof ComposerRepository && $repo->hasProviders()) {
$this->providerRepos[] = $repo;
}
}
} }
public function isPackageAcceptable($name, $stability) public function isPackageAcceptable($name, $stability)
{ {
return $this->pool->isPackageAcceptable($name, $stability); foreach ((array) $name as $n) {
// allow if package matches the global stability requirement and has no exception
if (!isset($this->stabilityFlags[$n]) && isset($this->acceptableStabilities[$stability])) {
return true;
}
// allow if package matches the package-specific stability flag
if (isset($this->stabilityFlags[$n]) && BasePackage::$stabilities[$stability] <= $this->stabilityFlags[$n]) {
return true;
}
}
return false;
} }
/**
* Find packages matching name and optionally a constraint in all repositories
*
* @param $name
* @param ConstraintInterface|null $constraint
* @return array
*/
public function findPackages($name, ConstraintInterface $constraint = null) public function findPackages($name, ConstraintInterface $constraint = null)
{ {
return $this->pool->whatProvides($name, $constraint, true); $packages = array();
foreach ($this->repositories as $repository) {
$packages[] = $repository->findPackages($name, $constraint) ?: array();
}
$candidates = $packages ? call_user_func_array('array_merge', $packages) : array();
$result = array();
foreach ($candidates as $candidate) {
if ($this->isPackageAcceptable($candidate->getNames(), $candidate->getStability())) {
$result[] = $candidate;
}
}
return $candidates;
} }
/**
* Create a pool for dependency resolution from the packages in this repository set.
*
* @return Pool
*/
public function createPool() public function createPool()
{ {
if ($this->pool) {
return $this->pool;
}
$this->pool = new Pool($this->acceptableStabilities, $this->stabilityFlags, $this->filterRequires);
foreach ($this->repositories as $repository) {
$this->pool->addRepository($repository, $this->rootAliases);
}
return $this->pool; return $this->pool;
} }
// TODO get rid of this function // TODO get rid of this function
public function getPoolTemp() public function getPoolTemp()
{ {
return $this->pool; if (!$this->pool) {
return $this->createPool();
} else {
return $this->pool;
}
} }
} }

View File

@ -18,13 +18,14 @@ use Composer\DependencyResolver\DefaultPolicy;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
use Composer\Repository\RepositorySet;
use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\Constraint;
use Composer\TestCase; use Composer\TestCase;
class DefaultPolicyTest extends TestCase class DefaultPolicyTest extends TestCase
{ {
/** @var Pool */ /** @var RepositorySet */
protected $pool; protected $repositorySet;
/** @var ArrayRepository */ /** @var ArrayRepository */
protected $repo; protected $repo;
/** @var ArrayRepository */ /** @var ArrayRepository */
@ -34,7 +35,7 @@ class DefaultPolicyTest extends TestCase
public function setUp() public function setUp()
{ {
$this->pool = new Pool('dev'); $this->repositorySet = new RepositorySet(array(), 'dev');
$this->repo = new ArrayRepository; $this->repo = new ArrayRepository;
$this->repoInstalled = new ArrayRepository; $this->repoInstalled = new ArrayRepository;
@ -44,12 +45,14 @@ class DefaultPolicyTest extends TestCase
public function testSelectSingle() public function testSelectSingle()
{ {
$this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageA = $this->getPackage('A', '1.0'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId()); $literals = array($packageA->getId());
$expected = array($packageA->getId()); $expected = array($packageA->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -58,12 +61,14 @@ class DefaultPolicyTest extends TestCase
{ {
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0'));
$this->repo->addPackage($packageA2 = $this->getPackage('A', '2.0')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '2.0'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA1->getId(), $packageA2->getId()); $literals = array($packageA1->getId(), $packageA2->getId());
$expected = array($packageA2->getId()); $expected = array($packageA2->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -72,12 +77,14 @@ class DefaultPolicyTest extends TestCase
{ {
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0')); $this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0'));
$this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA1->getId(), $packageA2->getId()); $literals = array($packageA1->getId(), $packageA2->getId());
$expected = array($packageA2->getId()); $expected = array($packageA2->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -86,13 +93,15 @@ class DefaultPolicyTest extends TestCase
{ {
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0')); $this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0'));
$this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA1->getId(), $packageA2->getId()); $literals = array($packageA1->getId(), $packageA2->getId());
$expected = array($packageA1->getId()); $expected = array($packageA1->getId());
$policy = new DefaultPolicy(true); $policy = new DefaultPolicy(true);
$selected = $policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -101,12 +110,14 @@ class DefaultPolicyTest extends TestCase
{ {
$this->repo->addPackage($packageA1 = $this->getPackage('A', 'dev-foo')); $this->repo->addPackage($packageA1 = $this->getPackage('A', 'dev-foo'));
$this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.0')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.0'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA1->getId(), $packageA2->getId()); $literals = array($packageA1->getId(), $packageA2->getId());
$expected = array($packageA2->getId()); $expected = array($packageA2->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -115,13 +126,15 @@ class DefaultPolicyTest extends TestCase
{ {
$this->repo->addPackage($packageA = $this->getPackage('A', '2.0')); $this->repo->addPackage($packageA = $this->getPackage('A', '2.0'));
$this->repoInstalled->addPackage($packageAInstalled = $this->getPackage('A', '1.0')); $this->repoInstalled->addPackage($packageAInstalled = $this->getPackage('A', '1.0'));
$this->pool->addRepository($this->repoInstalled); $this->repositorySet->addRepository($this->repoInstalled);
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageAInstalled->getId()); $literals = array($packageA->getId(), $packageAInstalled->getId());
$expected = array($packageA->getId()); $expected = array($packageA->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, $this->mapFromRepo($this->repoInstalled), $literals); $selected = $this->policy->selectPreferredPackages($pool, $this->mapFromRepo($this->repoInstalled), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -133,14 +146,16 @@ class DefaultPolicyTest extends TestCase
$this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageA = $this->getPackage('A', '1.0'));
$otherRepository->addPackage($packageAImportant = $this->getPackage('A', '1.0')); $otherRepository->addPackage($packageAImportant = $this->getPackage('A', '1.0'));
$this->pool->addRepository($this->repoInstalled); $this->repositorySet->addRepository($this->repoInstalled);
$this->pool->addRepository($otherRepository); $this->repositorySet->addRepository($otherRepository);
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageAImportant->getId()); $literals = array($packageA->getId(), $packageAImportant->getId());
$expected = array($packageAImportant->getId()); $expected = array($packageAImportant->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -155,21 +170,25 @@ class DefaultPolicyTest extends TestCase
$repo2->addPackage($package3 = $this->getPackage('A', '1.1')); $repo2->addPackage($package3 = $this->getPackage('A', '1.1'));
$repo2->addPackage($package4 = $this->getPackage('A', '1.2')); $repo2->addPackage($package4 = $this->getPackage('A', '1.2'));
$this->pool->addRepository($repo1); $this->repositorySet->addRepository($repo1);
$this->pool->addRepository($repo2); $this->repositorySet->addRepository($repo2);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($package1->getId(), $package2->getId(), $package3->getId(), $package4->getId()); $literals = array($package1->getId(), $package2->getId(), $package3->getId(), $package4->getId());
$expected = array($package2->getId()); $expected = array($package2->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
$this->pool = new Pool('dev'); $this->repositorySet = new RepositorySet(array(), 'dev');
$this->pool->addRepository($repo2); $this->repositorySet->addRepository($repo2);
$this->pool->addRepository($repo1); $this->repositorySet->addRepository($repo1);
$pool = $this->repositorySet->getPoolTemp();
$expected = array($package4->getId()); $expected = array($package4->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -186,11 +205,13 @@ class DefaultPolicyTest extends TestCase
$repoImportant->addPackage($packageA2AliasImportant = new AliasPackage($packageA2Important, '2.1.9999999.9999999-dev', '2.1.x-dev')); $repoImportant->addPackage($packageA2AliasImportant = new AliasPackage($packageA2Important, '2.1.9999999.9999999-dev', '2.1.x-dev'));
$packageAAliasImportant->setRootPackageAlias(true); $packageAAliasImportant->setRootPackageAlias(true);
$this->pool->addRepository($this->repoInstalled); $this->repositorySet->addRepository($this->repoInstalled);
$this->pool->addRepository($repoImportant); $this->repositorySet->addRepository($repoImportant);
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$packages = $this->pool->whatProvides('a', new Constraint('=', '2.1.9999999.9999999-dev')); $pool = $this->repositorySet->getPoolTemp();
$packages = $pool->whatProvides('a', new Constraint('=', '2.1.9999999.9999999-dev'));
$literals = array(); $literals = array();
foreach ($packages as $package) { foreach ($packages as $package) {
$literals[] = $package->getId(); $literals[] = $package->getId();
@ -198,7 +219,7 @@ class DefaultPolicyTest extends TestCase
$expected = array($packageAAliasImportant->getId()); $expected = array($packageAAliasImportant->getId());
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -211,12 +232,14 @@ class DefaultPolicyTest extends TestCase
$packageA->setProvides(array(new Link('A', 'X', new Constraint('==', '1.0'), 'provides'))); $packageA->setProvides(array(new Link('A', 'X', new Constraint('==', '1.0'), 'provides')));
$packageB->setProvides(array(new Link('B', 'X', new Constraint('==', '1.0'), 'provides'))); $packageB->setProvides(array(new Link('B', 'X', new Constraint('==', '1.0'), 'provides')));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageB->getId()); $literals = array($packageA->getId(), $packageB->getId());
$expected = $literals; $expected = $literals;
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -228,12 +251,14 @@ class DefaultPolicyTest extends TestCase
$packageB->setReplaces(array(new Link('B', 'A', new Constraint('==', '1.0'), 'replaces'))); $packageB->setReplaces(array(new Link('B', 'A', new Constraint('==', '1.0'), 'replaces')));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageB->getId()); $literals = array($packageA->getId(), $packageB->getId());
$expected = $literals; $expected = $literals;
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -247,12 +272,14 @@ class DefaultPolicyTest extends TestCase
$packageA->setReplaces(array(new Link('vendor-a/replacer', 'vendor-a/package', new Constraint('==', '1.0'), 'replaces'))); $packageA->setReplaces(array(new Link('vendor-a/replacer', 'vendor-a/package', new Constraint('==', '1.0'), 'replaces')));
$packageB->setReplaces(array(new Link('vendor-b/replacer', 'vendor-a/package', new Constraint('==', '1.0'), 'replaces'))); $packageB->setReplaces(array(new Link('vendor-b/replacer', 'vendor-a/package', new Constraint('==', '1.0'), 'replaces')));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageB->getId()); $literals = array($packageA->getId(), $packageB->getId());
$expected = $literals; $expected = $literals;
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals, 'vendor-a/package'); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals, 'vendor-a/package');
$this->assertEquals($expected, $selected); $this->assertEquals($expected, $selected);
// test with reversed order in repo // test with reversed order in repo
@ -260,13 +287,15 @@ class DefaultPolicyTest extends TestCase
$repo->addPackage($packageA = clone $packageA); $repo->addPackage($packageA = clone $packageA);
$repo->addPackage($packageB = clone $packageB); $repo->addPackage($packageB = clone $packageB);
$pool = new Pool('dev'); $repositorySet = new RepositorySet(array(), 'dev');
$pool->addRepository($this->repo); $repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA->getId(), $packageB->getId()); $literals = array($packageA->getId(), $packageB->getId());
$expected = $literals; $expected = $literals;
$selected = $this->policy->selectPreferredPackages($this->pool, array(), $literals, 'vendor-a/package'); $selected = $this->policy->selectPreferredPackages($pool, array(), $literals, 'vendor-a/package');
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }
@ -286,12 +315,14 @@ class DefaultPolicyTest extends TestCase
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0'));
$this->repo->addPackage($packageA2 = $this->getPackage('A', '2.0')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '2.0'));
$this->pool->addRepository($this->repo); $this->repositorySet->addRepository($this->repo);
$pool = $this->repositorySet->getPoolTemp();
$literals = array($packageA1->getId(), $packageA2->getId()); $literals = array($packageA1->getId(), $packageA2->getId());
$expected = array($packageA1->getId()); $expected = array($packageA1->getId());
$selected = $policy->selectPreferredPackages($this->pool, array(), $literals); $selected = $policy->selectPreferredPackages($pool, array(), $literals);
$this->assertSame($expected, $selected); $this->assertSame($expected, $selected);
} }

View File

@ -21,7 +21,7 @@ class PoolTest extends TestCase
{ {
public function testPool() public function testPool()
{ {
$pool = new Pool; $pool = $this->createPool();
$repo = new ArrayRepository; $repo = new ArrayRepository;
$package = $this->getPackage('foo', '1'); $package = $this->getPackage('foo', '1');
@ -34,7 +34,7 @@ class PoolTest extends TestCase
public function testPoolIgnoresIrrelevantPackages() public function testPoolIgnoresIrrelevantPackages()
{ {
$pool = new Pool('stable', array('bar' => BasePackage::STABILITY_BETA)); $pool = new Pool(array('stable' => BasePackage::STABILITY_STABLE), array('bar' => BasePackage::STABILITY_BETA));
$repo = new ArrayRepository; $repo = new ArrayRepository;
$repo->addPackage($package = $this->getPackage('bar', '1')); $repo->addPackage($package = $this->getPackage('bar', '1'));
$repo->addPackage($betaPackage = $this->getPackage('bar', '1-beta')); $repo->addPackage($betaPackage = $this->getPackage('bar', '1-beta'));
@ -53,7 +53,7 @@ class PoolTest extends TestCase
*/ */
public function testGetPriorityForNotRegisteredRepository() public function testGetPriorityForNotRegisteredRepository()
{ {
$pool = new Pool; $pool = $this->createPool();
$repository = new ArrayRepository; $repository = new ArrayRepository;
$pool->getPriority($repository); $pool->getPriority($repository);
@ -61,7 +61,7 @@ class PoolTest extends TestCase
public function testGetPriorityWhenRepositoryIsRegistered() public function testGetPriorityWhenRepositoryIsRegistered()
{ {
$pool = new Pool; $pool = $this->createPool();
$firstRepository = new ArrayRepository; $firstRepository = new ArrayRepository;
$pool->addRepository($firstRepository); $pool->addRepository($firstRepository);
$secondRepository = new ArrayRepository; $secondRepository = new ArrayRepository;
@ -76,7 +76,7 @@ class PoolTest extends TestCase
public function testWhatProvidesSamePackageForDifferentRepositories() public function testWhatProvidesSamePackageForDifferentRepositories()
{ {
$pool = new Pool; $pool = $this->createPool();
$firstRepository = new ArrayRepository; $firstRepository = new ArrayRepository;
$secondRepository = new ArrayRepository; $secondRepository = new ArrayRepository;
@ -96,7 +96,7 @@ class PoolTest extends TestCase
public function testWhatProvidesPackageWithConstraint() public function testWhatProvidesPackageWithConstraint()
{ {
$pool = new Pool; $pool = $this->createPool();
$repository = new ArrayRepository; $repository = new ArrayRepository;
$firstPackage = $this->getPackage('foo', '1'); $firstPackage = $this->getPackage('foo', '1');
@ -113,7 +113,7 @@ class PoolTest extends TestCase
public function testPackageById() public function testPackageById()
{ {
$pool = new Pool; $pool = $this->createPool();
$repository = new ArrayRepository; $repository = new ArrayRepository;
$package = $this->getPackage('foo', '1'); $package = $this->getPackage('foo', '1');
@ -125,8 +125,13 @@ class PoolTest extends TestCase
public function testWhatProvidesWhenPackageCannotBeFound() public function testWhatProvidesWhenPackageCannotBeFound()
{ {
$pool = new Pool; $pool = $this->createPool();
$this->assertEquals(array(), $pool->whatProvides('foo')); $this->assertEquals(array(), $pool->whatProvides('foo'));
} }
protected function createPool()
{
return new Pool(array('stable' => BasePackage::STABILITY_STABLE));
}
} }

View File

@ -17,6 +17,7 @@ use Composer\DependencyResolver\Rule;
use Composer\DependencyResolver\RuleSet; use Composer\DependencyResolver\RuleSet;
use Composer\DependencyResolver\RuleSetIterator; use Composer\DependencyResolver\RuleSetIterator;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\BasePackage;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class RuleSetIteratorTest extends TestCase class RuleSetIteratorTest extends TestCase
@ -26,7 +27,7 @@ class RuleSetIteratorTest extends TestCase
protected function setUp() protected function setUp()
{ {
$this->pool = new Pool; $this->pool = new Pool(array('stable' => BasePackage::STABILITY_STABLE));
$this->rules = array( $this->rules = array(
RuleSet::TYPE_JOB => array( RuleSet::TYPE_JOB => array(

View File

@ -16,6 +16,7 @@ use Composer\DependencyResolver\GenericRule;
use Composer\DependencyResolver\Rule; use Composer\DependencyResolver\Rule;
use Composer\DependencyResolver\RuleSet; use Composer\DependencyResolver\RuleSet;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\BasePackage;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\TestCase;
@ -25,7 +26,7 @@ class RuleSetTest extends TestCase
public function setUp() public function setUp()
{ {
$this->pool = new Pool; $this->pool = new Pool(array('stable' => BasePackage::STABILITY_STABLE));
} }
public function testAdd() public function testAdd()

View File

@ -16,6 +16,7 @@ use Composer\DependencyResolver\GenericRule;
use Composer\DependencyResolver\Rule; use Composer\DependencyResolver\Rule;
use Composer\DependencyResolver\RuleSet; use Composer\DependencyResolver\RuleSet;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\BasePackage;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\TestCase;
@ -25,7 +26,7 @@ class RuleTest extends TestCase
public function setUp() public function setUp()
{ {
$this->pool = new Pool; $this->pool = new Pool(array('stable' => BasePackage::STABILITY_STABLE));
} }
public function testGetHash() public function testGetHash()

View File

@ -34,7 +34,7 @@ class SolverTest extends TestCase
public function setUp() public function setUp()
{ {
$this->repoSet = new RepositorySet(new Pool); $this->repoSet = new RepositorySet(array());
$this->repo = new ArrayRepository; $this->repo = new ArrayRepository;
$this->repoInstalled = new ArrayRepository; $this->repoInstalled = new ArrayRepository;

View File

@ -130,7 +130,7 @@ class PluginInstallerTest extends TestCase
public function testInstallNewPlugin() public function testInstallNewPlugin()
{ {
$this->repository $this->repository
->expects($this->exactly(2)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$installer = new PluginInstaller($this->io, $this->composer); $installer = new PluginInstaller($this->io, $this->composer);
@ -145,7 +145,7 @@ class PluginInstallerTest extends TestCase
public function testInstallMultiplePlugins() public function testInstallMultiplePlugins()
{ {
$this->repository $this->repository
->expects($this->exactly(2)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array($this->packages[3]))); ->will($this->returnValue(array($this->packages[3])));
$installer = new PluginInstaller($this->io, $this->composer); $installer = new PluginInstaller($this->io, $this->composer);
@ -163,7 +163,7 @@ class PluginInstallerTest extends TestCase
public function testUpgradeWithNewClassName() public function testUpgradeWithNewClassName()
{ {
$this->repository $this->repository
->expects($this->exactly(3)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array($this->packages[0]))); ->will($this->returnValue(array($this->packages[0])));
$this->repository $this->repository
@ -182,7 +182,7 @@ class PluginInstallerTest extends TestCase
public function testUpgradeWithSameClassName() public function testUpgradeWithSameClassName()
{ {
$this->repository $this->repository
->expects($this->exactly(3)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array($this->packages[1]))); ->will($this->returnValue(array($this->packages[1])));
$this->repository $this->repository
@ -201,7 +201,7 @@ class PluginInstallerTest extends TestCase
public function testRegisterPluginOnlyOneTime() public function testRegisterPluginOnlyOneTime()
{ {
$this->repository $this->repository
->expects($this->exactly(2)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$installer = new PluginInstaller($this->io, $this->composer); $installer = new PluginInstaller($this->io, $this->composer);
@ -240,11 +240,11 @@ class PluginInstallerTest extends TestCase
// Add the plugins to the repo along with the internal Plugin package on which they all rely. // Add the plugins to the repo along with the internal Plugin package on which they all rely.
$this->repository $this->repository
->expects($this->any()) ->expects($this->any())
->method('getPackages') ->method('getPackages')
->will($this->returnCallback(function () use ($plugApiInternalPackage, $plugins) { ->will($this->returnCallback(function () use ($plugApiInternalPackage, $plugins) {
return array_merge(array($plugApiInternalPackage), $plugins); return array_merge(array($plugApiInternalPackage), $plugins);
})); }));
$this->pm->loadInstalledPlugins(); $this->pm->loadInstalledPlugins();
} }
@ -300,7 +300,7 @@ class PluginInstallerTest extends TestCase
public function testCommandProviderCapability() public function testCommandProviderCapability()
{ {
$this->repository $this->repository
->expects($this->exactly(2)) ->expects($this->once())
->method('getPackages') ->method('getPackages')
->will($this->returnValue(array($this->packages[7]))); ->will($this->returnValue(array($this->packages[7])));
$installer = new PluginInstaller($this->io, $this->composer); $installer = new PluginInstaller($this->io, $this->composer);

View File

@ -142,11 +142,6 @@ class ComposerRepositoryTest extends TestCase
), ),
))); )));
$pool = $this->getMockBuilder('Composer\DependencyResolver\Pool')->getMock();
$pool->expects($this->any())
->method('isPackageAcceptable')
->will($this->returnValue(true));
$versionParser = new VersionParser(); $versionParser = new VersionParser();
$repo->setRootAliases(array( $repo->setRootAliases(array(
'a' => array( 'a' => array(
@ -155,7 +150,7 @@ class ComposerRepositoryTest extends TestCase
), ),
)); ));
$packages = $repo->whatProvides($pool, 'a'); $packages = $repo->whatProvides('a', false, array($this, 'isPackageAcceptableReturnTrue'));
$this->assertCount(7, $packages); $this->assertCount(7, $packages);
$this->assertEquals(array('1', '1-alias', '2', '2-alias', '2-root', '3', '3-root'), array_keys($packages)); $this->assertEquals(array('1', '1-alias', '2', '2-alias', '2-root', '3', '3-root'), array_keys($packages));
@ -164,6 +159,11 @@ class ComposerRepositoryTest extends TestCase
$this->assertSame($packages['2'], $packages['2-alias']->getAliasOf()); $this->assertSame($packages['2'], $packages['2-alias']->getAliasOf());
} }
public function isPackageAcceptableReturnTrue()
{
return true;
}
public function testSearchWithType() public function testSearchWithType()
{ {
$repoConfig = array( $repoConfig = array(