Skip to content

Commit

Permalink
Support ignore-platform-reqs in composer outdated
Browse files Browse the repository at this point in the history
This allows users to also find libraries that require major platform
changes to unlock updates.
It addresses #10291.
  • Loading branch information
rdohms committed Nov 22, 2021
1 parent 8386264 commit 9a311e4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
8 changes: 8 additions & 0 deletions src/Composer/Command/OutdatedCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ protected function configure()
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(
<<<EOT
Expand Down Expand Up @@ -88,6 +90,12 @@ protected function execute(InputInterface $input, OutputInterface $output)
if ($input->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');

Expand Down
14 changes: 10 additions & 4 deletions src/Composer/Command/ShowCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

use Composer\Composer;
use Composer\DependencyResolver\DefaultPolicy;
use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory;
use Composer\Json\JsonFile;
use Composer\Package\BasePackage;
use Composer\Package\CompletePackageInterface;
Expand Down Expand Up @@ -88,6 +89,8 @@ protected function configure()
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(
<<<EOT
Expand Down Expand Up @@ -151,6 +154,8 @@ protected function execute(InputInterface $input, OutputInterface $output)
return 1;
}

$ignorePlatformReqs = $input->getOption('ignore-platform-reqs') ?: ($input->getOption('ignore-platform-req') ?: false);

// init repos
$platformOverrides = array();
if ($composer) {
Expand Down Expand Up @@ -267,7 +272,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
} 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')
Expand Down Expand Up @@ -387,7 +392,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
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;
}
Expand Down Expand Up @@ -1248,10 +1253,11 @@ private function writeTreeLine($line)
* 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();
Expand All @@ -1276,7 +1282,7 @@ private function findLatestPackage(PackageInterface $package, Composer $composer
$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();
}
Expand Down

0 comments on commit 9a311e4

Please sign in to comment.