Add conflict detection in why-not, fixes #5013
parent
a15779cf53
commit
3933a7f404
|
@ -18,6 +18,7 @@ use Composer\Package\PackageInterface;
|
||||||
use Composer\Repository\ArrayRepository;
|
use Composer\Repository\ArrayRepository;
|
||||||
use Composer\Repository\CompositeRepository;
|
use Composer\Repository\CompositeRepository;
|
||||||
use Composer\Repository\PlatformRepository;
|
use Composer\Repository\PlatformRepository;
|
||||||
|
use Composer\Repository\RepositoryFactory;
|
||||||
use Composer\Plugin\CommandEvent;
|
use Composer\Plugin\CommandEvent;
|
||||||
use Composer\Plugin\PluginEvents;
|
use Composer\Plugin\PluginEvents;
|
||||||
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||||
|
@ -93,6 +94,15 @@ class BaseDependencyCommand extends BaseCommand
|
||||||
throw new \InvalidArgumentException(sprintf('Could not find package "%s" in your project', $needle));
|
throw new \InvalidArgumentException(sprintf('Could not find package "%s" in your project', $needle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the version we ask for is not installed then we need to locate it in remote repos and add it.
|
||||||
|
// This is needed for why-not to resolve conflicts from an uninstalled version against installed packages.
|
||||||
|
if (!$repository->findPackage($needle, $textConstraint)) {
|
||||||
|
$defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO()));
|
||||||
|
if ($match = $defaultRepos->findPackage($needle, $textConstraint)) {
|
||||||
|
$repository->addRepository(new ArrayRepository(array(clone $match)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Include replaced packages for inverted lookups as they are then the actual starting point to consider
|
// Include replaced packages for inverted lookups as they are then the actual starting point to consider
|
||||||
$needles = array($needle);
|
$needles = array($needle);
|
||||||
if ($inverted) {
|
if ($inverted) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace Composer\Repository;
|
||||||
|
|
||||||
use Composer\Package\RootPackageInterface;
|
use Composer\Package\RootPackageInterface;
|
||||||
use Composer\Semver\Constraint\ConstraintInterface;
|
use Composer\Semver\Constraint\ConstraintInterface;
|
||||||
|
use Composer\Semver\Constraint\Constraint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common ancestor class for generic repository functionality.
|
* Common ancestor class for generic repository functionality.
|
||||||
|
@ -80,6 +81,18 @@ abstract class BaseRepository implements RepositoryInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When inverting, we need to check for conflicts of the needles against installed packages
|
||||||
|
if ($invert && in_array($package->getName(), $needles)) {
|
||||||
|
foreach ($package->getConflicts() as $link) {
|
||||||
|
foreach ($this->findPackages($link->getTarget()) as $pkg) {
|
||||||
|
$version = new Constraint('=', $pkg->getVersion());
|
||||||
|
if ($link->getConstraint()->matches($version) === $invert) {
|
||||||
|
$results[$package->getName()] = array($package, $link, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ksort($results);
|
ksort($results);
|
||||||
|
|
Loading…
Reference in New Issue