PoolBuilder: properly clean up alias packages when unfixing packages

Prevent aliases to be duplicated: no need to apply root aliases from
composer.json on packages currently locked, they should have their
aliases in the lock file, otherwise request an update.
main
Nils Adermann 4 years ago
parent 2dfbf3692a
commit 613450e58a

@ -220,7 +220,9 @@ class PoolBuilder
} }
} }
if (isset($this->rootAliases[$name][$package->getVersion()])) { // if propogateUpdate is false we are loading a fixed package, root aliases do not apply as they are manually
// loaded as separate packages in this case
if ($propagateUpdate && isset($this->rootAliases[$name][$package->getVersion()])) {
$alias = $this->rootAliases[$name][$package->getVersion()]; $alias = $this->rootAliases[$name][$package->getVersion()];
if ($package instanceof AliasPackage) { if ($package instanceof AliasPackage) {
$basePackage = $package->getAliasOf(); $basePackage = $package->getAliasOf();
@ -345,11 +347,19 @@ class PoolBuilder
private function unfixPackage(Request $request, $name) private function unfixPackage(Request $request, $name)
{ {
// remove locked package by this name which was already initialized // remove locked package by this name which was already initialized
foreach ($this->packages as $i => $loadedPackage) { foreach ($request->getLockedRepository()->getPackages() as $lockedPackage) {
if ($loadedPackage->getName() === $name && $loadedPackage->getRepository() === $request->getLockedRepository()) { if (!($lockedPackage instanceof AliasPackage) && $lockedPackage->getName() === $name) {
$request->unfixPackage($loadedPackage); if (false !== $index = array_search($lockedPackage, $this->packages, true)) {
unset($this->packages[$i]); $request->unfixPackage($lockedPackage);
unset($this->aliasMap[spl_object_hash($loadedPackage)]); unset($this->packages[$index]);
if (isset($this->aliasMap[spl_object_hash($lockedPackage)])) {
foreach ($this->aliasMap[spl_object_hash($lockedPackage)] as $aliasIndex => $aliasPackage) {
$request->unfixPackage($aliasPackage);
unset($this->packages[$aliasIndex]);
}
unset($this->aliasMap[spl_object_hash($lockedPackage)]);
}
}
} }
} }

@ -7,33 +7,52 @@ Require a new package in the composer.json and updating with its name as an argu
"type": "package", "type": "package",
"package": [ "package": [
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, { "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": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}},
{ "name": "current/dep", "version": "1.0.0" }, { "name": "current/dep", "version": "1.0.0" },
{ "name": "current/dep", "version": "1.1.0" }, { "name": "current/dep", "version": "1.1.0", "require": {"current/dep2": "*"} },
{ "name": "current/dep", "version": "1.2.0" }, { "name": "current/dep", "version": "1.2.0" },
{ "name": "new/pkg", "version": "1.0.0", "require": { "current/dep": "^1.1" } }, { "name": "current/dep2", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}},
{ "name": "new/pkg", "version": "1.0.0", "require": { "current/dep": "^1.1", "current/dep2": "*"} },
{ "name": "new/pkg", "version": "1.1.0", "require": { "current/dep": "^1.2" } } { "name": "new/pkg", "version": "1.1.0", "require": { "current/dep": "^1.2" } }
] ]
} }
], ],
"require": { "require": {
"current/pkg": "1.*", "current/dep": "dev-master as 1.1.0",
"current/dep2": "dev-master as 1.1.0",
"current/pkg": "1.0.0 as 2.0.0",
"new/pkg": "1.*" "new/pkg": "1.*"
} },
"minimum-stability": "dev"
} }
--INSTALLED-- --INSTALLED--
[ [
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, { "name": "current/dep", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}},
{ "name": "current/dep", "version": "1.0.0" } { "name": "current/dep2", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}},
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }
] ]
--LOCK-- --LOCK--
{ {
"packages": [ "packages": [
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }, { "name": "current/dep", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}, "type": "library"},
{ "name": "current/dep", "version": "1.0.0" } { "name": "current/dep2", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}, "type": "library"},
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" } }
], ],
"packages-dev": [], "packages-dev": [],
"aliases": [], "aliases": [
{
"alias": "1.1.0",
"alias_normalized": "1.1.0.0",
"version": "dev-master",
"package": "current/dep"
},
{
"alias": "1.1.0",
"alias_normalized": "1.1.0.0",
"version": "dev-master",
"package": "current/dep2"
}
],
"minimum-stability": "dev", "minimum-stability": "dev",
"stability-flags": [], "stability-flags": [],
"prefer-stable": false, "prefer-stable": false,
@ -42,7 +61,48 @@ Require a new package in the composer.json and updating with its name as an argu
"platform-dev": [] "platform-dev": []
} }
--RUN-- --RUN--
update new/pkg --with-dependencies update new/pkg --with-all-dependencies
--EXPECT-LOCK--
{
"packages": [
{ "name": "current/dep", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}, "type": "library"},
{ "name": "current/dep2", "version": "dev-master", "extra": {"branch-alias": {"dev-master": "1.0.x-dev"}}, "type": "library"},
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "<1.2.0" }, "type": "library"},
{ "name": "new/pkg", "version": "1.0.0", "require": { "current/dep": "^1.1", "current/dep2": "*"}, "type": "library"}
],
"packages-dev": [],
"aliases": [
{
"alias": "1.1.0",
"alias_normalized": "1.1.0.0",
"version": "dev-master",
"package": "current/dep"
},
{
"alias": "1.1.0",
"alias_normalized": "1.1.0.0",
"version": "dev-master",
"package": "current/dep2"
},
{
"alias": "2.0.0",
"alias_normalized": "2.0.0.0",
"version": "1.0.0.0",
"package": "current/pkg"
}
],
"minimum-stability": "dev",
"stability-flags": {
"current/dep": 20,
"current/dep2": 20
},
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
}
--EXPECT-- --EXPECT--
Upgrading current/dep (1.0.0 => 1.1.0) Marking current/dep (1.1.0) as installed, alias of current/dep (dev-master)
Marking current/pkg (2.0.0) as installed, alias of current/pkg (1.0.0)
Marking current/dep2 (1.1.0) as installed, alias of current/dep2 (dev-master)
Installing new/pkg (1.0.0) Installing new/pkg (1.0.0)

Loading…
Cancel
Save