From 47a94b3a88a22c155cd8832fc681a9071dbfa0c5 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 15 Jan 2020 12:02:12 +0100 Subject: [PATCH 1/3] Ensure packages that exist in a higher prio repo never get loaded in lower prio repos, fixes #5076 --- .../DependencyResolver/PoolBuilder.php | 9 +++- src/Composer/Repository/BaseRepository.php | 22 ++++++---- .../Repository/ComposerRepository.php | 24 +++++++---- .../Repository/RepositoryInterface.php | 2 +- .../installer/repositories-priorities.test | 42 +++++++++++++++++++ .../installer/repositories-priorities2.test | 26 ++++++++++++ 6 files changed, 106 insertions(+), 19 deletions(-) create mode 100644 tests/Composer/Test/Fixtures/installer/repositories-priorities.test create mode 100644 tests/Composer/Test/Fixtures/installer/repositories-priorities2.test diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 7b80c41bd..c57e4fa43 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -97,9 +97,14 @@ class PoolBuilder } // TODO should we really pass the callable into here? - $packages = $repository->loadPackages($loadNames, $this->isPackageAcceptableCallable); + $result = $repository->loadPackages($loadNames, $this->isPackageAcceptableCallable); + + foreach ($result['namesFound'] as $name) { + // avoid loading the same package again from other repositories once it has been found + unset($loadNames[$name]); + } + foreach ($result['packages'] as $package) { - foreach ($packages as $package) { if (call_user_func($this->isPackageAcceptableCallable, $package->getNames(), $package->getStability())) { $newLoadNames += $this->loadPackage($request, $package, $key); } diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index ddf8b6e73..dfd99d7c7 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -31,16 +31,20 @@ abstract class BaseRepository implements RepositoryInterface $packages = $this->getPackages(); $result = array(); + $namesFound = array(); foreach ($packages as $package) { - if ( - array_key_exists($package->getName(), $packageMap) - && (!$packageMap[$package->getName()] || $packageMap[$package->getName()]->matches(new Constraint('==', $package->getVersion()))) - && call_user_func($isPackageAcceptableCallable, $package->getNames(), $package->getStability()) - ) { - $result[spl_object_hash($package)] = $package; - if ($package instanceof AliasPackage && !isset($result[spl_object_hash($package->getAliasOf())])) { - $result[spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); + if (array_key_exists($package->getName(), $packageMap)) { + if ( + (!$packageMap[$package->getName()] || $packageMap[$package->getName()]->matches(new Constraint('==', $package->getVersion()))) + && call_user_func($isPackageAcceptableCallable, $package->getNames(), $package->getStability()) + ) { + $result[spl_object_hash($package)] = $package; + if ($package instanceof AliasPackage && !isset($result[spl_object_hash($package->getAliasOf())])) { + $result[spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); + } } + + $namesFound[$package->getName()] = true; } } @@ -52,7 +56,7 @@ abstract class BaseRepository implements RepositoryInterface } } - return $result; + return array('namesFound' => array_keys($namesFound), 'packages' => $result); } /** diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 975282702..0a9b7d5e4 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -143,7 +143,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito $packages = $this->loadAsyncPackages(array($name => $constraint)); - return reset($packages); + return reset($packages['packages']); } if ($hasProviders) { @@ -181,7 +181,9 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito return array(); } - return $this->loadAsyncPackages(array($name => $constraint)); + $result = $this->loadAsyncPackages(array($name => $constraint)); + + return $result['packages']; } if ($hasProviders) { @@ -239,7 +241,9 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito $packageMap[$name] = new EmptyConstraint(); } - return array_values($this->loadAsyncPackages($packageMap)); + $result = $this->loadAsyncPackages($packageMap); + + return array_values($result['packages']); } if ($this->hasPartialPackages()) { @@ -297,6 +301,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito } $packages = array(); + $namesFound = array(); if ($hasProviders || $this->hasPartialPackages()) { foreach ($packageNameMap as $name => $constraint) { @@ -313,6 +318,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito if ($candidate->getName() !== $name) { throw new \LogicException('whatProvides should never return a package with a different name than the requested one'); } + $namesFound[$name] = true; if (!$constraint || $constraint->matches(new Constraint('==', $candidate->getVersion()))) { $matches[spl_object_hash($candidate)] = $candidate; if ($candidate instanceof AliasPackage && !isset($matches[spl_object_hash($candidate->getAliasOf())])) { @@ -343,10 +349,12 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito }, ARRAY_FILTER_USE_KEY); } - $packages = array_merge($packages, $this->loadAsyncPackages($packageNameMap, $isPackageAcceptableCallable)); + $result = $this->loadAsyncPackages($packageNameMap, $isPackageAcceptableCallable); + $packages = array_merge($packages, $result['packages']); + $namesFound = array_merge($namesFound, $result['namesFound']); } - return $packages; + return array('namesFound' => array_keys($namesFound), 'packages' => $packages); } /** @@ -586,6 +594,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito $this->loadRootServerFile(); $packages = array(); + $namesFound = array(); $promises = array(); $repo = $this; @@ -619,7 +628,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito } $promises[] = $this->asyncFetchFile($url, $cacheKey, $lastModified) - ->then(function ($response) use (&$packages, $contents, $realName, $constraint, $repo, $isPackageAcceptableCallable) { + ->then(function ($response) use (&$packages, &$namesFound, $contents, $realName, $constraint, $repo, $isPackageAcceptableCallable) { if (true === $response) { $response = $contents; } @@ -657,6 +666,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito unset($expanded, $expandedVersion, $versionData); } + $namesFound[$realName] = true; $versionsToLoad = array(); foreach ($versions as $version) { if (!isset($version['version_normalized'])) { @@ -683,7 +693,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito $this->loop->wait($promises); - return $packages; + return array('namesFound' => $namesFound, 'packages' => $packages); // RepositorySet should call loadMetadata, getMetadata when all promises resolved, then metadataComplete when done so we can GC the loaded json and whatnot then as needed } diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index e5f2c5159..f5e80c24c 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -69,7 +69,7 @@ interface RepositoryInterface extends \Countable * * @param ConstraintInterface[] $packageNameMap package names pointing to constraints * @param $isPackageAcceptableCallable - * @return PackageInterface[] + * @return array [namesFound => string[], packages => PackageInterface[]] */ public function loadPackages(array $packageNameMap, $isPackageAcceptableCallable); diff --git a/tests/Composer/Test/Fixtures/installer/repositories-priorities.test b/tests/Composer/Test/Fixtures/installer/repositories-priorities.test new file mode 100644 index 000000000..42f7a1a6e --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/repositories-priorities.test @@ -0,0 +1,42 @@ +--TEST-- +Packages found in a higher priority repository take precedence even if they are not found in the requested version +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { "name": "foo/a", "version": "1.0.0" } + ] + }, + { + "type": "package", + "package": [ + { "name": "foo/a", "version": "2.0.0" } + ] + } + ], + "require": { + "foo/a": "2.*" + } +} +--RUN-- +update +--EXPECT-OUTPUT-- +Loading composer repositories with package information +Updating dependencies +Your requirements could not be resolved to an installable set of packages. + + Problem 1 + - The requested package foo/a could not be found in any version, there may be a typo in the package name. + +Potential causes: + - A typo in the package name + - The package is not available in a stable-enough version according to your minimum-stability setting + see for more details. + - It's a private package and you forgot to add a custom repository to find it + +Read for further common problems. +--EXPECT-- +--EXPECT-EXIT-CODE-- +2 diff --git a/tests/Composer/Test/Fixtures/installer/repositories-priorities2.test b/tests/Composer/Test/Fixtures/installer/repositories-priorities2.test new file mode 100644 index 000000000..598079d80 --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/repositories-priorities2.test @@ -0,0 +1,26 @@ +--TEST-- +Packages found in a higher priority repository take precedence +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { "name": "foo/a", "version": "1.0.0" } + ] + }, + { + "type": "package", + "package": [ + { "name": "foo/a", "version": "1.1.0" } + ] + } + ], + "require": { + "foo/a": "1.*" + } +} +--RUN-- +update +--EXPECT-- +Installing foo/a (1.0.0) From 926afab1f4e937ddaa3ca22c79d55743069261b8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 15 Jan 2020 12:37:24 +0100 Subject: [PATCH 2/3] Move loadPackages impl out of BaseRepository --- src/Composer/Repository/ArrayRepository.php | 40 ++++++++++++++++++- src/Composer/Repository/BaseRepository.php | 34 ---------------- .../Repository/CompositeRepository.php | 20 ++++++++++ 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index c11c7fe68..42e9d50e1 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -28,8 +28,8 @@ class ArrayRepository extends BaseRepository { /** @var PackageInterface[] */ protected $packages; - - /** + + /** * @var PackageInterface[] indexed by package unique name and used to cache hasPackage calls */ protected $packageMap; @@ -41,6 +41,42 @@ class ArrayRepository extends BaseRepository } } + /** + * {@inheritDoc} + */ + public function loadPackages(array $packageMap, $isPackageAcceptableCallable) + { + $packages = $this->getPackages(); + + $result = array(); + $namesFound = array(); + foreach ($packages as $package) { + if (array_key_exists($package->getName(), $packageMap)) { + if ( + (!$packageMap[$package->getName()] || $packageMap[$package->getName()]->matches(new Constraint('==', $package->getVersion()))) + && call_user_func($isPackageAcceptableCallable, $package->getNames(), $package->getStability()) + ) { + $result[spl_object_hash($package)] = $package; + if ($package instanceof AliasPackage && !isset($result[spl_object_hash($package->getAliasOf())])) { + $result[spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); + } + } + + $namesFound[$package->getName()] = true; + } + } + + foreach ($packages as $package) { + if ($package instanceof AliasPackage) { + if (isset($result[spl_object_hash($package->getAliasOf())])) { + $result[spl_object_hash($package)] = $package; + } + } + } + + return array('namesFound' => array_keys($namesFound), 'packages' => $result); + } + /** * {@inheritDoc} */ diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index dfd99d7c7..1274dbb43 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -25,40 +25,6 @@ use Composer\Package\Link; */ abstract class BaseRepository implements RepositoryInterface { - // TODO should this stay here? some repos need a better implementation - public function loadPackages(array $packageMap, $isPackageAcceptableCallable) - { - $packages = $this->getPackages(); - - $result = array(); - $namesFound = array(); - foreach ($packages as $package) { - if (array_key_exists($package->getName(), $packageMap)) { - if ( - (!$packageMap[$package->getName()] || $packageMap[$package->getName()]->matches(new Constraint('==', $package->getVersion()))) - && call_user_func($isPackageAcceptableCallable, $package->getNames(), $package->getStability()) - ) { - $result[spl_object_hash($package)] = $package; - if ($package instanceof AliasPackage && !isset($result[spl_object_hash($package->getAliasOf())])) { - $result[spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); - } - } - - $namesFound[$package->getName()] = true; - } - } - - foreach ($packages as $package) { - if ($package instanceof AliasPackage) { - if (isset($result[spl_object_hash($package->getAliasOf())])) { - $result[spl_object_hash($package)] = $package; - } - } - } - - return array('namesFound' => array_keys($namesFound), 'packages' => $result); - } - /** * Returns a list of links causing the requested needle packages to be installed, as an associative array with the * dependent's name as key, and an array containing in order the PackageInterface and Link describing the relationship diff --git a/src/Composer/Repository/CompositeRepository.php b/src/Composer/Repository/CompositeRepository.php index ce57504f0..ddaa94694 100644 --- a/src/Composer/Repository/CompositeRepository.php +++ b/src/Composer/Repository/CompositeRepository.php @@ -94,6 +94,26 @@ class CompositeRepository extends BaseRepository return $packages ? call_user_func_array('array_merge', $packages) : array(); } + /** + * {@inheritDoc} + */ + public function loadPackages(array $packageMap, $isPackageAcceptableCallable) + { + $packages = array(); + $namesFound = array(); + foreach ($this->repositories as $repository) { + /* @var $repository RepositoryInterface */ + $result = $repository->findPackages($name, $constraint); + $packages[] = $result['packages']; + $namesFound[] = $result['namesFound']; + } + + return array( + 'packages' => $packages ? call_user_func_array('array_merge', $packages) : array(), + 'namesFound' => $namesFound ? array_unique(call_user_func_array('array_merge', $namesFound)) : array(), + ); + } + /** * {@inheritdoc} */ From f68731e6631f9a17ff011cf2d53abfeb9d04f81f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 15 Jan 2020 14:52:44 +0100 Subject: [PATCH 3/3] Remove package/repo priority concept as it is enforced by the pool builder now --- .../DependencyResolver/DefaultPolicy.php | 105 ++++++------------ src/Composer/DependencyResolver/Pool.php | 9 +- .../DependencyResolver/PoolBuilder.php | 8 +- src/Composer/Repository/RepositorySet.php | 14 +-- .../DependencyResolver/DefaultPolicyTest.php | 43 +------ 5 files changed, 46 insertions(+), 133 deletions(-) diff --git a/src/Composer/DependencyResolver/DefaultPolicy.php b/src/Composer/DependencyResolver/DefaultPolicy.php index 7d241b482..0b978ec59 100644 --- a/src/Composer/DependencyResolver/DefaultPolicy.php +++ b/src/Composer/DependencyResolver/DefaultPolicy.php @@ -69,7 +69,6 @@ class DefaultPolicy implements PolicyInterface } foreach ($packages as &$sortedLiterals) { - $sortedLiterals = $this->pruneToHighestPriority($pool, $sortedLiterals); $sortedLiterals = $this->pruneToBestVersion($pool, $sortedLiterals); $sortedLiterals = $this->pruneRemoteAliases($pool, $sortedLiterals); } @@ -104,51 +103,47 @@ class DefaultPolicy implements PolicyInterface */ public function compareByPriority(Pool $pool, PackageInterface $a, PackageInterface $b, $requiredPackage = null, $ignoreReplace = false) { - if ($a->getRepository() === $b->getRepository()) { - // prefer aliases to the original package - if ($a->getName() === $b->getName()) { - $aAliased = $a instanceof AliasPackage; - $bAliased = $b instanceof AliasPackage; - if ($aAliased && !$bAliased) { - return -1; // use a - } - if (!$aAliased && $bAliased) { - return 1; // use b - } + // prefer aliases to the original package + if ($a->getName() === $b->getName()) { + $aAliased = $a instanceof AliasPackage; + $bAliased = $b instanceof AliasPackage; + if ($aAliased && !$bAliased) { + return -1; // use a } - - if (!$ignoreReplace) { - // return original, not replaced - if ($this->replaces($a, $b)) { - return 1; // use b - } - if ($this->replaces($b, $a)) { - return -1; // use a - } - - // for replacers not replacing each other, put a higher prio on replacing - // packages with the same vendor as the required package - if ($requiredPackage && false !== ($pos = strpos($requiredPackage, '/'))) { - $requiredVendor = substr($requiredPackage, 0, $pos); - - $aIsSameVendor = substr($a->getName(), 0, $pos) === $requiredVendor; - $bIsSameVendor = substr($b->getName(), 0, $pos) === $requiredVendor; - - if ($bIsSameVendor !== $aIsSameVendor) { - return $aIsSameVendor ? -1 : 1; - } - } + if (!$aAliased && $bAliased) { + return 1; // use b } - - // priority equal, sort by package id to make reproducible - if ($a->id === $b->id) { - return 0; - } - - return ($a->id < $b->id) ? -1 : 1; } - return ($pool->getPriority($a->id) > $pool->getPriority($b->id)) ? -1 : 1; + if (!$ignoreReplace) { + // return original, not replaced + if ($this->replaces($a, $b)) { + return 1; // use b + } + if ($this->replaces($b, $a)) { + return -1; // use a + } + + // for replacers not replacing each other, put a higher prio on replacing + // packages with the same vendor as the required package + if ($requiredPackage && false !== ($pos = strpos($requiredPackage, '/'))) { + $requiredVendor = substr($requiredPackage, 0, $pos); + + $aIsSameVendor = substr($a->getName(), 0, $pos) === $requiredVendor; + $bIsSameVendor = substr($b->getName(), 0, $pos) === $requiredVendor; + + if ($bIsSameVendor !== $aIsSameVendor) { + return $aIsSameVendor ? -1 : 1; + } + } + } + + // priority equal, sort by package id to make reproducible + if ($a->id === $b->id) { + return 0; + } + + return ($a->id < $b->id) ? -1 : 1; } /** @@ -198,32 +193,6 @@ class DefaultPolicy implements PolicyInterface return $bestLiterals; } - /** - * Assumes that highest priority packages come first - */ - protected function pruneToHighestPriority(Pool $pool, array $literals) - { - $selected = array(); - - $priority = null; - - foreach ($literals as $literal) { - $package = $pool->literalToPackage($literal); - - if (null === $priority) { - $priority = $pool->getPriority($package->id); - } - - if ($pool->getPriority($package->id) != $priority) { - break; - } - - $selected[] = $literal; - } - - return $selected; - } - /** * Assumes that locally aliased (in root package requires) packages take priority over branch-alias ones * diff --git a/src/Composer/DependencyResolver/Pool.php b/src/Composer/DependencyResolver/Pool.php index 9470c6e35..ffb70c300 100644 --- a/src/Composer/DependencyResolver/Pool.php +++ b/src/Composer/DependencyResolver/Pool.php @@ -36,7 +36,6 @@ class Pool implements \Countable protected $packages = array(); protected $packageByName = array(); protected $packageByExactName = array(); - protected $priorities = array(); protected $versionParser; protected $providerCache = array(); @@ -45,13 +44,12 @@ class Pool implements \Countable $this->versionParser = new VersionParser; } - public function setPackages(array $packages, array $priorities = array()) + public function setPackages(array $packages) { $id = 1; foreach ($packages as $i => $package) { $this->packages[] = $package; - $this->priorities[] = isset($priorities[$i]) ? $priorities[$i] : 0; $package->id = $id++; $names = $package->getNames(); @@ -63,11 +61,6 @@ class Pool implements \Countable } } - public function getPriority($id) - { - return $this->priorities[$id - 1]; - } - /** * Retrieves the package object for a given package id. * diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index c57e4fa43..05d029604 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -38,7 +38,6 @@ class PoolBuilder private $loadedNames = array(); private $packages = array(); - private $priorities = array(); public function __construct($isPackageAcceptableCallable, array $rootRequires = array()) { @@ -134,7 +133,6 @@ class PoolBuilder if (!$found) { foreach ($aliasedPackages as $index => $packageOrAlias) { unset($this->packages[$index]); - unset($this->priorities[$index]); } } } @@ -149,7 +147,7 @@ class PoolBuilder } } - $pool->setPackages($this->packages, $this->priorities); + $pool->setPackages($this->packages); unset($this->aliasMap); unset($this->loadedNames); @@ -158,11 +156,10 @@ class PoolBuilder return $pool; } - private function loadPackage(Request $request, PackageInterface $package, $repoIndex) + private function loadPackage(Request $request, PackageInterface $package) { $index = count($this->packages); $this->packages[] = $package; - $this->priorities[] = -$repoIndex; if ($package instanceof AliasPackage) { $this->aliasMap[spl_object_hash($package->getAliasOf())][$index] = $package; @@ -192,7 +189,6 @@ class PoolBuilder $package->getRepository()->addPackage($aliasPackage); // TODO do we need this? $this->packages[] = $aliasPackage; - $this->priorities[] = -$repoIndex; $this->aliasMap[spl_object_hash($aliasPackage->getAliasOf())][$index+1] = $aliasPackage; } diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index 21526b96f..6ed647297 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -65,6 +65,9 @@ class RepositorySet /** * Adds a repository to this repository set * + * The first repos added have a higher priority. As soon as a package is found in any + * repository the search for that package ends, and following repos will not be consulted. + * * @param RepositoryInterface $repo A package repository */ public function addRepository(RepositoryInterface $repo) @@ -134,17 +137,6 @@ 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. * diff --git a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php index b4df12310..827a9181d 100644 --- a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php +++ b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php @@ -13,6 +13,7 @@ namespace Composer\Test\DependencyResolver; use Composer\Repository\ArrayRepository; +use Composer\Repository\LockArrayRepository; use Composer\Repository\RepositoryInterface; use Composer\DependencyResolver\DefaultPolicy; use Composer\DependencyResolver\Pool; @@ -28,7 +29,7 @@ class DefaultPolicyTest extends TestCase protected $repositorySet; /** @var ArrayRepository */ protected $repo; - /** @var ArrayRepository */ + /** @var LockArrayRepository */ protected $repoLocked; /** @var DefaultPolicy */ protected $policy; @@ -37,7 +38,7 @@ class DefaultPolicyTest extends TestCase { $this->repositorySet = new RepositorySet(array(), array(), 'dev'); $this->repo = new ArrayRepository; - $this->repoLocked = new ArrayRepository; + $this->repoLocked = new LockArrayRepository; $this->policy = new DefaultPolicy; } @@ -122,44 +123,6 @@ class DefaultPolicyTest extends TestCase $this->assertSame($expected, $selected); } - public function testSelectNewestOverLocked() - { - $this->repo->addPackage($packageA = $this->getPackage('A', '2.0')); - $this->repoLocked->addPackage($packageAInstalled = $this->getPackage('A', '1.0')); - $this->repositorySet->addRepository($this->repo); - $this->repositorySet->addRepository($this->repoLocked); - - $pool = $this->repositorySet->createPoolForPackage('A'); - - $literals = array($packageA->getId(), $packageAInstalled->getId()); - $expected = array($packageA->getId()); - - $selected = $this->policy->selectPreferredPackages($pool, $literals); - - $this->assertSame($expected, $selected); - } - - public function testSelectFirstRepo() - { - $otherRepository = new ArrayRepository; - - $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); - $otherRepository->addPackage($packageAImportant = $this->getPackage('A', '1.0')); - - $this->repositorySet->addRepository($otherRepository); - $this->repositorySet->addRepository($this->repo); - $this->repositorySet->addRepository($this->repoLocked); - - $pool = $this->repositorySet->createPoolForPackage('A'); - - $literals = array($packageA->getId(), $packageAImportant->getId()); - $expected = array($packageAImportant->getId()); - - $selected = $this->policy->selectPreferredPackages($pool, $literals); - - $this->assertSame($expected, $selected); - } - public function testRepositoryOrderingAffectsPriority() { $repo1 = new ArrayRepository;