diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 36c991816..9dbe7ce9a 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -200,7 +200,8 @@ class PoolBuilder private function loadPackage(Request $request, PackageInterface $package, $propagateUpdate = true) { - $index = count($this->packages); + end($this->packages); + $index = key($this->packages) + 1; $this->packages[] = $package; if ($package instanceof AliasPackage) { @@ -348,6 +349,7 @@ class PoolBuilder if ($loadedPackage->getName() === $name && $loadedPackage->getRepository() === $request->getLockedRepository()) { $request->unfixPackage($loadedPackage); unset($this->packages[$i]); + unset($this->aliasMap[spl_object_hash($loadedPackage)]); } } diff --git a/tests/Composer/Test/Fixtures/installer/update-allow-list-with-dependencies-alias.test b/tests/Composer/Test/Fixtures/installer/update-allow-list-with-dependencies-alias.test new file mode 100644 index 000000000..24eb95538 --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/update-allow-list-with-dependencies-alias.test @@ -0,0 +1,48 @@ +--TEST-- +Require a new package in the composer.json and updating with its name as an argument and with-dependencies should update locked dependencies as far as possible +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, + { "name": "current/pkg", "version": "1.1.0", "require": { "current/dep": "^1.0" } }, + { "name": "current/dep", "version": "1.0.0" }, + { "name": "current/dep", "version": "1.1.0" }, + { "name": "current/dep", "version": "1.2.0" }, + { "name": "new/pkg", "version": "1.0.0", "require": { "current/dep": "^1.1" } }, + { "name": "new/pkg", "version": "1.1.0", "require": { "current/dep": "^1.2" } } + ] + } + ], + "require": { + "current/pkg": "1.*", + "new/pkg": "1.*" + } +} +--INSTALLED-- +[ + { "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, + { "name": "current/dep", "version": "1.0.0" } +] +--LOCK-- +{ + "packages": [ + { "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, + { "name": "current/dep", "version": "1.0.0" } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} +--RUN-- +update new/pkg --with-dependencies +--EXPECT-- +Upgrading current/dep (1.0.0 => 1.1.0) +Installing new/pkg (1.0.0)