mirror of
https://github.com/composer/composer
synced 2025-05-10 17:12:51 +00:00
List identical/compatible removed versions in problem output as if they had not been removed
This commit is contained in:
parent
34183f49f9
commit
ce2a40b259
8 changed files with 204 additions and 77 deletions
|
@ -228,6 +228,41 @@ abstract class Rule
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @return BasePackage
|
||||
*/
|
||||
public function getSourcePackage(Pool $pool)
|
||||
{
|
||||
$literals = $this->getLiterals();
|
||||
|
||||
switch ($this->getReason()) {
|
||||
case self::RULE_PACKAGE_CONFLICT:
|
||||
$package1 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[0]));
|
||||
$package2 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1]));
|
||||
|
||||
$conflictTarget = $package1->getPrettyString();
|
||||
if ($reasonData = $this->getReasonData()) {
|
||||
// swap literals if they are not in the right order with package2 being the conflicter
|
||||
if ($reasonData->getSource() === $package1->getName()) {
|
||||
list($package2, $package1) = array($package1, $package2);
|
||||
}
|
||||
}
|
||||
|
||||
return $package2;
|
||||
|
||||
case self::RULE_PACKAGE_REQUIRES:
|
||||
$sourceLiteral = array_shift($literals);
|
||||
$sourcePackage = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($sourceLiteral));
|
||||
|
||||
return $sourcePackage;
|
||||
|
||||
default:
|
||||
throw new \LogicException('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool $isVerbose
|
||||
* @param BasePackage[] $installedMap
|
||||
|
@ -258,7 +293,7 @@ abstract class Rule
|
|||
}
|
||||
}
|
||||
|
||||
return 'Root composer.json requires '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : '').' -> satisfiable by '.$this->formatPackagesUnique($pool, $packages, $isVerbose).'.';
|
||||
return 'Root composer.json requires '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : '').' -> satisfiable by '.$this->formatPackagesUnique($pool, $packages, $isVerbose, $constraint).'.';
|
||||
|
||||
case self::RULE_FIXED:
|
||||
$package = $this->deduplicateDefaultBranchAlias($this->reasonData['package']);
|
||||
|
@ -320,7 +355,7 @@ abstract class Rule
|
|||
|
||||
$text = $reasonData->getPrettyString($sourcePackage);
|
||||
if ($requires) {
|
||||
$text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires, $isVerbose) . '.';
|
||||
$text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires, $isVerbose, $this->reasonData->getConstraint()) . '.';
|
||||
} else {
|
||||
$targetName = $reasonData->getTarget();
|
||||
|
||||
|
@ -368,13 +403,13 @@ abstract class Rule
|
|||
}
|
||||
|
||||
if ($installedPackages && $removablePackages) {
|
||||
return $this->formatPackagesUnique($pool, $removablePackages, $isVerbose).' cannot be installed as that would require removing '.$this->formatPackagesUnique($pool, $installedPackages, $isVerbose).'. '.$reason;
|
||||
return $this->formatPackagesUnique($pool, $removablePackages, $isVerbose, null, true).' cannot be installed as that would require removing '.$this->formatPackagesUnique($pool, $installedPackages, $isVerbose, null, true).'. '.$reason;
|
||||
}
|
||||
|
||||
return 'Only one of these can be installed: '.$this->formatPackagesUnique($pool, $literals, $isVerbose).'. '.$reason;
|
||||
return 'Only one of these can be installed: '.$this->formatPackagesUnique($pool, $literals, $isVerbose, null, true).'. '.$reason;
|
||||
}
|
||||
|
||||
return 'You can only install one version of a package, so only one of these can be installed: ' . $this->formatPackagesUnique($pool, $literals, $isVerbose) . '.';
|
||||
return 'You can only install one version of a package, so only one of these can be installed: ' . $this->formatPackagesUnique($pool, $literals, $isVerbose, null, true) . '.';
|
||||
case self::RULE_LEARNED:
|
||||
/** @TODO currently still generates way too much output to be helpful, and in some cases can even lead to endless recursion */
|
||||
// if (isset($learnedPool[$this->reasonData])) {
|
||||
|
@ -445,9 +480,10 @@ abstract class Rule
|
|||
/**
|
||||
* @param array<int|BasePackage> $packages An array containing packages or literals
|
||||
* @param bool $isVerbose
|
||||
* @param bool $useRemovedVersionGroup
|
||||
* @return string
|
||||
*/
|
||||
protected function formatPackagesUnique(Pool $pool, array $packages, $isVerbose)
|
||||
protected function formatPackagesUnique(Pool $pool, array $packages, $isVerbose, ConstraintInterface $constraint = null, $useRemovedVersionGroup = false)
|
||||
{
|
||||
foreach ($packages as $index => $package) {
|
||||
if (!\is_object($package)) {
|
||||
|
@ -455,7 +491,7 @@ abstract class Rule
|
|||
}
|
||||
}
|
||||
|
||||
return Problem::getPackageList($packages, $isVerbose);
|
||||
return Problem::getPackageList($packages, $isVerbose, $pool, $constraint, $useRemovedVersionGroup);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue