|
@@ -28,6 +28,9 @@ class RuleSetGenerator
|
|
|
protected $installedMap;
|
|
|
protected $whitelistedMap;
|
|
|
protected $addedMap;
|
|
|
+ protected $conflictAddedMap;
|
|
|
+ protected $addedPackages;
|
|
|
+ protected $addedPackagesByNames;
|
|
|
|
|
|
public function __construct(PolicyInterface $policy, Pool $pool)
|
|
|
{
|
|
@@ -185,6 +188,7 @@ class RuleSetGenerator
|
|
|
$workQueue->enqueue($package);
|
|
|
|
|
|
while (!$workQueue->isEmpty()) {
|
|
|
+ /** @var PackageInterface $package */
|
|
|
$package = $workQueue->dequeue();
|
|
|
if (isset($this->addedMap[$package->id])) {
|
|
|
continue;
|
|
@@ -192,6 +196,11 @@ class RuleSetGenerator
|
|
|
|
|
|
$this->addedMap[$package->id] = true;
|
|
|
|
|
|
+ $this->addedPackages[] = $package;
|
|
|
+ foreach ($package->getNames() as $name) {
|
|
|
+ $this->addedPackagesByNames[$name][] = $package;
|
|
|
+ }
|
|
|
+
|
|
|
foreach ($package->getRequires() as $link) {
|
|
|
if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $link->getTarget())) {
|
|
|
continue;
|
|
@@ -206,11 +215,41 @@ class RuleSetGenerator
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ $packageName = $package->getName();
|
|
|
+ $obsoleteProviders = $this->pool->whatProvides($packageName, null);
|
|
|
+
|
|
|
+ foreach ($obsoleteProviders as $provider) {
|
|
|
+ if ($provider === $package) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (($package instanceof AliasPackage) && $package->getAliasOf() === $provider) {
|
|
|
+ $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, array($provider), Rule::RULE_PACKAGE_ALIAS, $package));
|
|
|
+ } elseif (!$this->obsoleteImpossibleForAlias($package, $provider)) {
|
|
|
+ $reason = ($packageName == $provider->getName()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES;
|
|
|
+ $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $provider, $reason, $package));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function addConflictRules()
|
|
|
+ {
|
|
|
+ /** @var PackageInterface $package */
|
|
|
+ foreach ($this->addedPackages as $package) {
|
|
|
foreach ($package->getConflicts() as $link) {
|
|
|
- $possibleConflicts = $this->pool->whatProvides($link->getTarget(), $link->getConstraint());
|
|
|
+ if (!isset($this->addedPackagesByNames[$link->getTarget()])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** @var PackageInterface $possibleConflict */
|
|
|
+ foreach ($this->addedPackagesByNames[$link->getTarget()] as $possibleConflict) {
|
|
|
+ $conflictMatch = $this->pool->match($possibleConflict, $link->getTarget(), $link->getConstraint(), true);
|
|
|
+
|
|
|
+ if ($conflictMatch === Pool::MATCH || $conflictMatch === Pool::MATCH_REPLACE) {
|
|
|
+ $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $possibleConflict, Rule::RULE_PACKAGE_CONFLICT, $link));
|
|
|
+ }
|
|
|
|
|
|
- foreach ($possibleConflicts as $conflict) {
|
|
|
- $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $conflict, Rule::RULE_PACKAGE_CONFLICT, $link));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -218,9 +257,12 @@ class RuleSetGenerator
|
|
|
$isInstalled = isset($this->installedMap[$package->id]);
|
|
|
|
|
|
foreach ($package->getReplaces() as $link) {
|
|
|
- $obsoleteProviders = $this->pool->whatProvides($link->getTarget(), $link->getConstraint());
|
|
|
+ if (!isset($this->addedPackagesByNames[$link->getTarget()])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- foreach ($obsoleteProviders as $provider) {
|
|
|
+ /** @var PackageInterface $possibleConflict */
|
|
|
+ foreach ($this->addedPackagesByNames[$link->getTarget()] as $provider) {
|
|
|
if ($provider === $package) {
|
|
|
continue;
|
|
|
}
|
|
@@ -231,22 +273,6 @@ class RuleSetGenerator
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- $packageName = $package->getName();
|
|
|
- $obsoleteProviders = $this->pool->whatProvides($packageName, null);
|
|
|
-
|
|
|
- foreach ($obsoleteProviders as $provider) {
|
|
|
- if ($provider === $package) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (($package instanceof AliasPackage) && $package->getAliasOf() === $provider) {
|
|
|
- $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, array($provider), Rule::RULE_PACKAGE_ALIAS, $package));
|
|
|
- } elseif (!$this->obsoleteImpossibleForAlias($package, $provider)) {
|
|
|
- $reason = ($packageName == $provider->getName()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES;
|
|
|
- $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $provider, $reason, $package));
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -327,12 +353,20 @@ class RuleSetGenerator
|
|
|
$this->pool->setWhitelist($this->whitelistedMap);
|
|
|
|
|
|
$this->addedMap = array();
|
|
|
+ $this->conflictAddedMap = array();
|
|
|
+ $this->addedPackages = array();
|
|
|
+ $this->addedPackagesByNames = array();
|
|
|
foreach ($this->installedMap as $package) {
|
|
|
$this->addRulesForPackage($package, $ignorePlatformReqs);
|
|
|
}
|
|
|
|
|
|
$this->addRulesForJobs($ignorePlatformReqs);
|
|
|
|
|
|
+ $this->addConflictRules();
|
|
|
+
|
|
|
+ // Remove references to packages
|
|
|
+ $this->addedPackages = $this->addedPackagesByNames = null;
|
|
|
+
|
|
|
return $this->rules;
|
|
|
}
|
|
|
}
|