mirror of
https://github.com/composer/composer
synced 2025-05-10 17:12:51 +00:00
Avoid loading same packages multiple times
This commit is contained in:
parent
3577070efa
commit
22367a68f9
8 changed files with 39 additions and 24 deletions
|
@ -340,13 +340,13 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
return $names;
|
||||
}
|
||||
|
||||
public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags)
|
||||
public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array())
|
||||
{
|
||||
// this call initializes loadRootServerFile which is needed for the rest below to work
|
||||
$hasProviders = $this->hasProviders();
|
||||
|
||||
if (!$hasProviders && !$this->hasPartialPackages() && !$this->lazyProvidersUrl) {
|
||||
return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags);
|
||||
return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded);
|
||||
}
|
||||
|
||||
$packages = array();
|
||||
|
@ -362,12 +362,13 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
continue;
|
||||
}
|
||||
|
||||
$candidates = $this->whatProvides($name, $acceptableStabilities, $stabilityFlags);
|
||||
$candidates = $this->whatProvides($name, $acceptableStabilities, $stabilityFlags, $alreadyLoaded);
|
||||
foreach ($candidates as $candidate) {
|
||||
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())])) {
|
||||
|
@ -400,7 +401,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
}
|
||||
}
|
||||
|
||||
$result = $this->loadAsyncPackages($packageNameMap, $acceptableStabilities, $stabilityFlags);
|
||||
$result = $this->loadAsyncPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded);
|
||||
$packages = array_merge($packages, $result['packages']);
|
||||
$namesFound = array_merge($namesFound, $result['namesFound']);
|
||||
}
|
||||
|
@ -530,7 +531,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
* @param string $name package name
|
||||
* @return array|mixed
|
||||
*/
|
||||
private function whatProvides($name, array $acceptableStabilities = null, array $stabilityFlags = null)
|
||||
private function whatProvides($name, array $acceptableStabilities = null, array $stabilityFlags = null, array $alreadyLoaded = array())
|
||||
{
|
||||
if (!$this->hasPartialPackages() || !isset($this->partialPackagesByName[$name])) {
|
||||
// skip platform packages, root package and composer-plugin-api
|
||||
|
@ -622,6 +623,11 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
$version['version_normalized'] = $this->versionParser->normalize($version['version']);
|
||||
}
|
||||
|
||||
// avoid loading packages which have already been loaded
|
||||
if (isset($alreadyLoaded[$name][$version['version_normalized']])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->isVersionAcceptable(null, $normalizedName, $version, $acceptableStabilities, $stabilityFlags)) {
|
||||
$versionsToLoad[$version['uid']] = $version;
|
||||
}
|
||||
|
@ -679,7 +685,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
/**
|
||||
* @param array $packageNames array of package name => ConstraintInterface|null - if a constraint is provided, only packages matching it will be loaded
|
||||
*/
|
||||
private function loadAsyncPackages(array $packageNames, array $acceptableStabilities = null, array $stabilityFlags = null)
|
||||
private function loadAsyncPackages(array $packageNames, array $acceptableStabilities = null, array $stabilityFlags = null, array $alreadyLoaded = array())
|
||||
{
|
||||
$this->loadRootServerFile();
|
||||
|
||||
|
@ -722,7 +728,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
}
|
||||
|
||||
$promises[] = $this->asyncFetchFile($url, $cacheKey, $lastModified)
|
||||
->then(function ($response) use (&$packages, &$namesFound, $contents, $realName, $constraint, $repo, $acceptableStabilities, $stabilityFlags) {
|
||||
->then(function ($response) use (&$packages, &$namesFound, $contents, $realName, $constraint, $repo, $acceptableStabilities, $stabilityFlags, $alreadyLoaded) {
|
||||
if (true === $response) {
|
||||
$response = $contents;
|
||||
}
|
||||
|
@ -747,6 +753,11 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
$version['version_normalized'] = $repo->versionParser->normalize($version['version']);
|
||||
}
|
||||
|
||||
// avoid loading packages which have already been loaded
|
||||
if (isset($alreadyLoaded[$realName][$version['version_normalized']])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($repo->isVersionAcceptable($constraint, $realName, $version, $acceptableStabilities, $stabilityFlags)) {
|
||||
$versionsToLoad[] = $version;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue