--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": { "mutual/target": "*", "mutual/target-provide": "*" } }, { "name": "current/dep", "version": "1.0.0", "replace": { "mutual/target": "1.0.0" } }, { "name": "new/pkg", "version": "1.0.0", "replace": { "mutual/target": "1.0.0" } }, { "name": "current/dep-provide", "version": "1.0.0", "provide": { "mutual/target-provide": "1.0.0" } }, { "name": "new/pkg-provide", "version": "1.0.0", "provide": { "mutual/target-provide": "1.0.0" } } ] } ], "require": { "current/pkg": "1.*", "new/pkg": "1.*", "new/pkg-provide": "1.*" } } --INSTALLED-- [ { "name": "current/pkg", "version": "1.0.0", "require": { "mutual/target": "*" } }, { "name": "current/dep", "version": "1.0.0", "replace": { "mutual/target": "1.0.0" } }, { "name": "current/dep-provide", "version": "1.0.0", "provide": { "mutual/target-provide": "1.0.0" } } ] --LOCK-- { "packages": [ { "name": "current/pkg", "version": "1.0.0", "require": { "mutual/target": "*" } }, { "name": "current/dep", "version": "1.0.0", "replace": { "mutual/target": "1.0.0" } }, { "name": "current/dep-provide", "version": "1.0.0", "provide": { "mutual/target-provide": "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-provide (1.0.0) Removing current/dep (1.0.0) Installing new/pkg (1.0.0) Installing new/pkg-provide (1.0.0)