From 261efe1e8e957151b910d433721e0cecd818354e Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Wed, 12 Sep 2018 14:11:26 +0200 Subject: [PATCH] Implement loadPackages on Composer repositories with providers --- .../DependencyResolver/PoolBuilder.php | 5 ++++- src/Composer/Repository/BaseRepository.php | 4 ++-- .../Repository/ComposerRepository.php | 20 +++++++++++++++++++ .../Repository/RepositoryInterface.php | 3 ++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 2ec6dd680..32e14e983 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -16,6 +16,7 @@ use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Repository\AsyncRepositoryInterface; +use Composer\Repository\ComposerRepository; use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\LockArrayRepository; use Composer\Repository\PlatformRepository; @@ -83,9 +84,11 @@ class PoolBuilder } if ($repository instanceof AsyncRepositoryInterface) { + // TODO ispackageacceptablecallable in here? $packages = $repository->returnPackages($loadIds[$key]); } else { - $packages = $repository->loadPackages($loadNames); + // TODO should we really pass the callable into here? + $packages = $repository->loadPackages($loadNames, $this->isPackageAcceptableCallable); } foreach ($packages as $package) { diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index e9e97bb91..172fe16b8 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -25,13 +25,13 @@ use Composer\Package\Link; abstract class BaseRepository implements RepositoryInterface { // TODO should this stay here? some repos need a better implementation - public function loadPackages(array $packageNameMap) + public function loadPackages(array $packageNameMap, $isPackageAcceptableCallable) { $packages = $this->getPackages(); $result = array(); foreach ($packages as $package) { - if (isset($packageNameMap[$package->getName()])) { + if (isset($packageNameMap[$package->getName()]) && call_user_func($isPackageAcceptableCallable, $package->getNames(), $package->getStability())) { $result[] = $package; } } diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index ea583ede6..739027628 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -194,6 +194,26 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito return parent::getPackages(); } + public function loadPackages(array $packageNameMap, $isPackageAcceptableCallable) + { + if (!$this->hasProviders()) { + // TODO build more efficient version of this + return parent::loadPackages($packageNameMap, $isPackageAcceptableCallable); + } + + $packages = array(); + foreach ($packageNameMap as $name => $void) { + $matches = array(); + foreach ($this->whatProvides($name, false, $isPackageAcceptableCallable) as $match) { + if ($match->getName() === $name) { + $matches[] = $match; + } + } + $packages = array_merge($packages, $matches); + } + return $packages; + } + /** * {@inheritDoc} */ diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index 703f92e35..55b76d33d 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -67,9 +67,10 @@ interface RepositoryInterface extends \Countable * Returns list of registered packages with the supplied name * * @param bool[] $packageNameMap + * @param $isPackageAcceptableCallable * @return PackageInterface[] */ - public function loadPackages(array $packageNameMap); + public function loadPackages(array $packageNameMap, $isPackageAcceptableCallable); /** * Searches the repository for packages containing the query