From 78583ab678aefaee6efcf8e1cf37cd46e2981fb6 Mon Sep 17 00:00:00 2001 From: Rafael Dohms <94331+rdohms@users.noreply.github.com> Date: Tue, 23 Nov 2021 17:16:58 +0100 Subject: [PATCH] Support ignore-platform-reqs in `composer outdated` (#10293) This allows users to also find libraries that require major platform changes to unlock updates. It addresses #10291. --- doc/03-cli.md | 13 +++++++++++++ src/Composer/Command/OutdatedCommand.php | 8 ++++++++ src/Composer/Command/ShowCommand.php | 14 ++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index e8ea3672c..79a8d0b78 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -485,6 +485,13 @@ php composer.phar show monolog/monolog 1.0.2 * **--direct (-D):** Restricts the list of packages to your direct dependencies. * **--strict:** Return a non-zero exit code when there are outdated packages. * **--format (-f):** Lets you pick between text (default) or json output format. +* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, + `lib-*` and `ext-*`) and force the installation even if the local machine does + not fulfill these. Use with the --outdated option. +* **--ignore-platform-req:** ignore a specific platform requirement(`php`, + `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine + does not fulfill it. Multiple requirements can be ignored via wildcard. Use with + the --outdated option. ## outdated @@ -508,6 +515,12 @@ The color coding is as such: * **--format (-f):** Lets you pick between text (default) or json output format. * **--no-dev:** Do not show outdated dev dependencies. * **--locked:** Shows updates for packages from the lock file, regardless of what is currently in vendor dir. +* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, + `lib-*` and `ext-*`) and force the installation even if the local machine does + not fulfill these. +* **--ignore-platform-req:** ignore a specific platform requirement(`php`, + `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine + does not fulfill it. Multiple requirements can be ignored via wildcard. ## browse / home diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index 0b38f2f0e..503541584 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -42,6 +42,8 @@ class OutdatedCommand extends ShowCommand new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), + new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), + new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), )) ->setHelp( <<getOption('no-dev')) { $args['--no-dev'] = true; } + if ($input->getOption('ignore-platform-req')) { + $args['--ignore-platform-req'] = $input->getOption('ignore-platform-req'); + } + if ($input->getOption('ignore-platform-reqs')) { + $args['--ignore-platform-reqs'] = true; + } $args['--format'] = $input->getOption('format'); $args['--ignore'] = $input->getOption('ignore'); diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 8f80f2808..dae6ac70b 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -14,6 +14,7 @@ namespace Composer\Command; use Composer\Composer; use Composer\DependencyResolver\DefaultPolicy; +use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; @@ -88,6 +89,8 @@ class ShowCommand extends BaseCommand new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), + new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), + new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), )) ->setHelp( <<getOption('ignore-platform-reqs') ?: ($input->getOption('ignore-platform-req') ?: false); + // init repos $platformOverrides = array(); if ($composer) { @@ -267,7 +272,7 @@ EOT } else { $latestPackage = null; if ($input->getOption('latest')) { - $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $input->getOption('minor-only')); + $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $input->getOption('minor-only'), $ignorePlatformReqs); } if ( $input->getOption('outdated') @@ -387,7 +392,7 @@ EOT if ($showLatest && $showVersion) { foreach ($packages[$type] as $package) { if (is_object($package)) { - $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $showMinorOnly); + $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $showMinorOnly, $ignorePlatformReqs); if ($latestPackage === false) { continue; } @@ -1248,10 +1253,11 @@ EOT * Given a package, this finds the latest package matching it * * @param bool $minorOnly + * @param bool|string $ignorePlatformReqs * * @return PackageInterface|false */ - private function findLatestPackage(PackageInterface $package, Composer $composer, PlatformRepository $platformRepo, $minorOnly = false) + private function findLatestPackage(PackageInterface $package, Composer $composer, PlatformRepository $platformRepo, $minorOnly = false, $ignorePlatformReqs = false) { // find the latest version allowed in this repo set $name = $package->getName(); @@ -1276,7 +1282,7 @@ EOT $targetVersion = '^' . $package->getVersion(); } - $candidate = $versionSelector->findBestCandidate($name, $targetVersion, $bestStability); + $candidate = $versionSelector->findBestCandidate($name, $targetVersion, $bestStability, PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); while ($candidate instanceof AliasPackage) { $candidate = $candidate->getAliasOf(); }