1
0
Fork 0

Mark replaced packages for update when using --with-dependencies

This is necessary to allow the requiring of new packages which replace
packages currently locked without requiring explicitly listing them as
an argument, so simplifies the composer require command
pull/8717/head
Nils Adermann 2020-03-27 22:59:00 +01:00
parent 17b50157e4
commit 443553423b
2 changed files with 61 additions and 1 deletions

View File

@ -215,7 +215,6 @@ class PoolBuilder
// apply to // apply to
if (isset($this->rootReferences[$name])) { if (isset($this->rootReferences[$name])) {
// do not modify the references on already locked packages // do not modify the references on already locked packages
// TODO what about unfix on allow update?
if (!$request->isFixedPackage($package)) { if (!$request->isFixedPackage($package)) {
$package->setSourceDistReferences($this->rootReferences[$name]); $package->setSourceDistReferences($this->rootReferences[$name]);
} }
@ -266,6 +265,23 @@ class PoolBuilder
} }
} }
// if we're doing a partial update with deps and we're not loading an initial fixed package
// we also need to trigger an update for transitive deps which are being replaced
if ($propagateUpdate && $request->getUpdateAllowTransitiveDependencies()) {
foreach ($package->getReplaces() as $link) {
$replace = $link->getTarget();
if (isset($this->loadedNames[$replace]) && isset($this->skippedLoad[$replace])) {
if ($request->getUpdateAllowTransitiveRootDependencies() || !$this->isRootRequire($request, $replace)) {
$this->unfixPackage($request, $replace);
$loadNames[$replace] = null;
} elseif (!$request->getUpdateAllowTransitiveRootDependencies() && $this->isRootRequire($request, $replace) && !isset($this->updateAllowWarned[$require]) && $this->io) {
$this->updateAllowWarned[$replace] = true;
$this->io->writeError('<warning>Dependency "'.$require.'" is also a root requirement. Package has not been listed as an update argument, so keeping locked at old version. Use --with-all-dependencies to include root dependencies.</warning>');
}
}
}
}
return $loadNames; return $loadNames;
} }

View File

@ -0,0 +1,44 @@
--TEST--
Require a new package in the composer.json and updating with its name as an argument and with-dependencies should remove packages it replaces which are not root requirements
--COMPOSER--
{
"repositories": [
{
"type": "package",
"package": [
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "*" } },
{ "name": "current/dep", "version": "1.0.0" },
{ "name": "new/pkg", "version": "1.0.0", "replace": { "current/dep": "1.0.0" } }
]
}
],
"require": {
"current/pkg": "1.*",
"new/pkg": "1.*"
}
}
--INSTALLED--
[
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "*" } },
{ "name": "current/dep", "version": "1.0.0" }
]
--LOCK--
{
"packages": [
{ "name": "current/pkg", "version": "1.0.0", "require": { "current/dep": "*" } },
{ "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--
Removing current/dep (1.0.0)
Installing new/pkg (1.0.0)