From a3f9accd37852bb2a85a44e31e35fe1fc2b3b3b0 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 13 Oct 2012 18:54:48 +0200 Subject: [PATCH] Fix various dumb issues --- src/Composer/DependencyResolver/Pool.php | 4 +-- .../Repository/ComposerRepository.php | 28 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Composer/DependencyResolver/Pool.php b/src/Composer/DependencyResolver/Pool.php index 95c49ded8..fd34897f2 100644 --- a/src/Composer/DependencyResolver/Pool.php +++ b/src/Composer/DependencyResolver/Pool.php @@ -219,7 +219,7 @@ class Pool $candidates = array(); foreach ($this->composerRepos as $repo) { - foreach ($repo->whatProvides($name) as $candidate) { + foreach ($repo->whatProvides($this, $name) as $candidate) { $candidates[] = $candidate; if ($candidate->getId() < 1) { $candidate->setId($this->id++); @@ -307,7 +307,7 @@ class Pool return $prefix.' '.$package->getPrettyString(); } - private function isPackageAcceptable($name, $stability) + public function isPackageAcceptable($name, $stability) { // allow if package matches the global stability requirement and has no exception if (!isset($this->stabilityFlags[$name]) && isset($this->acceptableStabilities[$stability])) { diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index a5024189c..5ebb1357f 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -14,7 +14,9 @@ namespace Composer\Repository; use Composer\Package\Loader\ArrayLoader; use Composer\Package\PackageInterface; +use Composer\Package\AliasPackage; use Composer\Package\Version\VersionParser; +use Composer\DependencyResolver\Pool; use Composer\Json\JsonFile; use Composer\Cache; use Composer\Config; @@ -194,7 +196,7 @@ class ComposerRepository extends ArrayRepository implements NotifiableRepository return null !== $this->providersUrl; } - public function whatProvides($name) + public function whatProvides(Pool $pool, $name) { if ($name === 'php' || in_array(substr($name, 0, 4), array('ext-', 'lib-'), true) || $name === '__root__') { return array(); @@ -216,22 +218,38 @@ class ComposerRepository extends ArrayRepository implements NotifiableRepository } $this->providers[$name] = array(); - foreach ($packages['packages'] as $name => $versions) { + foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { + // avoid loading the same objects twice if (isset($this->providersByUid[$version['uid']])) { - $this->providers[$name][] = $this->providersByUid[$version['uid']]; + // skip if already assigned + if (!isset($this->providers[$name][$version['uid']])) { + // expand alias in two packages + if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { + $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); + $this->providers[$name][$version['uid'].'-alias'] = $this->providersByUid[$version['uid']]; + } else { + $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; + } + } } else { + if (!$pool->isPackageAcceptable($version['name'], VersionParser::parseStability($version['version']))) { + continue; + } + + // load acceptable packages in the providers $package = $this->createPackage($version, 'Composer\Package\Package'); $package->setRepository($this); - $this->providers[$name][] = $package; + $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; if ($package->getAlias()) { $alias = $this->createAliasPackage($package); $alias->setRepository($this); - $this->providers[$name][] = $alias; + $this->providers[$name][$version['uid'].'-alias'] = $alias; + // override provider with its alias so it can be expanded in the if block above $this->providersByUid[$version['uid']] = $alias; } }