From c7250917e85146bf1399cac6038a005af95e5fac Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Mon, 28 May 2012 12:02:15 +0200 Subject: [PATCH] Skip dependency packages required in composer.json in update whitelist --- src/Composer/Installer.php | 26 +++++++++++++++++-- .../update-whitelist-locked-require.test | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index ba16eeee4..5d5c88836 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -220,7 +220,11 @@ class Installer $stabilityFlags = $this->locker->getStabilityFlags(); } - $this->whitelistUpdateDependencies($localRepo, $devMode); + $this->whitelistUpdateDependencies( + $localRepo, + $devMode, + $this->package->getRequires(), + $this->package->getDevRequires()); // creating repository pool $pool = new Pool($minimumStability, $stabilityFlags); @@ -464,15 +468,30 @@ class Installer /** * Adds all dependencies of the update whitelist to the whitelist, too. * + * Packages which are listed as requirements in the root package will be + * skipped including their dependencies, unless they are listed in the + * update whitelist themselves. + * * @param RepositoryInterface $localRepo * @param boolean $devMode + * @param array $rootRequires An array of links to packages in require of the root package + * @param array $rootDevRequires An array of links to packages in require-dev of the root package */ - private function whitelistUpdateDependencies($localRepo, $devMode) + private function whitelistUpdateDependencies($localRepo, $devMode, array $rootRequires, array $rootDevRequires) { if (!$this->updateWhitelist) { return; } + if ($devMode) { + $rootRequires = array_merge($rootRequires, $rootDevRequires); + } + + $skipPackages = array(); + foreach ($rootRequires as $require) { + $skipPackages[$require->getTarget()] = true; + } + $pool = new Pool; $pool->addRepository($localRepo); @@ -503,6 +522,9 @@ class Installer $requirePackages = $pool->whatProvides($require->getTarget()); foreach ($requirePackages as $requirePackage) { + if (isset($skipPackages[$requirePackage->getName()])) { + continue; + } $packageQueue->enqueue($requirePackage); } } diff --git a/tests/Composer/Test/Fixtures/installer/update-whitelist-locked-require.test b/tests/Composer/Test/Fixtures/installer/update-whitelist-locked-require.test index f0cf96ee7..6586e461f 100644 --- a/tests/Composer/Test/Fixtures/installer/update-whitelist-locked-require.test +++ b/tests/Composer/Test/Fixtures/installer/update-whitelist-locked-require.test @@ -24,7 +24,7 @@ Update with a package whitelist only updates those packages and their dependenci } --INSTALLED-- [ - { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0", "fixed-dependency": "1.0.0" } }, + { "name": "whitelisted", "version": "1.0.0", "require": { "dependency": "1.0.0", "fixed-dependency": "1.*" } }, { "name": "dependency", "version": "1.0.0" }, { "name": "fixed-dependency", "version": "1.0.0", "require": { "fixed-sub-dependency": "1.*" } }, { "name": "fixed-sub-dependency", "version": "1.0.0" }