From 0dce0f80f12543304fb0f1f755fb7bf9dbecfc9e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 25 May 2021 23:04:41 +0200 Subject: [PATCH] Also hint for errors when the root package does not match the constraint --- src/Composer/DependencyResolver/Problem.php | 8 +++++++- .../installer/circular-dependency-errors.test | 16 ++++++++++++++-- .../root-alias-change-with-circular-dep.test | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index ebc23d4c4..02af0aa8d 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -294,6 +294,13 @@ class Problem } } + // check if the root package is a name match and hint the dependencies on root troubleshooting article + $allReposPackages = $packages; + $topPackage = reset($allReposPackages); + if ($topPackage instanceof RootPackageInterface) { + $suffix = ' See https://getcomposer.org/dep-on-root for details and assistance.'; + } + return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose).' but '.(self::hasMultipleNames($packages) ? 'these do' : 'it does').' not match the constraint.' . $suffix); } @@ -432,7 +439,6 @@ class Problem if ($higherRepoPackages) { $topPackage = reset($higherRepoPackages); if ($topPackage instanceof RootPackageInterface) { - $singular = count($nextRepoPackages) === 1; return array( "- Root composer.json requires $packageName".self::constraintToText($constraint).', it is ', 'satisfiable by '.self::getPackageList($nextRepoPackages, $isVerbose).' from '.$nextRepo->getRepoName().' but '.$topPackage->getPrettyName().' is the root package and cannot be modified. See https://getcomposer.org/dep-on-root for details and assistance.' diff --git a/tests/Composer/Test/Fixtures/installer/circular-dependency-errors.test b/tests/Composer/Test/Fixtures/installer/circular-dependency-errors.test index 1cf2458a1..1bd4518f7 100644 --- a/tests/Composer/Test/Fixtures/installer/circular-dependency-errors.test +++ b/tests/Composer/Test/Fixtures/installer/circular-dependency-errors.test @@ -5,7 +5,8 @@ Circular dependencies errors uses helpful message "name": "root/pkg", "version": "dev-master", "require": { - "requires/root": "1.0.0" + "requires/root": "1.0.0", + "requires/root2": "1.0.0" }, "repositories": [ { @@ -19,6 +20,14 @@ Circular dependencies errors uses helpful message "root/pkg": "^1.0" } }, + { + "name": "requires/root2", + "version": "1.0.0", + "source": { "reference": "some.branch", "type": "git", "url": "" }, + "require": { + "root/pkg": "^2.0" + } + }, { "name": "root/pkg", "version": "1.0.0" @@ -40,6 +49,9 @@ Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires requires/root 1.0.0 -> satisfiable by requires/root[1.0.0]. - - requires/root 1.0.0 requires root/pkg ^1.0 -> satisfiable by root/pkg[1.0.0] from package repo (defining 2 packages) but root/pkg is the root package and cannot be modified. See https://getcomposer.org/dep-on-root for details and assistance. + - requires/root 1.0.0 requires root/pkg ^1.0 -> satisfiable by root/pkg[1.0.0] from package repo (defining 3 packages) but root/pkg is the root package and cannot be modified. See https://getcomposer.org/dep-on-root for details and assistance. + Problem 2 + - Root composer.json requires requires/root2 1.0.0 -> satisfiable by requires/root2[1.0.0]. + - requires/root2 1.0.0 requires root/pkg ^2.0 -> found root/pkg[dev-master] but it does not match the constraint. See https://getcomposer.org/dep-on-root for details and assistance. --EXPECT-- diff --git a/tests/Composer/Test/Fixtures/installer/root-alias-change-with-circular-dep.test b/tests/Composer/Test/Fixtures/installer/root-alias-change-with-circular-dep.test index 28e4ac4bf..bcbbcc81f 100644 --- a/tests/Composer/Test/Fixtures/installer/root-alias-change-with-circular-dep.test +++ b/tests/Composer/Test/Fixtures/installer/root-alias-change-with-circular-dep.test @@ -60,6 +60,6 @@ Your lock file does not contain a compatible set of packages. Please run compose Problem 1 - b/requirer is locked to version 1.0.0 and an update of this package was not requested. - - b/requirer 1.0.0 requires root/pkg ^1 -> found root/pkg[2.x-dev] but it does not match the constraint. + - b/requirer 1.0.0 requires root/pkg ^1 -> found root/pkg[2.x-dev] but it does not match the constraint. See https://getcomposer.org/dep-on-root for details and assistance. --EXPECT--