Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. ComposerRepository.php

function ComposerRepository::loadPackages

Overrides ArrayRepository::loadPackages

File

vendor/composer/composer/src/Composer/Repository/ComposerRepository.php, line 480

Class

ComposerRepository
@author Jordi Boggiano <j.boggiano@seld.be>

Namespace

Composer\Repository

Code

public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) {
    // this call initializes loadRootServerFile which is needed for the rest below to work
    $hasProviders = $this->hasProviders();
    if (!$hasProviders && !$this->hasPartialPackages() && null === $this->lazyProvidersUrl) {
        return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded);
    }
    $packages = [];
    $namesFound = [];
    if ($hasProviders || $this->hasPartialPackages()) {
        foreach ($packageNameMap as $name => $constraint) {
            $matches = [];
            // if a repo has no providers but only partial packages and the partial packages are missing
            // then we don't want to call whatProvides as it would try to load from the providers and fail
            if (!$hasProviders && !isset($this->partialPackagesByName[$name])) {
                continue;
            }
            $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())])) {
                        $matches[spl_object_hash($candidate->getAliasOf())] = $candidate->getAliasOf();
                    }
                }
            }
            // add aliases of matched packages even if they did not match the constraint
            foreach ($candidates as $candidate) {
                if ($candidate instanceof AliasPackage) {
                    if (isset($matches[spl_object_hash($candidate->getAliasOf())])) {
                        $matches[spl_object_hash($candidate)] = $candidate;
                    }
                }
            }
            $packages = array_merge($packages, $matches);
            unset($packageNameMap[$name]);
        }
    }
    if ($this->lazyProvidersUrl && count($packageNameMap)) {
        if ($this->hasAvailablePackageList) {
            foreach ($packageNameMap as $name => $constraint) {
                if (!$this->lazyProvidersRepoContains(strtolower($name))) {
                    unset($packageNameMap[$name]);
                }
            }
        }
        $result = $this->loadAsyncPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded);
        $packages = array_merge($packages, $result['packages']);
        $namesFound = array_merge($namesFound, $result['namesFound']);
    }
    return [
        'namesFound' => array_keys($namesFound),
        'packages' => $packages,
    ];
}
RSS feed
Powered by Drupal