From 62b506214640ae66ad88a07240a0bbb0201bd1e3 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 22 Sep 2014 17:04:58 +0100 Subject: [PATCH] Improve sorting of plugin packages, fixes #3109, refs #2972 --- src/Composer/Installer.php | 16 +++++++++++++--- .../installer/plugins-are-installed-first.test | 11 +++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 3176ece17..5191d8558 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -597,9 +597,19 @@ class Installer continue; } - if ($package->getRequires() === array() && ($package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer')) { - $installerOps[] = $op; - unset($operations[$idx]); + if ($package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer') { + // ignore requirements to platform or composer-plugin-api + $requires = array_keys($package->getRequires()); + foreach ($requires as $index => $req) { + if ($req === 'composer-plugin-api' || preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $req)) { + unset($requires[$index]); + } + } + // if there are no other requirements, move the plugin to the top of the op list + if (!count($requires)) { + $installerOps[] = $op; + unset($operations[$idx]); + } } } diff --git a/tests/Composer/Test/Fixtures/installer/plugins-are-installed-first.test b/tests/Composer/Test/Fixtures/installer/plugins-are-installed-first.test index c57a36d35..ad34e9c02 100644 --- a/tests/Composer/Test/Fixtures/installer/plugins-are-installed-first.test +++ b/tests/Composer/Test/Fixtures/installer/plugins-are-installed-first.test @@ -1,5 +1,5 @@ --TEST-- -Composer installers are installed first if they have no requirements +Composer installers are installed first if they have no meaningful requirements --COMPOSER-- { "repositories": [ @@ -9,20 +9,23 @@ Composer installers are installed first if they have no requirements { "name": "pkg", "version": "1.0.0" }, { "name": "pkg2", "version": "1.0.0" }, { "name": "inst", "version": "1.0.0", "type": "composer-plugin" }, - { "name": "inst2", "version": "1.0.0", "type": "composer-plugin", "require": { "pkg2": "*" } } + { "name": "inst-with-req", "version": "1.0.0", "type": "composer-plugin", "require": { "php": ">=5", "ext-json": "*", "composer-plugin-api": "*" } }, + { "name": "inst-with-req2", "version": "1.0.0", "type": "composer-plugin", "require": { "pkg2": "*" } } ] } ], "require": { "pkg": "1.0.0", "inst": "1.0.0", - "inst2": "1.0.0" + "inst-with-req2": "1.0.0", + "inst-with-req": "1.0.0" } } --RUN-- install --EXPECT-- Installing inst (1.0.0) +Installing inst-with-req (1.0.0) Installing pkg (1.0.0) Installing pkg2 (1.0.0) -Installing inst2 (1.0.0) +Installing inst-with-req2 (1.0.0)