From a5d5270a7e8db39baf141bccdfc4c4875ed0f1db Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 4 Dec 2018 17:37:39 +0100 Subject: [PATCH] Make sure other providers of a name are never loaded --- .../Repository/ComposerRepository.php | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index ff2895564..420bde535 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -136,7 +136,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito if ($this->lazyProvidersUrl) { if ($this->hasPartialPackages() && isset($this->partialPackagesByName[$name])) { - return $this->filterPackages($this->whatProvides($name), $name, $constraint, true); + return $this->filterPackages($this->whatProvides($name), $constraint, true); } return $this->loadAsyncPackages(array($name => $constraint), function ($name, $stability) { @@ -150,7 +150,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { - return $this->filterPackages($this->whatProvides($providerName), $name, $constraint, true); + return $this->filterPackages($this->whatProvides($providerName), $constraint, true); } } } @@ -170,7 +170,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito if ($this->lazyProvidersUrl) { if ($this->hasPartialPackages() && isset($this->partialPackagesByName[$name])) { - return $this->filterPackages($this->whatProvides($name), $name, $constraint); + return $this->filterPackages($this->whatProvides($name), $constraint); } return $this->loadAsyncPackages(array($name => $constraint ?: new EmptyConstraint()), function ($name, $stability) { @@ -184,22 +184,18 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { - return $this->filterPackages($this->whatProvides($providerName), $name, $constraint); + return $this->filterPackages($this->whatProvides($providerName), $constraint); } } return array(); } - private function filterPackages(array $packages, $name, $constraint = null, $returnFirstMatch = false) + private function filterPackages(array $packages, $constraint = null, $returnFirstMatch = false) { $packages = array(); foreach ($packages as $package) { - // TODO this check can be removed once providers are only what really has that name anyway - if ($name !== $package->getName()) { - continue; - } $pkgConstraint = new Constraint('==', $package->getVersion()); if (null === $constraint || $constraint->matches($pkgConstraint)) { @@ -452,7 +448,14 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito foreach ($packages['packages'] as $versions) { $versionsToLoad = array(); foreach ($versions as $version) { - if (!$loadingPartialPackage && $this->hasPartialPackages() && isset($this->partialPackagesByName[$version['name']])) { + $normalizedName = strtolower($version['name']); + + // only load the actual named package, not other packages that might find themselves in the same file + if ($normalizedName !== $name) { + continue; + } + + if (!$loadingPartialPackage && $this->hasPartialPackages() && isset($this->partialPackagesByName[$normalizedName])) { continue; } @@ -473,7 +476,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito } } } else { - if ($isPackageAcceptableCallable && !call_user_func($isPackageAcceptableCallable, strtolower($version['name']), VersionParser::parseStability($version['version']))) { + if ($isPackageAcceptableCallable && !call_user_func($isPackageAcceptableCallable, $normalizedName, VersionParser::parseStability($version['version']))) { continue; } @@ -830,7 +833,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito public function createPackages(array $packages, $class = 'Composer\Package\CompletePackage') { if (!$packages) { - return; + return array(); } try { @@ -1110,19 +1113,8 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito $this->partialPackagesByName = array(); foreach ($rootData['packages'] as $package => $versions) { - $package = strtolower($package); foreach ($versions as $version) { - $this->partialPackagesByName[$package][] = $version; - if (!empty($version['provide']) && is_array($version['provide'])) { - foreach ($version['provide'] as $provided => $providedVersion) { - $this->partialPackagesByName[strtolower($provided)][] = $version; - } - } - if (!empty($version['replace']) && is_array($version['replace'])) { - foreach ($version['replace'] as $provided => $providedVersion) { - $this->partialPackagesByName[strtolower($provided)][] = $version; - } - } + $this->partialPackagesByName[strtolower($version['name'])][] = $version; } }