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

Breadcrumb

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

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\DependencyResolver

Code

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);
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal