From 5bdc0fc9c5cc107d889dbbce30e2e4483673f2c5 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Sun, 19 Jan 2020 23:11:36 +0100 Subject: [PATCH] Request jobs replaced by root require / fixed package The only type of request job remaining was "install" which is really a root requirement. The only other kind of input for the solver is now a set of fixed packages. Rules have been updated to account for only two kinds of former job reason: FIXED or ROOT_REQUIRE. The job property has always been redundant and has been removed, since reasonData suffices. Problem reasons are always rules, so the unnecessary wrapping in an array has been removed. We now only ever generate a single rule per root require or fixed package, so there is no need for the solver to special handle disabling "jobs" anymore, the rule can just be disabled as usual. For consistency special handling of rules for jobs in problems has been integrated into the rule class like all other rule reasons. As part of this change the error message for root requirements has been improved a bit to make it clearer where the package installation request came from. The word job has also been removed from operations, which are called operations, not jobs. --- .../DependencyResolver/GenericRule.php | 5 +- .../DependencyResolver/MultiConflictRule.php | 5 +- .../Operation/InstallOperation.php | 4 +- .../Operation/MarkAliasInstalledOperation.php | 4 +- .../MarkAliasUninstalledOperation.php | 4 +- .../Operation/OperationInterface.php | 4 +- .../Operation/UninstallOperation.php | 4 +- .../Operation/UpdateOperation.php | 4 +- .../DependencyResolver/PoolBuilder.php | 22 ++--- src/Composer/DependencyResolver/Problem.php | 81 ++++----------- src/Composer/DependencyResolver/Request.php | 22 ++--- src/Composer/DependencyResolver/Rule.php | 53 ++++++---- .../DependencyResolver/Rule2Literals.php | 5 +- src/Composer/DependencyResolver/RuleSet.php | 4 +- .../DependencyResolver/RuleSetGenerator.php | 59 ++++------- src/Composer/DependencyResolver/Solver.php | 62 ++++-------- .../SolverProblemsException.php | 4 +- .../DependencyResolver/Transaction.php | 2 +- src/Composer/Installer.php | 13 ++- .../Installer/InstallationManager.php | 38 +++---- src/Composer/Package/Link.php | 2 +- src/Composer/Repository/RepositorySet.php | 2 +- .../DependencyResolver/PoolBuilderTest.php | 2 +- .../Test/DependencyResolver/RequestTest.php | 12 +-- .../RuleSetIteratorTest.php | 14 +-- .../Test/DependencyResolver/RuleSetTest.php | 62 ++++++------ .../Test/DependencyResolver/RuleTest.php | 33 ++++--- .../Test/DependencyResolver/SolverTest.php | 98 +++++++++---------- .../DependencyResolver/TransactionTest.php | 4 +- .../installer/broken-deps-do-not-replace.test | 2 +- .../installer/github-issues-4319.test | 2 +- .../Fixtures/installer/solver-problems.test | 2 +- .../Test/Mock/InstallationManagerMock.php | 2 +- 33 files changed, 271 insertions(+), 365 deletions(-) diff --git a/src/Composer/DependencyResolver/GenericRule.php b/src/Composer/DependencyResolver/GenericRule.php index eb753067e..a07883872 100644 --- a/src/Composer/DependencyResolver/GenericRule.php +++ b/src/Composer/DependencyResolver/GenericRule.php @@ -26,11 +26,10 @@ class GenericRule extends Rule * @param array $literals * @param int|null $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface|int|null $reasonData - * @param array $job The job this rule was created from */ - public function __construct(array $literals, $reason, $reasonData, $job = null) + public function __construct(array $literals, $reason, $reasonData) { - parent::__construct($reason, $reasonData, $job); + parent::__construct($reason, $reasonData); // sort all packages ascending by id sort($literals); diff --git a/src/Composer/DependencyResolver/MultiConflictRule.php b/src/Composer/DependencyResolver/MultiConflictRule.php index f2c27c406..8de77a41b 100644 --- a/src/Composer/DependencyResolver/MultiConflictRule.php +++ b/src/Composer/DependencyResolver/MultiConflictRule.php @@ -28,11 +28,10 @@ class MultiConflictRule extends Rule * @param array $literals * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData - * @param array $job The job this rule was created from */ - public function __construct(array $literals, $reason, $reasonData, $job = null) + public function __construct(array $literals, $reason, $reasonData) { - parent::__construct($reason, $reasonData, $job); + parent::__construct($reason, $reasonData); if (count($literals) < 3) { throw new \RuntimeException("multi conflict rule requires at least 3 literals"); diff --git a/src/Composer/DependencyResolver/Operation/InstallOperation.php b/src/Composer/DependencyResolver/Operation/InstallOperation.php index c451446b5..b719f49f9 100644 --- a/src/Composer/DependencyResolver/Operation/InstallOperation.php +++ b/src/Composer/DependencyResolver/Operation/InstallOperation.php @@ -47,11 +47,11 @@ class InstallOperation extends SolverOperation } /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType() + public function getOperationType() { return 'install'; } diff --git a/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php b/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php index 7cecf565c..e028b3079 100644 --- a/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php +++ b/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php @@ -48,11 +48,11 @@ class MarkAliasInstalledOperation extends SolverOperation } /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType() + public function getOperationType() { return 'markAliasInstalled'; } diff --git a/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php b/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php index c84acf5af..0468f2daf 100644 --- a/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php +++ b/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php @@ -48,11 +48,11 @@ class MarkAliasUninstalledOperation extends SolverOperation } /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType() + public function getOperationType() { return 'markAliasUninstalled'; } diff --git a/src/Composer/DependencyResolver/Operation/OperationInterface.php b/src/Composer/DependencyResolver/Operation/OperationInterface.php index 261a746af..be5e8f7af 100644 --- a/src/Composer/DependencyResolver/Operation/OperationInterface.php +++ b/src/Composer/DependencyResolver/Operation/OperationInterface.php @@ -20,11 +20,11 @@ namespace Composer\DependencyResolver\Operation; interface OperationInterface { /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType(); + public function getOperationType(); /** * Returns operation reason. diff --git a/src/Composer/DependencyResolver/Operation/UninstallOperation.php b/src/Composer/DependencyResolver/Operation/UninstallOperation.php index 0f990e57b..704635b2a 100644 --- a/src/Composer/DependencyResolver/Operation/UninstallOperation.php +++ b/src/Composer/DependencyResolver/Operation/UninstallOperation.php @@ -47,11 +47,11 @@ class UninstallOperation extends SolverOperation } /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType() + public function getOperationType() { return 'uninstall'; } diff --git a/src/Composer/DependencyResolver/Operation/UpdateOperation.php b/src/Composer/DependencyResolver/Operation/UpdateOperation.php index d846f3da1..4764acb7c 100644 --- a/src/Composer/DependencyResolver/Operation/UpdateOperation.php +++ b/src/Composer/DependencyResolver/Operation/UpdateOperation.php @@ -60,11 +60,11 @@ class UpdateOperation extends SolverOperation } /** - * Returns job type. + * Returns operation type. * * @return string */ - public function getJobType() + public function getOperationType() { return 'update'; } diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 9cc6e18c1..bcfc67fea 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -69,20 +69,16 @@ class PoolBuilder } } - foreach ($request->getJobs() as $job) { - switch ($job['cmd']) { - case 'install': - if (isset($this->loadedNames[$job['packageName']])) { - continue 2; - } - // TODO currently lock above is always NULL if we adjust that, this needs to merge constraints - // TODO does it really make sense that we can have install requests for the same package that is actively locked with non-matching constraints? - // also see the solver-problems.test test case - $constraint = array_key_exists($job['packageName'], $loadNames) ? null : $job['constraint']; - $loadNames[$job['packageName']] = $constraint; - $this->nameConstraints[$job['packageName']] = $constraint ? new MultiConstraint(array($constraint), false) : null; - break; + foreach ($request->getRequires() as $packageName => $constraint) { + if (isset($this->loadedNames[$packageName])) { + continue; } + // TODO currently lock above is always NULL if we adjust that, this needs to merge constraints + // TODO does it really make sense that we can have install requests for the same package that is actively locked with non-matching constraints? + // also see the solver-problems.test test case + $constraint = array_key_exists($packageName, $loadNames) ? null : $constraint; + $loadNames[$packageName] = $constraint; + $this->nameConstraints[$packageName] = $constraint ? new MultiConstraint(array($constraint), false) : null; } while (!empty($loadNames)) { diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index 54815995f..130681217 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -28,7 +28,7 @@ class Problem protected $reasonSeen; /** - * A set of reasons for the problem, each is a rule or a job and a rule + * A set of reasons for the problem, each is a rule or a root require and a rule * @var array */ protected $reasons = array(); @@ -49,10 +49,7 @@ class Problem */ public function addRule(Rule $rule) { - $this->addReason(spl_object_hash($rule), array( - 'rule' => $rule, - 'job' => $rule->getJob(), - )); + $this->addReason(spl_object_hash($rule), $rule); } /** @@ -73,16 +70,21 @@ class Problem */ public function getPrettyString(array $installedMap = array(), array $learnedPool = array()) { + // TODO doesn't this entirely defeat the purpose of the problem sections? what's the point of sections? $reasons = call_user_func_array('array_merge', array_reverse($this->reasons)); if (count($reasons) === 1) { reset($reasons); - $reason = current($reasons); + $rule = current($reasons); - $job = $reason['job']; + if (!in_array($rule->getReason(), array(Rule::RULE_ROOT_REQUIRE, Rule::RULE_FIXED), true)) { + throw new \LogicException("Single reason problems must contain a request rule."); + } - $packageName = $job['packageName']; - $constraint = $job['constraint']; + $request = $rule->getReasonData(); + + $packageName = $request['packageName']; + $constraint = $request['constraint']; if (isset($constraint)) { $packages = $this->pool->whatProvides($packageName, $constraint); @@ -90,8 +92,7 @@ class Problem $packages = array(); } - if ($job && ($job['cmd'] === 'install' || $job['cmd'] === 'fix') && empty($packages)) { - + if ($request && empty($packages)) { // handle php/hhvm if ($packageName === 'php' || $packageName === 'php-64bit' || $packageName === 'hhvm') { $version = phpversion(); @@ -164,17 +165,8 @@ class Problem $messages = array(); - foreach ($reasons as $reason) { - $rule = $reason['rule']; - $job = $reason['job']; - - if ($job) { - $messages[] = $this->jobToText($job); - } elseif ($rule) { - if ($rule instanceof Rule) { - $messages[] = $rule->getPrettyString($this->pool, $installedMap, $learnedPool); - } - } + foreach ($reasons as $rule) { + $messages[] = $rule->getPrettyString($this->pool, $installedMap, $learnedPool); } return "\n - ".implode("\n - ", $messages); @@ -184,10 +176,13 @@ class Problem * Store a reason descriptor but ignore duplicates * * @param string $id A canonical identifier for the reason - * @param string|array $reason The reason descriptor + * @param Rule $reason The reason descriptor */ - protected function addReason($id, $reason) + protected function addReason($id, Rule $reason) { + // TODO: if a rule is part of a problem description in two sections, isn't this going to remove a message + // that is important to understand the issue? + if (!isset($this->reasonSeen[$id])) { $this->reasonSeen[$id] = true; $this->reasons[$this->section][] = $reason; @@ -199,42 +194,6 @@ class Problem $this->section++; } - /** - * Turns a job into a human readable description - * - * @param array $job - * @return string - */ - protected function jobToText($job) - { - $packageName = $job['packageName']; - $constraint = $job['constraint']; - switch ($job['cmd']) { - case 'fix': - $package = $job['package']; - if ($job['lockable']) { - return $package->getPrettyName().' is locked to version '.$package->getPrettyVersion().' and an update of this package was not requested.'; - } - - return $package->getPrettyName().' is present at version '.$package->getPrettyVersion() . ' and cannot be modified by Composer'; - case 'install': - $packages = $this->pool->whatProvides($packageName, $constraint); - if (!$packages) { - return 'No package found to satisfy install request for '.$packageName.$this->constraintToText($constraint); - } - - return 'Installation request for '.$packageName.$this->constraintToText($constraint).' -> satisfiable by '.$this->getPackageList($packages).'.'; - } - - if (isset($constraint)) { - $packages = $this->pool->whatProvides($packageName, $constraint); - } else { - $packages = $this->pool->whatProvides($job['packageName'], null); - } - - return 'Job(cmd='.$job['cmd'].', target='.$packageName.', packages=['.$this->getPackageList($packages).'])'; - } - protected function getPackageList($packages) { $prepared = array(); @@ -250,7 +209,7 @@ class Problem } /** - * Turns a constraint into text usable in a sentence describing a job + * Turns a constraint into text usable in a sentence describing a request * * @param \Composer\Semver\Constraint\ConstraintInterface $constraint * @return string diff --git a/src/Composer/DependencyResolver/Request.php b/src/Composer/DependencyResolver/Request.php index 851407591..e492e35a4 100644 --- a/src/Composer/DependencyResolver/Request.php +++ b/src/Composer/DependencyResolver/Request.php @@ -24,7 +24,7 @@ use Composer\Semver\Constraint\ConstraintInterface; class Request { protected $lockedRepository; - protected $jobs = array(); + protected $requires = array(); protected $fixedPackages = array(); protected $unlockables = array(); @@ -33,9 +33,10 @@ class Request $this->lockedRepository = $lockedRepository; } - public function install($packageName, ConstraintInterface $constraint = null) + public function require($packageName, ConstraintInterface $constraint = null) { - $this->addJob($packageName, 'install', $constraint); + $packageName = strtolower($packageName); + $this->requires[$packageName] = $constraint; } /** @@ -52,20 +53,9 @@ class Request } } - protected function addJob($packageName, $cmd, ConstraintInterface $constraint = null) + public function getRequires() { - $packageName = strtolower($packageName); - - $this->jobs[] = array( - 'cmd' => $cmd, - 'packageName' => $packageName, - 'constraint' => $constraint, - ); - } - - public function getJobs() - { - return $this->jobs; + return $this->requires; } public function getFixedPackages() diff --git a/src/Composer/DependencyResolver/Rule.php b/src/Composer/DependencyResolver/Rule.php index 7a12664db..fa4a0f574 100644 --- a/src/Composer/DependencyResolver/Rule.php +++ b/src/Composer/DependencyResolver/Rule.php @@ -24,8 +24,8 @@ abstract class Rule { // reason constants const RULE_INTERNAL_ALLOW_UPDATE = 1; - const RULE_JOB_INSTALL = 2; - const RULE_JOB_REMOVE = 3; + const RULE_ROOT_REQUIRE = 2; + const RULE_FIXED = 3; const RULE_PACKAGE_CONFLICT = 6; const RULE_PACKAGE_REQUIRES = 7; const RULE_PACKAGE_OBSOLETES = 8; @@ -41,22 +41,17 @@ abstract class Rule const BITFIELD_DISABLED = 16; protected $bitfield; - protected $job; + protected $request; protected $reasonData; /** * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData - * @param array $job The job this rule was created from */ - public function __construct($reason, $reasonData, $job = null) + public function __construct($reason, $reasonData) { $this->reasonData = $reasonData; - if ($job) { - $this->job = $job; - } - $this->bitfield = (0 << self::BITFIELD_DISABLED) | ($reason << self::BITFIELD_REASON) | (255 << self::BITFIELD_TYPE); @@ -66,11 +61,6 @@ abstract class Rule abstract public function getHash(); - public function getJob() - { - return $this->job; - } - abstract public function equals(Rule $rule); public function getReason() @@ -85,11 +75,17 @@ abstract class Rule public function getRequiredPackage() { - if ($this->getReason() === self::RULE_JOB_INSTALL) { - return $this->reasonData; + $reason = $this->getReason(); + + if ($reason === self::RULE_ROOT_REQUIRE) { + return $this->reasonData['packageName']; } - if ($this->getReason() === self::RULE_PACKAGE_REQUIRES) { + if ($reason === self::RULE_FIXED) { + return $this->reasonData['package']->getName(); + } + + if ($reason === self::RULE_PACKAGE_REQUIRES) { return $this->reasonData->getTarget(); } } @@ -142,11 +138,24 @@ abstract class Rule case self::RULE_INTERNAL_ALLOW_UPDATE: return $ruleText; - case self::RULE_JOB_INSTALL: - return "Install command rule ($ruleText)"; + case self::RULE_ROOT_REQUIRE: + $packageName = $this->reasonData['packageName']; + $constraint = $this->reasonData['constraint']; - case self::RULE_JOB_REMOVE: - return "Remove command rule ($ruleText)"; + $packages = $pool->whatProvides($packageName, $constraint); + if (!$packages) { + return 'No package found to satisfy root composer.json require '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : ''); + } + + return 'Root composer.json requires '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : '').' -> satisfiable by '.$this->formatPackagesUnique($pool, $packages).'.'; + + case self::RULE_FIXED: + $package = $this->reasonData['package']; + if ($this->reasonData['lockable']) { + return $package->getPrettyName().' is locked to version '.$package->getPrettyVersion().' and an update of this package was not requested.'; + } + + return $package->getPrettyName().' is present at version '.$package->getPrettyVersion() . ' and cannot be modified by Composer'; case self::RULE_PACKAGE_CONFLICT: $package1 = $pool->literalToPackage($literals[0]); @@ -263,6 +272,8 @@ abstract class Rule */ protected function formatPackagesUnique($pool, array $packages) { + // TODO this is essentially a duplicate of Problem: getPackageList, maintain in one place only? + $prepared = array(); foreach ($packages as $package) { if (!is_object($package)) { diff --git a/src/Composer/DependencyResolver/Rule2Literals.php b/src/Composer/DependencyResolver/Rule2Literals.php index 6bf47db34..2df95e09d 100644 --- a/src/Composer/DependencyResolver/Rule2Literals.php +++ b/src/Composer/DependencyResolver/Rule2Literals.php @@ -28,11 +28,10 @@ class Rule2Literals extends Rule * @param int $literal2 * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData - * @param array $job The job this rule was created from */ - public function __construct($literal1, $literal2, $reason, $reasonData, $job = null) + public function __construct($literal1, $literal2, $reason, $reasonData) { - parent::__construct($reason, $reasonData, $job); + parent::__construct($reason, $reasonData); if ($literal1 < $literal2) { $this->literal1 = $literal1; diff --git a/src/Composer/DependencyResolver/RuleSet.php b/src/Composer/DependencyResolver/RuleSet.php index bf4de0d7c..3db54d9df 100644 --- a/src/Composer/DependencyResolver/RuleSet.php +++ b/src/Composer/DependencyResolver/RuleSet.php @@ -19,7 +19,7 @@ class RuleSet implements \IteratorAggregate, \Countable { // highest priority => lowest number const TYPE_PACKAGE = 0; - const TYPE_JOB = 1; + const TYPE_REQUEST = 1; const TYPE_LEARNED = 4; /** @@ -32,7 +32,7 @@ class RuleSet implements \IteratorAggregate, \Countable protected static $types = array( 255 => 'UNKNOWN', self::TYPE_PACKAGE => 'PACKAGE', - self::TYPE_JOB => 'JOB', + self::TYPE_REQUEST => 'REQUEST', self::TYPE_LEARNED => 'LEARNED', ); diff --git a/src/Composer/DependencyResolver/RuleSetGenerator.php b/src/Composer/DependencyResolver/RuleSetGenerator.php index 01b75e712..02afdfbf7 100644 --- a/src/Composer/DependencyResolver/RuleSetGenerator.php +++ b/src/Composer/DependencyResolver/RuleSetGenerator.php @@ -76,33 +76,17 @@ class RuleSetGenerator * @param array $packages The set of packages to choose from * @param int $reason A RULE_* constant describing the reason for * generating this rule - * @param array $job The job this rule was created from + * @param array $reasonData Additional data like the root require or fix request info * @return Rule The generated rule */ - protected function createInstallOneOfRule(array $packages, $reason, $job) + protected function createInstallOneOfRule(array $packages, $reason, $reasonData) { $literals = array(); foreach ($packages as $package) { $literals[] = $package->id; } - return new GenericRule($literals, $reason, $job['packageName'], $job); - } - - /** - * Creates a rule to remove a package - * - * The rule for a package A is (-A). - * - * @param PackageInterface $package The package to be removed - * @param int $reason A RULE_* constant describing the - * reason for generating this rule - * @param array $job The job this rule was created from - * @return Rule The generated rule - */ - protected function createRemoveRule(PackageInterface $package, $reason, $job) - { - return new GenericRule(array(-$package->id), $reason, $job['packageName'], $job); + return new GenericRule($literals, $reason, $reasonData); } /** @@ -302,34 +286,29 @@ class RuleSetGenerator $this->addRulesForPackage($package, $ignorePlatformReqs); - $rule = $this->createInstallOneOfRule(array($package), Rule::RULE_JOB_INSTALL, array( - 'cmd' => 'fix', - 'packageName' => $package->getName(), - 'constraint' => null, + $rule = $this->createInstallOneOfRule(array($package), Rule::RULE_FIXED, array( 'package' => $package, 'lockable' => !isset($unlockableMap[$package->id]), - 'fixed' => true )); - $this->addRule(RuleSet::TYPE_JOB, $rule); + $this->addRule(RuleSet::TYPE_REQUEST, $rule); } - foreach ($request->getJobs() as $job) { - switch ($job['cmd']) { - case 'install': - if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $job['packageName'])) { - break; - } + foreach ($request->getRequires() as $packageName => $constraint) { + if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $packageName)) { + continue; + } - $packages = $this->pool->whatProvides($job['packageName'], $job['constraint']); - if ($packages) { - foreach ($packages as $package) { - $this->addRulesForPackage($package, $ignorePlatformReqs); - } + $packages = $this->pool->whatProvides($packageName, $constraint); + if ($packages) { + foreach ($packages as $package) { + $this->addRulesForPackage($package, $ignorePlatformReqs); + } - $rule = $this->createInstallOneOfRule($packages, Rule::RULE_JOB_INSTALL, $job); - $this->addRule(RuleSet::TYPE_JOB, $rule); - } - break; + $rule = $this->createInstallOneOfRule($packages, Rule::RULE_ROOT_REQUIRE, array( + 'packageName' => $packageName, + 'constraint' => $constraint, + )); + $this->addRule(RuleSet::TYPE_REQUEST, $rule); } } } diff --git a/src/Composer/DependencyResolver/Solver.php b/src/Composer/DependencyResolver/Solver.php index 08482a14f..be9494d91 100644 --- a/src/Composer/DependencyResolver/Solver.php +++ b/src/Composer/DependencyResolver/Solver.php @@ -124,19 +124,19 @@ class Solver $problem->addRule($rule); $problem->addRule($conflict); - $this->disableProblem($rule); + $rule->disable(); $this->problems[] = $problem; continue; } - // conflict with another job + // conflict with another root require/fixed package $problem = new Problem($this->pool); $problem->addRule($rule); $problem->addRule($conflict); - // push all of our rules (can only be job rules) + // push all of our rules (can only be root require/fixed package rules) // asserting this literal on the problem stack - foreach ($this->rules->getIteratorFor(RuleSet::TYPE_JOB) as $assertRule) { + foreach ($this->rules->getIteratorFor(RuleSet::TYPE_REQUEST) as $assertRule) { if ($assertRule->isDisabled() || !$assertRule->isAssertion()) { continue; } @@ -148,7 +148,7 @@ class Solver continue; } $problem->addRule($assertRule); - $this->disableProblem($assertRule); + $assertRule->disable(); } $this->problems[] = $problem; @@ -171,19 +171,15 @@ class Solver */ protected function checkForRootRequireProblems($request, $ignorePlatformReqs) { - foreach ($request->getJobs() as $job) { - switch ($job['cmd']) { - case 'install': - if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $job['packageName'])) { - break; - } + foreach ($request->getRequires() as $packageName => $constraint) { + if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $packageName)) { + continue; + } - if (!$this->pool->whatProvides($job['packageName'], $job['constraint'])) { - $problem = new Problem($this->pool); - $problem->addRule(new GenericRule(array(), null, null, $job)); - $this->problems[] = $problem; - } - break; + if (!$this->pool->whatProvides($packageName, $constraint)) { + $problem = new Problem($this->pool); + $problem->addRule(new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => $packageName, 'constraint' => $constraint))); + $this->problems[] = $problem; } } } @@ -208,7 +204,7 @@ class Solver $this->watchGraph->insert(new RuleWatchNode($rule)); } - /* make decisions based on job/update assertions */ + /* make decisions based on root require/fix assertions */ $this->makeAssertionRuleDecisions(); $this->io->writeError('Resolving dependencies through SAT', true, IOInterface::DEBUG); @@ -562,28 +558,6 @@ class Solver return 0; } - /** - * @param Rule $why - */ - private function disableProblem(Rule $why) - { - $job = $why->getJob(); - - if (!$job) { - $why->disable(); - - return; - } - - // disable all rules of this job - foreach ($this->rules as $rule) { - /** @var Rule $rule */ - if ($job === $rule->getJob()) { - $rule->disable(); - } - } - } - private function resetSolver() { $this->decisions->reset(); @@ -631,7 +605,7 @@ class Solver /* * here's the main loop: * 1) propagate new decisions (only needed once) - * 2) fulfill jobs + * 2) fulfill root requires/fixed packages * 3) fulfill all unresolved rules * 4) minimalize solution if we had choices * if we encounter a problem, we rewind to a safe level and restart @@ -657,9 +631,9 @@ class Solver } } - // handle job rules + // handle root require/fixed package rules if ($level < $systemLevel) { - $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_JOB); + $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_REQUEST); foreach ($iterator as $rule) { if ($rule->isEnabled()) { $decisionQueue = array(); @@ -704,7 +678,7 @@ class Solver $systemLevel = $level + 1; - // jobs left + // root requires/fixed packages left $iterator->next(); if ($iterator->valid()) { continue; diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index 0184bba9c..f720aba4e 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -78,8 +78,8 @@ class SolverProblemsException extends \RuntimeException private function hasExtensionProblems(array $reasonSets) { foreach ($reasonSets as $reasonSet) { - foreach ($reasonSet as $reason) { - if (isset($reason["rule"]) && 0 === strpos($reason["rule"]->getRequiredPackage(), 'ext-')) { + foreach ($reasonSet as $rule) { + if (0 === strpos($rule->getRequiredPackage(), 'ext-')) { return true; } } diff --git a/src/Composer/DependencyResolver/Transaction.php b/src/Composer/DependencyResolver/Transaction.php index b8e4499de..6f7cc79fb 100644 --- a/src/Composer/DependencyResolver/Transaction.php +++ b/src/Composer/DependencyResolver/Transaction.php @@ -170,7 +170,7 @@ class Transaction // TODO skip updates which don't update? is this needed? we shouldn't schedule this update in the first place? /* - if ('update' === $jobType) { + if ('update' === $opType) { $targetPackage = $operation->getTargetPackage(); if ($targetPackage->isDev()) { $initialPackage = $operation->getInitialPackage(); diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 9c6c5a719..d51cdf466 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -371,11 +371,11 @@ class Installer // if we're updating mirrors we want to keep exactly the same versions installed which are in the lock file, but we want current remote metadata if ($this->updateMirrors) { foreach ($lockedRepository->getPackages() as $lockedPackage) { - $request->install($lockedPackage->getName(), new Constraint('==', $lockedPackage->getVersion())); + $request->require($lockedPackage->getName(), new Constraint('==', $lockedPackage->getVersion())); } } else { foreach ($links as $link) { - $request->install($link->getTarget(), $link->getConstraint()); + $request->require($link->getTarget(), $link->getConstraint()); } } @@ -464,13 +464,12 @@ class Installer foreach ($lockTransaction->getOperations() as $operation) { // collect suggestions - $jobType = $operation->getJobType(); if ($operation instanceof InstallOperation) { $this->suggestedPackagesReporter->addSuggestionsFromPackage($operation->getPackage()); } // output op, but alias op only in debug verbosity - if (false === strpos($operation->getJobType(), 'Alias') || $this->io->isDebug()) { + if (false === strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(true)); } } @@ -524,7 +523,7 @@ class Installer $links = $this->package->getRequires(); foreach ($links as $link) { - $request->install($link->getTarget(), $link->getConstraint()); + $request->require($link->getTarget(), $link->getConstraint()); } $pool = $repositorySet->createPool($request); @@ -582,7 +581,7 @@ class Installer } foreach ($this->locker->getPlatformRequirements($this->devMode) as $link) { - $request->install($link->getTarget(), $link->getConstraint()); + $request->require($link->getTarget(), $link->getConstraint()); } //$this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::PRE_DEPENDENCIES_SOLVING, $this->devMode, $policy, $repositorySet, $installedRepo, $request); @@ -656,7 +655,7 @@ class Installer } else { foreach ($localRepoTransaction->getOperations() as $operation) { // output op, but alias op only in debug verbosity - if (false === strpos($operation->getJobType(), 'Alias') || $this->io->isDebug()) { + if (false === strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(false)); } } diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index 8d1579b63..40d2a7f83 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -173,14 +173,14 @@ class InstallationManager $promises = array(); foreach ($operations as $operation) { - $jobType = $operation->getJobType(); + $opType = $operation->getOperationType(); $promise = null; - if ($jobType === 'install') { + if ($opType === 'install') { $package = $operation->getPackage(); $installer = $this->getInstaller($package->getType()); $promise = $installer->download($package); - } elseif ($jobType === 'update') { + } elseif ($opType === 'update') { $target = $operation->getTargetPackage(); $targetType = $target->getType(); $installer = $this->getInstaller($targetType); @@ -197,29 +197,29 @@ class InstallationManager } foreach ($operations as $operation) { - $jobType = $operation->getJobType(); + $opType = $operation->getOperationType(); // ignoring alias ops as they don't need to execute anything - if (!in_array($jobType, array('update', 'install', 'uninstall'))) { + if (!in_array($opType, array('update', 'install', 'uninstall'))) { // output alias ops in debug verbosity as they have no output otherwise if ($this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(false)); } - $this->$jobType($repo, $operation); + $this->$opType($repo, $operation); continue; } - if ($jobType === 'install' || $jobType === 'uninstall') { + if ($opType === 'install' || $opType === 'uninstall') { $package = $operation->getPackage(); $initialPackage = null; - } elseif ($jobType === 'update') { + } elseif ($opType === 'update') { $package = $operation->getTargetPackage(); $initialPackage = $operation->getInitialPackage(); } $installer = $this->getInstaller($package->getType()); - $event = 'Composer\Installer\PackageEvents::PRE_PACKAGE_'.strtoupper($jobType); + $event = 'Composer\Installer\PackageEvents::PRE_PACKAGE_'.strtoupper($opType); if (defined($event) && $runScripts && $this->eventDispatcher) { $this->eventDispatcher->dispatchPackageEvent(constant($event), $devMode, $repo, $operations, $operation); } @@ -229,26 +229,26 @@ class InstallationManager $loop = $this->loop; $io = $this->io; - $promise = $installer->prepare($jobType, $package, $initialPackage); + $promise = $installer->prepare($opType, $package, $initialPackage); if (null === $promise) { $promise = new \React\Promise\Promise(function ($resolve, $reject) { $resolve(); }); } - $promise = $promise->then(function () use ($jobType, $installManager, $repo, $operation) { - return $installManager->$jobType($repo, $operation); - })->then(function () use ($jobType, $installer, $package, $initialPackage) { - return $installer->cleanup($jobType, $package, $initialPackage); - })->then(function () use ($jobType, $runScripts, $dispatcher, $installManager, $devMode, $repo, $operations, $operation) { + $promise = $promise->then(function () use ($opType, $installManager, $repo, $operation) { + return $installManager->$opType($repo, $operation); + })->then(function () use ($opType, $installer, $package, $initialPackage) { + return $installer->cleanup($opType, $package, $initialPackage); + })->then(function () use ($opType, $runScripts, $dispatcher, $installManager, $devMode, $repo, $operations, $operation) { $repo->write($devMode, $installManager); - $event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($jobType); + $event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($opType); if (defined($event) && $runScripts && $dispatcher) { $dispatcher->dispatchPackageEvent(constant($event), $devMode, $repo, $operations, $operation); } - }, function ($e) use ($jobType, $installer, $package, $initialPackage, $loop, $io) { - $io->writeError(' ' . ucfirst($jobType) .' of '.$package->getPrettyName().' failed'); + }, function ($e) use ($opType, $installer, $package, $initialPackage, $loop, $io) { + $io->writeError(' ' . ucfirst($opType) .' of '.$package->getPrettyName().' failed'); - $promise = $installer->cleanup($jobType, $package, $initialPackage); + $promise = $installer->cleanup($opType, $package, $initialPackage); if ($promise) { $loop->wait(array($promise)); } diff --git a/src/Composer/Package/Link.php b/src/Composer/Package/Link.php index 217da0713..5a6c683cc 100644 --- a/src/Composer/Package/Link.php +++ b/src/Composer/Package/Link.php @@ -123,6 +123,6 @@ class Link */ public function getPrettyString(PackageInterface $sourcePackage) { - return $sourcePackage->getPrettyString().' '.$this->description.' '.$this->target.' '.$this->constraint->getPrettyString().''; + return $sourcePackage->getPrettyString().' '.$this->description.' '.$this->target.($this->constraint ? ' '.$this->constraint->getPrettyString() : ''); } } diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index 9ca6e98e3..1a0fcc0bf 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -157,7 +157,7 @@ class RepositorySet $request = new Request($lockedRepo); foreach ($packageNames as $packageName) { - $request->install($packageName); + $request->require($packageName); } return $this->createPool($request); diff --git a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php index 54a5e8e3c..a06f0b998 100644 --- a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php @@ -82,7 +82,7 @@ class PoolBuilderTest extends TestCase $request = new Request(); foreach ($requestData as $package => $constraint) { - $request->install($package, $parser->parseConstraints($constraint)); + $request->require($package, $parser->parseConstraints($constraint)); } foreach ($fixed as $fixedPackage) { diff --git a/tests/Composer/Test/DependencyResolver/RequestTest.php b/tests/Composer/Test/DependencyResolver/RequestTest.php index 7534f9a5c..f47456299 100644 --- a/tests/Composer/Test/DependencyResolver/RequestTest.php +++ b/tests/Composer/Test/DependencyResolver/RequestTest.php @@ -30,13 +30,13 @@ class RequestTest extends TestCase $repo->addPackage($foobar); $request = new Request(); - $request->install('foo'); + $request->require('foo'); $this->assertEquals( array( - array('cmd' => 'install', 'packageName' => 'foo', 'constraint' => null), + 'foo' => null, ), - $request->getJobs() + $request->getRequires() ); } @@ -52,13 +52,13 @@ class RequestTest extends TestCase $repo2->addPackage($foo2); $request = new Request(); - $request->install('foo', $constraint = $this->getVersionConstraint('=', '1')); + $request->require('foo', $constraint = $this->getVersionConstraint('=', '1')); $this->assertEquals( array( - array('cmd' => 'install', 'packageName' => 'foo', 'constraint' => $constraint), + 'foo' => $constraint, ), - $request->getJobs() + $request->getRequires() ); } } diff --git a/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php b/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php index 783734065..a80c5aea2 100644 --- a/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php @@ -30,9 +30,9 @@ class RuleSetIteratorTest extends TestCase $this->pool = new Pool(); $this->rules = array( - RuleSet::TYPE_JOB => array( - new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), - new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), + RuleSet::TYPE_REQUEST => array( + new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), + new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), ), RuleSet::TYPE_LEARNED => array( new GenericRule(array(), Rule::RULE_INTERNAL_ALLOW_UPDATE, null), @@ -51,8 +51,8 @@ class RuleSetIteratorTest extends TestCase } $expected = array( - $this->rules[RuleSet::TYPE_JOB][0], - $this->rules[RuleSet::TYPE_JOB][1], + $this->rules[RuleSet::TYPE_REQUEST][0], + $this->rules[RuleSet::TYPE_REQUEST][1], $this->rules[RuleSet::TYPE_LEARNED][0], ); @@ -69,8 +69,8 @@ class RuleSetIteratorTest extends TestCase } $expected = array( - RuleSet::TYPE_JOB, - RuleSet::TYPE_JOB, + RuleSet::TYPE_REQUEST, + RuleSet::TYPE_REQUEST, RuleSet::TYPE_LEARNED, ); diff --git a/tests/Composer/Test/DependencyResolver/RuleSetTest.php b/tests/Composer/Test/DependencyResolver/RuleSetTest.php index 290b3af2f..2215c019b 100644 --- a/tests/Composer/Test/DependencyResolver/RuleSetTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleSetTest.php @@ -26,9 +26,9 @@ class RuleSetTest extends TestCase { $rules = array( RuleSet::TYPE_PACKAGE => array(), - RuleSet::TYPE_JOB => array( - new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null), - new GenericRule(array(2), Rule::RULE_JOB_INSTALL, null), + RuleSet::TYPE_REQUEST => array( + new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null), + new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, null), ), RuleSet::TYPE_LEARNED => array( new GenericRule(array(), Rule::RULE_INTERNAL_ALLOW_UPDATE, null), @@ -37,9 +37,9 @@ class RuleSetTest extends TestCase $ruleSet = new RuleSet; - $ruleSet->add($rules[RuleSet::TYPE_JOB][0], RuleSet::TYPE_JOB); + $ruleSet->add($rules[RuleSet::TYPE_REQUEST][0], RuleSet::TYPE_REQUEST); $ruleSet->add($rules[RuleSet::TYPE_LEARNED][0], RuleSet::TYPE_LEARNED); - $ruleSet->add($rules[RuleSet::TYPE_JOB][1], RuleSet::TYPE_JOB); + $ruleSet->add($rules[RuleSet::TYPE_REQUEST][1], RuleSet::TYPE_REQUEST); $this->assertEquals($rules, $ruleSet->getRules()); } @@ -47,20 +47,20 @@ class RuleSetTest extends TestCase public function testAddIgnoresDuplicates() { $rules = array( - RuleSet::TYPE_JOB => array( - new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), - new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), - new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), + RuleSet::TYPE_REQUEST => array( + new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), + new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), + new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), ), ); $ruleSet = new RuleSet; - $ruleSet->add($rules[RuleSet::TYPE_JOB][0], RuleSet::TYPE_JOB); - $ruleSet->add($rules[RuleSet::TYPE_JOB][1], RuleSet::TYPE_JOB); - $ruleSet->add($rules[RuleSet::TYPE_JOB][2], RuleSet::TYPE_JOB); + $ruleSet->add($rules[RuleSet::TYPE_REQUEST][0], RuleSet::TYPE_REQUEST); + $ruleSet->add($rules[RuleSet::TYPE_REQUEST][1], RuleSet::TYPE_REQUEST); + $ruleSet->add($rules[RuleSet::TYPE_REQUEST][2], RuleSet::TYPE_REQUEST); - $this->assertCount(1, $ruleSet->getIteratorFor(array(RuleSet::TYPE_JOB))); + $this->assertCount(1, $ruleSet->getIteratorFor(array(RuleSet::TYPE_REQUEST))); } /** @@ -70,15 +70,15 @@ class RuleSetTest extends TestCase { $ruleSet = new RuleSet; - $ruleSet->add(new GenericRule(array(), Rule::RULE_JOB_INSTALL, null), 7); + $ruleSet->add(new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null), 7); } public function testCount() { $ruleSet = new RuleSet; - $ruleSet->add(new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null), RuleSet::TYPE_JOB); - $ruleSet->add(new GenericRule(array(2), Rule::RULE_JOB_INSTALL, null), RuleSet::TYPE_JOB); + $ruleSet->add(new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null), RuleSet::TYPE_REQUEST); + $ruleSet->add(new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, null), RuleSet::TYPE_REQUEST); $this->assertEquals(2, $ruleSet->count()); } @@ -87,8 +87,8 @@ class RuleSetTest extends TestCase { $ruleSet = new RuleSet; - $rule = new GenericRule(array(), Rule::RULE_JOB_INSTALL, null); - $ruleSet->add($rule, RuleSet::TYPE_JOB); + $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null); + $ruleSet->add($rule, RuleSet::TYPE_REQUEST); $this->assertSame($rule, $ruleSet->ruleById[0]); } @@ -97,9 +97,9 @@ class RuleSetTest extends TestCase { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(2), Rule::RULE_JOB_INSTALL, null); - $ruleSet->add($rule1, RuleSet::TYPE_JOB); + $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, null); + $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); $iterator = $ruleSet->getIterator(); @@ -112,10 +112,10 @@ class RuleSetTest extends TestCase public function testGetIteratorFor() { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(2), Rule::RULE_JOB_INSTALL, null); + $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, null); - $ruleSet->add($rule1, RuleSet::TYPE_JOB); + $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); $iterator = $ruleSet->getIteratorFor(RuleSet::TYPE_LEARNED); @@ -126,13 +126,13 @@ class RuleSetTest extends TestCase public function testGetIteratorWithout() { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(2), Rule::RULE_JOB_INSTALL, null); + $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, null); - $ruleSet->add($rule1, RuleSet::TYPE_JOB); + $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); - $iterator = $ruleSet->getIteratorWithout(RuleSet::TYPE_JOB); + $iterator = $ruleSet->getIteratorWithout(RuleSet::TYPE_REQUEST); $this->assertSame($rule2, $iterator->current()); } @@ -145,10 +145,10 @@ class RuleSetTest extends TestCase $ruleSet = new RuleSet; $literal = $p->getId(); - $rule = new GenericRule(array($literal), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array($literal), Rule::RULE_ROOT_REQUIRE, array('packageName' => 'foo/bar', 'constraint' => null)); - $ruleSet->add($rule, RuleSet::TYPE_JOB); + $ruleSet->add($rule, RuleSet::TYPE_REQUEST); - $this->assertContains('JOB : Install command rule (install foo 2.1)', $ruleSet->getPrettyString($pool)); + $this->assertContains('REQUEST : No package found to satisfy root composer.json require foo/bar', $ruleSet->getPrettyString($pool)); } } diff --git a/tests/Composer/Test/DependencyResolver/RuleTest.php b/tests/Composer/Test/DependencyResolver/RuleTest.php index 8941f430e..6a01ff2f2 100644 --- a/tests/Composer/Test/DependencyResolver/RuleTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleTest.php @@ -17,6 +17,7 @@ use Composer\DependencyResolver\Rule; use Composer\DependencyResolver\RuleSet; use Composer\DependencyResolver\Pool; use Composer\Package\BasePackage; +use Composer\Package\Link; use Composer\Repository\ArrayRepository; use Composer\Test\TestCase; @@ -24,7 +25,7 @@ class RuleTest extends TestCase { public function testGetHash() { - $rule = new GenericRule(array(123), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(123), Rule::RULE_ROOT_REQUIRE, null); $hash = unpack('ihash', md5('123', true)); $this->assertEquals($hash['hash'], $rule->getHash()); @@ -32,39 +33,39 @@ class RuleTest extends TestCase public function testEqualsForRulesWithDifferentHashes() { - $rule = new GenericRule(array(1, 2), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(1, 3), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(1, 2), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(1, 3), Rule::RULE_ROOT_REQUIRE, null); $this->assertFalse($rule->equals($rule2)); } public function testEqualsForRulesWithDifferLiteralsQuantity() { - $rule = new GenericRule(array(1, 12), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null); $this->assertFalse($rule->equals($rule2)); } public function testEqualsForRulesWithSameLiterals() { - $rule = new GenericRule(array(1, 12), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(1, 12), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, null); $this->assertTrue($rule->equals($rule2)); } public function testSetAndGetType() { - $rule = new GenericRule(array(), Rule::RULE_JOB_INSTALL, null); - $rule->setType(RuleSet::TYPE_JOB); + $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null); + $rule->setType(RuleSet::TYPE_REQUEST); - $this->assertEquals(RuleSet::TYPE_JOB, $rule->getType()); + $this->assertEquals(RuleSet::TYPE_REQUEST, $rule->getType()); } public function testEnable() { - $rule = new GenericRule(array(), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null); $rule->disable(); $rule->enable(); @@ -74,7 +75,7 @@ class RuleTest extends TestCase public function testDisable() { - $rule = new GenericRule(array(), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, null); $rule->enable(); $rule->disable(); @@ -84,8 +85,8 @@ class RuleTest extends TestCase public function testIsAssertions() { - $rule = new GenericRule(array(1, 12), Rule::RULE_JOB_INSTALL, null); - $rule2 = new GenericRule(array(1), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, null); + $rule2 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, null); $this->assertFalse($rule->isAssertion()); $this->assertTrue($rule2->isAssertion()); @@ -98,8 +99,8 @@ class RuleTest extends TestCase $p2 = $this->getPackage('baz', '1.1'), )); - $rule = new GenericRule(array($p1->getId(), -$p2->getId()), Rule::RULE_JOB_INSTALL, null); + $rule = new GenericRule(array($p1->getId(), -$p2->getId()), Rule::RULE_PACKAGE_REQUIRES, new Link('baz', 'foo')); - $this->assertEquals('Install command rule (don\'t install baz 1.1|install foo 2.1)', $rule->getPrettyString($pool)); + $this->assertEquals('baz 1.1 relates to foo -> satisfiable by foo[2.1].', $rule->getPrettyString($pool)); } } diff --git a/tests/Composer/Test/DependencyResolver/SolverTest.php b/tests/Composer/Test/DependencyResolver/SolverTest.php index 01a518f27..255119cc4 100644 --- a/tests/Composer/Test/DependencyResolver/SolverTest.php +++ b/tests/Composer/Test/DependencyResolver/SolverTest.php @@ -50,7 +50,7 @@ class SolverTest extends TestCase $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageA), @@ -72,7 +72,7 @@ class SolverTest extends TestCase $this->repo->addPackage($this->getPackage('A', '1.0')); $this->reposComplete(); - $this->request->install('B', $this->getVersionConstraint('==', '1')); + $this->request->require('B', $this->getVersionConstraint('==', '1')); $this->createSolver(); try { @@ -97,7 +97,7 @@ class SolverTest extends TestCase $this->repoSet->addRepository($repo1); $this->repoSet->addRepository($repo2); - $this->request->install('foo'); + $this->request->require('foo'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $foo1), @@ -114,7 +114,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageB), @@ -140,7 +140,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $newPackageB11), @@ -164,9 +164,9 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('B'); - $this->request->install('C'); + $this->request->require('A'); + $this->request->require('B'); + $this->request->require('C'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageA), @@ -206,7 +206,7 @@ class SolverTest extends TestCase $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0.0.0'), 'requires'))); $this->request->fixPackage($packageA); - $this->request->install('B', $this->getVersionConstraint('=', '1.1.0.0')); + $this->request->require('B', $this->getVersionConstraint('=', '1.1.0.0')); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), @@ -219,7 +219,7 @@ class SolverTest extends TestCase $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.1')); $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageA, 'to' => $newPackageA), @@ -238,7 +238,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), @@ -252,7 +252,7 @@ class SolverTest extends TestCase $this->repo->addPackage($this->getPackage('A', '1.0')); $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array()); } @@ -266,7 +266,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->request->fixPackage($packageB); $this->checkSolverResult(array( @@ -281,7 +281,7 @@ class SolverTest extends TestCase $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); - $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); + $this->request->require('A', $this->getVersionConstraint('<', '2.0.0.0')); $this->checkSolverResult(array(array( 'job' => 'update', @@ -297,7 +297,7 @@ class SolverTest extends TestCase $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); - $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); + $this->request->require('A', $this->getVersionConstraint('<', '2.0.0.0')); $this->checkSolverResult(array(array( 'job' => 'update', @@ -314,7 +314,7 @@ class SolverTest extends TestCase $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); - $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); + $this->request->require('A', $this->getVersionConstraint('<', '2.0.0.0')); $this->checkSolverResult(array( array( @@ -343,8 +343,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('C'); + $this->request->require('A'); + $this->request->require('C'); $this->checkSolverResult(array( array('job' => 'remove', 'package' => $packageD), @@ -365,7 +365,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $middlePackageB), @@ -381,7 +381,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('B'); + $this->request->require('B'); $this->checkSolverResult(array( array('job' => 'remove', 'package' => $packageA), @@ -396,7 +396,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageA), @@ -412,7 +412,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); // must explicitly pick the provider, so error in this case $this->setExpectedException('Composer\DependencyResolver\SolverProblemsException'); @@ -430,7 +430,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageB), @@ -447,7 +447,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->setExpectedException('Composer\DependencyResolver\SolverProblemsException'); $this->createSolver(); @@ -464,8 +464,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('Q'); + $this->request->require('A'); + $this->request->require('Q'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageQ), @@ -502,7 +502,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('X'); + $this->request->require('X'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $newPackageB), @@ -521,7 +521,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageB2), @@ -545,8 +545,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('C'); + $this->request->require('A'); + $this->request->require('C'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageB), @@ -583,8 +583,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('D'); + $this->request->require('A'); + $this->request->require('D'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageD2), @@ -619,7 +619,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('C', $this->getVersionConstraint('==', '2.0.0.0-dev')); + $this->request->require('C', $this->getVersionConstraint('==', '2.0.0.0-dev')); $this->setExpectedException('Composer\DependencyResolver\SolverProblemsException'); @@ -637,8 +637,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); - $this->request->install('B'); + $this->request->require('A'); + $this->request->require('B'); $this->createSolver(); try { @@ -650,9 +650,9 @@ class SolverTest extends TestCase $msg = "\n"; $msg .= " Problem 1\n"; - $msg .= " - Installation request for a -> satisfiable by A[1.0].\n"; + $msg .= " - Root composer.json requires a -> satisfiable by A[1.0].\n"; $msg .= " - B 1.0 conflicts with A[1.0].\n"; - $msg .= " - Installation request for b -> satisfiable by B[1.0].\n"; + $msg .= " - Root composer.json requires b -> satisfiable by B[1.0].\n"; $this->assertEquals($msg, $e->getMessage()); } } @@ -668,7 +668,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->createSolver(); try { @@ -681,7 +681,7 @@ class SolverTest extends TestCase $msg = "\n"; $msg .= " Problem 1\n"; - $msg .= " - Installation request for a -> satisfiable by A[1.0].\n"; + $msg .= " - Root composer.json requires a -> satisfiable by A[1.0].\n"; $msg .= " - A 1.0 requires b >= 2.0 -> no matching package found.\n\n"; $msg .= "Potential causes:\n"; $msg .= " - A typo in the package name\n"; @@ -716,7 +716,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->createSolver(); try { @@ -733,7 +733,7 @@ class SolverTest extends TestCase $msg .= " - B 1.0 requires c >= 1.0 -> satisfiable by C[1.0].\n"; $msg .= " - Same name, can only install one of: B[0.9, 1.0].\n"; $msg .= " - A 1.0 requires b >= 1.0 -> satisfiable by B[1.0].\n"; - $msg .= " - Installation request for a -> satisfiable by A[1.0].\n"; + $msg .= " - Root composer.json requires a -> satisfiable by A[1.0].\n"; $this->assertEquals($msg, $e->getMessage()); } } @@ -756,8 +756,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('symfony/twig-bridge'); - $this->request->install('twig/twig'); + $this->request->require('symfony/twig-bridge'); + $this->request->require('twig/twig'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageTwig16), @@ -782,7 +782,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A', $this->getVersionConstraint('==', '1.1.0.0')); + $this->request->require('A', $this->getVersionConstraint('==', '1.1.0.0')); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageB), @@ -804,8 +804,8 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A', $this->getVersionConstraint('==', '2.0')); - $this->request->install('B'); + $this->request->require('A', $this->getVersionConstraint('==', '2.0')); + $this->request->require('B'); $this->checkSolverResult(array( array('job' => 'install', 'package' => $packageA), @@ -865,7 +865,7 @@ class SolverTest extends TestCase $this->reposComplete(); - $this->request->install('A'); + $this->request->require('A'); $this->createSolver(); @@ -905,14 +905,14 @@ class SolverTest extends TestCase $result = array(); foreach ($transaction->getOperations() as $operation) { - if ('update' === $operation->getJobType()) { + if ('update' === $operation->getOperationType()) { $result[] = array( 'job' => 'update', 'from' => $operation->getInitialPackage(), 'to' => $operation->getTargetPackage(), ); } else { - $job = ('uninstall' === $operation->getJobType() ? 'remove' : 'install'); + $job = ('uninstall' === $operation->getOperationType() ? 'remove' : 'install'); $result[] = array( 'job' => $job, 'package' => $operation->getPackage(), diff --git a/tests/Composer/Test/DependencyResolver/TransactionTest.php b/tests/Composer/Test/DependencyResolver/TransactionTest.php index 6cde5d5d0..8b3e66b68 100644 --- a/tests/Composer/Test/DependencyResolver/TransactionTest.php +++ b/tests/Composer/Test/DependencyResolver/TransactionTest.php @@ -71,7 +71,7 @@ class TransactionTest extends TestCase { $result = array(); foreach ($transaction->getOperations() as $operation) { - if ('update' === $operation->getJobType()) { + if ('update' === $operation->getOperationType()) { $result[] = array( 'job' => 'update', 'from' => $operation->getInitialPackage(), @@ -79,7 +79,7 @@ class TransactionTest extends TestCase ); } else { $result[] = array( - 'job' => $operation->getJobType(), + 'job' => $operation->getOperationType(), 'package' => $operation->getPackage(), ); } diff --git a/tests/Composer/Test/Fixtures/installer/broken-deps-do-not-replace.test b/tests/Composer/Test/Fixtures/installer/broken-deps-do-not-replace.test index 3d5cba664..d970d5c4c 100644 --- a/tests/Composer/Test/Fixtures/installer/broken-deps-do-not-replace.test +++ b/tests/Composer/Test/Fixtures/installer/broken-deps-do-not-replace.test @@ -28,7 +28,7 @@ Your requirements could not be resolved to an installable set of packages. Problem 1 - c/c 1.0.0 requires x/x 1.0 -> no matching package found. - b/b 1.0.0 requires c/c 1.* -> satisfiable by c/c[1.0.0]. - - Installation request for b/b 1.* -> satisfiable by b/b[1.0.0]. + - Root composer.json requires b/b 1.* -> satisfiable by b/b[1.0.0]. Potential causes: - A typo in the package name diff --git a/tests/Composer/Test/Fixtures/installer/github-issues-4319.test b/tests/Composer/Test/Fixtures/installer/github-issues-4319.test index 2fbd8784c..7d012cf7c 100644 --- a/tests/Composer/Test/Fixtures/installer/github-issues-4319.test +++ b/tests/Composer/Test/Fixtures/installer/github-issues-4319.test @@ -36,7 +36,7 @@ Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - - Installation request for a/a ~1.0 -> satisfiable by a/a[1.0.0]. + - Root composer.json requires a/a ~1.0 -> satisfiable by a/a[1.0.0]. - a/a 1.0.0 requires php 5.5 -> your PHP version (%s) overridden by "config.platform.php" version (5.3) does not satisfy that requirement. --EXPECT-- diff --git a/tests/Composer/Test/Fixtures/installer/solver-problems.test b/tests/Composer/Test/Fixtures/installer/solver-problems.test index 7ca5b628f..a0264257f 100644 --- a/tests/Composer/Test/Fixtures/installer/solver-problems.test +++ b/tests/Composer/Test/Fixtures/installer/solver-problems.test @@ -63,7 +63,7 @@ Your requirements could not be resolved to an installable set of packages. Problem 3 - The requested package stable-requiree-excluded/pkg could not be found in any version, there may be a typo in the package name. Problem 4 - - Installation request for requirer/pkg 1.* -> satisfiable by requirer/pkg[1.0.0]. + - Root composer.json requires requirer/pkg 1.* -> satisfiable by requirer/pkg[1.0.0]. - requirer/pkg 1.0.0 requires dependency/pkg 1.0.0 -> no matching package found. Potential causes: diff --git a/tests/Composer/Test/Mock/InstallationManagerMock.php b/tests/Composer/Test/Mock/InstallationManagerMock.php index c189e9173..220313daa 100644 --- a/tests/Composer/Test/Mock/InstallationManagerMock.php +++ b/tests/Composer/Test/Mock/InstallationManagerMock.php @@ -38,7 +38,7 @@ class InstallationManagerMock extends InstallationManager public function execute(RepositoryInterface $repo, array $operations, $devMode = true, $runScripts = true) { foreach ($operations as $operation) { - $method = $operation->getJobType(); + $method = $operation->getOperationType(); // skipping download() step here for tests $this->$method($repo, $operation); }