From 7b404c47174ea7e796e1c1fbbd2baa869fb0cf4f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 29 Feb 2016 14:45:35 +0000 Subject: [PATCH 1/2] Add failing test for #3990 --- .../installer/circular-dependency2.test | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tests/Composer/Test/Fixtures/installer/circular-dependency2.test diff --git a/tests/Composer/Test/Fixtures/installer/circular-dependency2.test b/tests/Composer/Test/Fixtures/installer/circular-dependency2.test new file mode 100644 index 000000000..162141daf --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/circular-dependency2.test @@ -0,0 +1,39 @@ +--TEST-- +Circular dependencies are possible between packages +--COMPOSER-- +{ + "name": "root", + "version": "dev-master", + "require": { + "require/itself": "1.0.0", + "regular/pkg": "1.0.0" + }, + "repositories": [ + { + "type": "package", + "package": [ + { + "name": "require/itself", + "version": "1.0.0", + "source": { "reference": "some.branch", "type": "git", "url": "" }, + "require": { + "require/itself": "1.0.0" + } + }, + { + "name": "regular/pkg", + "version": "1.0.0", + "source": { "reference": "some.branch", "type": "git", "url": "" }, + "__dummy__require": { + "require/itself": "1.0.0" + } + } + ] + } + ] +} +--RUN-- +update -v +--EXPECT-- +Installing require/itself (1.0.0) +Installing regular/pkg (1.0.0) From 4af74b54e0cc85b9c28fb6f1b6af1a65460d3894 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Wed, 2 Mar 2016 13:03:26 +0100 Subject: [PATCH 2/2] Ignore self references when anlaysing independent root requirements When creating a transaction we try to identify all requirements that are not themselves required by any other package. If a package references itself this should not mark it as being required by another package. --- src/Composer/DependencyResolver/Transaction.php | 4 +++- .../Test/Fixtures/installer/circular-dependency2.test | 5 +---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Composer/DependencyResolver/Transaction.php b/src/Composer/DependencyResolver/Transaction.php index b847164ff..7c38d92fb 100644 --- a/src/Composer/DependencyResolver/Transaction.php +++ b/src/Composer/DependencyResolver/Transaction.php @@ -165,7 +165,9 @@ class Transaction $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint()); foreach ($possibleRequires as $require) { - unset($roots[$require->id]); + if ($require !== $package) { + unset($roots[$require->id]); + } } } } diff --git a/tests/Composer/Test/Fixtures/installer/circular-dependency2.test b/tests/Composer/Test/Fixtures/installer/circular-dependency2.test index 162141daf..c89beef6b 100644 --- a/tests/Composer/Test/Fixtures/installer/circular-dependency2.test +++ b/tests/Composer/Test/Fixtures/installer/circular-dependency2.test @@ -23,10 +23,7 @@ Circular dependencies are possible between packages { "name": "regular/pkg", "version": "1.0.0", - "source": { "reference": "some.branch", "type": "git", "url": "" }, - "__dummy__require": { - "require/itself": "1.0.0" - } + "source": { "reference": "some.branch", "type": "git", "url": "" } } ] }