function Problem::formatDeduplicatedRules
@internal
Parameters
Rule[] $rules:
array<int|string, BasePackage> $installedMap A map of all present packages:
array<Rule[]> $learnedPool:
1 call to Problem::formatDeduplicatedRules()
- Problem::getPrettyString in vendor/
composer/ composer/ src/ Composer/ DependencyResolver/ Problem.php - A human readable textual representation of the problem's reasons
File
-
vendor/
composer/ composer/ src/ Composer/ DependencyResolver/ Problem.php, line 161
Class
- Problem
- Represents a problem detected while solving dependencies
Namespace
Composer\DependencyResolverCode
public static function formatDeduplicatedRules(array $rules, string $indent, RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []) : string {
$messages = [];
$templates = [];
$parser = new VersionParser();
$deduplicatableRuleTypes = [
Rule::RULE_PACKAGE_REQUIRES,
Rule::RULE_PACKAGE_CONFLICT,
];
foreach ($rules as $rule) {
$message = $rule->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool);
if (in_array($rule->getReason(), $deduplicatableRuleTypes, true) && Preg::isMatchStrictGroups('{^(?P<package>\\S+) (?P<version>\\S+) (?P<type>requires|conflicts)}', $message, $m)) {
$message = str_replace('%', '%%', $message);
$template = Preg::replace('{^\\S+ \\S+ }', '%s%s ', $message);
$messages[] = $template;
$templates[$template][$m[1]][$parser->normalize($m[2])] = $m[2];
$sourcePackage = $rule->getSourcePackage($pool);
foreach ($pool->getRemovedVersionsByPackage(spl_object_hash($sourcePackage)) as $version => $prettyVersion) {
$templates[$template][$m[1]][$version] = $prettyVersion;
}
}
elseif ($message !== '') {
$messages[] = $message;
}
}
$result = [];
foreach (array_unique($messages) as $message) {
if (isset($templates[$message])) {
foreach ($templates[$message] as $package => $versions) {
uksort($versions, 'version_compare');
if (!$isVerbose) {
$versions = self::condenseVersionList($versions, 1);
}
if (\count($versions) > 1) {
// remove the s from requires/conflicts to correct grammar
$message = Preg::replace('{^(%s%s (?:require|conflict))s}', '$1', $message);
$result[] = sprintf($message, $package, '[' . implode(', ', $versions) . ']');
}
else {
$result[] = sprintf($message, $package, ' ' . reset($versions));
}
}
}
else {
$result[] = $message;
}
}
return "\n{$indent}- " . implode("\n{$indent}- ", $result);
}