function DefaultPolicy::selectPreferredPackages
Parameters
non-empty-list<int> $literals:
Return value
non-empty-list<int>
Overrides PolicyInterface::selectPreferredPackages
File
-
vendor/
composer/ composer/ src/ Composer/ DependencyResolver/ DefaultPolicy.php, line 74
Class
- DefaultPolicy
- @author Nils Adermann <naderman@naderman.de> @author Jordi Boggiano <j.boggiano@seld.be>
Namespace
Composer\DependencyResolverCode
public function selectPreferredPackages(Pool $pool, array $literals, ?string $requiredPackage = null) : array {
sort($literals);
$resultCacheKey = implode(',', $literals) . $requiredPackage;
$poolId = spl_object_id($pool);
if (isset($this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey])) {
return $this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey];
}
$packages = $this->groupLiteralsByName($pool, $literals);
foreach ($packages as &$nameLiterals) {
usort($nameLiterals, function ($a, $b) use ($pool, $requiredPackage, $poolId) : int {
$cacheKey = 'i' . $a . '.' . $b . $requiredPackage;
// i prefix -> ignoreReplace = true
if (isset($this->sortingCachePerPool[$poolId][$cacheKey])) {
return $this->sortingCachePerPool[$poolId][$cacheKey];
}
return $this->sortingCachePerPool[$poolId][$cacheKey] = $this->compareByPriority($pool, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage, true);
});
}
foreach ($packages as &$sortedLiterals) {
$sortedLiterals = $this->pruneToBestVersion($pool, $sortedLiterals);
$sortedLiterals = $this->pruneRemoteAliases($pool, $sortedLiterals);
}
$selected = array_merge(...array_values($packages));
// now sort the result across all packages to respect replaces across packages
usort($selected, function ($a, $b) use ($pool, $requiredPackage, $poolId) : int {
$cacheKey = $a . '.' . $b . $requiredPackage;
// no i prefix -> ignoreReplace = false
if (isset($this->sortingCachePerPool[$poolId][$cacheKey])) {
return $this->sortingCachePerPool[$poolId][$cacheKey];
}
return $this->sortingCachePerPool[$poolId][$cacheKey] = $this->compareByPriority($pool, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage);
});
return $this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey] = $selected;
}