diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index b00348f08..8fdd63097 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -71,6 +71,7 @@ class ShowCommand extends BaseCommand new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), + new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages which have minor updates. Use in combination with --outdated'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), )) ->setHelp(<<getPrettyName()])) { $latestPackackage = $latestPackages[$package->getPrettyName()]; } + + if ($input->getOption('outdated') && $input->getOption('minor-only') && $latestPackackage && (!$this->isImmediateSemverCompliantUpgradeNeeded($package, $latestPackackage) || $latestPackackage->isAbandoned())) { + continue; + } + if ($input->getOption('outdated') && $latestPackackage && $latestPackackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackackage->isAbandoned()) { continue; } @@ -390,11 +396,7 @@ EOT return 'info'; } - $constraint = $package->getVersion(); - if (0 !== strpos($constraint, 'dev-')) { - $constraint = '^'.$constraint; - } - if ($latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint)) { + if ($this->isImmediateSemverCompliantUpgradeNeeded($package, $latestPackage)) { // print red as it needs an immediate semver-compliant upgrade return 'highlight'; } @@ -403,6 +405,16 @@ EOT return 'comment'; } + protected function isImmediateSemverCompliantUpgradeNeeded(PackageInterface $package, PackageInterface $latestPackage) + { + $constraint = $package->getVersion(); + if (0 !== strpos($constraint, 'dev-')) { + $constraint = '^'.$constraint; + } + + return $latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint); + } + /** * finds a package by name and version if provided *