From 44e65915731448a1f89fc7adf34805b6d2564890 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 24 May 2021 16:53:02 +0200 Subject: [PATCH] Improve error reporting for exts overridden by platform config, fixes #9876 --- src/Composer/DependencyResolver/Problem.php | 36 +++++++----- .../platform-ext-solver-problems.test | 56 +++++++++++++++++++ 2 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 tests/Composer/Test/Fixtures/installer/platform-ext-solver-problems.test diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index 3f7f8d000..8004f476c 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -181,26 +181,16 @@ class Problem { // handle php/hhvm if ($packageName === 'php' || $packageName === 'php-64bit' || $packageName === 'hhvm') { - $version = phpversion(); - $available = $pool->whatProvides($packageName); - - if (count($available)) { - $firstAvailable = reset($available); - $version = $firstAvailable->getPrettyVersion(); - $extra = $firstAvailable->getExtra(); - if ($firstAvailable instanceof CompletePackageInterface && isset($extra['config.platform']) && $extra['config.platform'] === true) { - $version .= '; ' . str_replace('Package ', '', $firstAvailable->getDescription()); - } - } + $version = self::getPlatformPackageVersion($pool, $packageName, phpversion()); $msg = "- Root composer.json requires ".$packageName.self::constraintToText($constraint).' but '; - if (defined('HHVM_VERSION') || (count($available) && $packageName === 'hhvm')) { + if (defined('HHVM_VERSION') || ($packageName === 'hhvm' && count($pool->whatProvides($packageName)) > 0)) { return array($msg, 'your HHVM version does not satisfy that requirement.'); } if ($packageName === 'hhvm') { - return array($msg, 'you are running this with PHP and not HHVM.'); + return array($msg, 'HHVM was not detected on this machine, make sure it is in your PATH.'); } return array($msg, 'your '.$packageName.' version ('. $version .') does not satisfy that requirement.'); @@ -213,7 +203,9 @@ class Problem } $ext = substr($packageName, 4); - $error = extension_loaded($ext) ? 'it has the wrong version ('.(phpversion($ext) ?: '0').') installed' : 'it is missing from your system'; + $version = self::getPlatformPackageVersion($pool, $packageName, phpversion($ext) ?: '0'); + + $error = extension_loaded($ext) ? 'it has the wrong version ('.$version.') installed' : 'it is missing from your system'; return array("- Root composer.json requires PHP extension ".$packageName.self::constraintToText($constraint).' but ', $error.'. Install or enable PHP\'s '.$ext.' extension.'); } @@ -358,6 +350,22 @@ class Problem return implode(', ', $prepared); } + private static function getPlatformPackageVersion(Pool $pool, $packageName, $version) + { + $available = $pool->whatProvides($packageName); + + if (count($available)) { + $firstAvailable = reset($available); + $version = $firstAvailable->getPrettyVersion(); + $extra = $firstAvailable->getExtra(); + if ($firstAvailable instanceof CompletePackageInterface && isset($extra['config.platform']) && $extra['config.platform'] === true) { + $version .= '; ' . str_replace('Package ', '', $firstAvailable->getDescription()); + } + } + + return $version; + } + /** * @param string[] $versions an array of pretty versions, with normalized versions as keys * @return list a list of pretty versions and '...' where versions were removed diff --git a/tests/Composer/Test/Fixtures/installer/platform-ext-solver-problems.test b/tests/Composer/Test/Fixtures/installer/platform-ext-solver-problems.test new file mode 100644 index 000000000..625bf9d9f --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/platform-ext-solver-problems.test @@ -0,0 +1,56 @@ +--TEST-- +Test the error output of solver problems with ext/platform packages which have platform config +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + {"name": "a/a", "version": "1.0.0", "require": {"ext-filter": "2.0.0"}} + ] + } + ], + "require": { + "a/a": "*" + }, + "config": { + "platform": { + "ext-filter": "7.4.0" + } + } +} + +--LOCK-- +{ + "packages": [ + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} + +--RUN-- +update + +--EXPECT-EXIT-CODE-- +2 + +--EXPECT-OUTPUT-- +Loading composer repositories with package information +Updating dependencies +Your requirements could not be resolved to an installable set of packages. + + Problem 1 + - Root composer.json requires a/a * -> satisfiable by a/a[1.0.0]. + - a/a 1.0.0 requires ext-filter 2.0.0 -> it has the wrong version (7.4.0; overridden via config.platform, actual: %s) installed. Install or enable PHP's filter extension. + +To enable extensions, verify that they are enabled in your .ini files: +__inilist__ +You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode. + +--EXPECT--