Add --direct and --outdated flags to ShowCommand & OutdatedCommand, fixes #5240

main
Jordi Boggiano 8 years ago
parent e85029da0c
commit aabe21d84d

@ -321,6 +321,8 @@ php composer.phar show monolog/monolog 1.0.2
* **--tree (-t):** List your dependencies as a tree. If you pass a package name it will show the dependency tree for that package.
* **--name-only (-N):** List package names only.
* **--path (-P):** List package paths.
* **--outdated (-o):** Implies --latest, but this lists *only* packages that have a newer version available.
* **--direct (-D):** Restricts the list of packages to your direct dependencies.
## outdated
@ -334,6 +336,11 @@ The color coding is as such:
you can but it may involve work.
- **red**: Dependency has a new version that is semver-compatible and you should upgrade it.
### Options
* **--outdated (-o):** Lists *only* packages that have a newer version available.
* **--direct (-D):** Restricts the list of packages to your direct dependencies.
## browse / home
The `browse` (aliased to `home`) opens a package's repository URL or homepage

@ -16,6 +16,7 @@ use Composer\Util\ProcessExecutor;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
@ -30,6 +31,8 @@ class OutdatedCommand extends ShowCommand
->setDescription('Shows a list of installed packages including their latest version.')
->setDefinition(array(
new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'),
new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated'),
new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'),
))
->setHelp(<<<EOT
The outdated command is just a proxy for `composer show -l`
@ -50,8 +53,10 @@ EOT
protected function execute(InputInterface $input, OutputInterface $output)
{
$pkg = $input->getArgument('package') ? ProcessExecutor::escape($input->getArgument('package')) : '';
$input = new StringInput('show --latest '.$pkg);
$args = array($input->getArgument('package') ? ProcessExecutor::escape($input->getArgument('package')) : '');
$args[] = $input->getOption('outdated') ? ProcessExecutor::escape('--outdated') : '';
$args[] = $input->getOption('direct') ? ProcessExecutor::escape('--direct') : '';
$input = new StringInput('show --latest '.implode(' ', $args));
return $this->getApplication()->run($input, $output);
}

@ -70,6 +70,8 @@ class ShowCommand extends BaseCommand
new InputOption('path', 'P', InputOption::VALUE_NONE, 'Show package paths'),
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('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'),
))
->setHelp(<<<EOT
The show command displays detailed information about a package, or
@ -94,10 +96,20 @@ EOT
$io->writeError('<warning>You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.</warning>');
}
if ($input->getOption('outdated')) {
$input->setOption('latest', true);
}
if ($input->getOption('direct') && ($input->getOption('all') || $input->getOption('available') || $input->getOption('platform'))) {
$io->writeError('The --direct (-D) option is not usable in combination with --all, --platform (-p) or --available (-a)');
return 1;
}
if ($input->getOption('tree') && ($input->getOption('all') || $input->getOption('available'))) {
$io->writeError('The --tree (-t) option is not usable in combination with --all or --available (-a)');
return 0;
return 1;
}
// init repos
@ -185,12 +197,7 @@ EOT
// show tree view if requested
if ($input->getOption('tree')) {
$rootPackage = $this->getComposer()->getPackage();
$rootRequires = array_map(
'strtolower',
array_keys(array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()))
);
$rootRequires = $this->getRootRequires();
foreach ($installedRepo->getPackages() as $package) {
if (in_array($package->getName(), $rootRequires, true)) {
$this->displayPackageTree($package, $installedRepo, $repos);
@ -212,6 +219,11 @@ EOT
$packageFilter = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i';
}
$packageListFilter = array();
if ($input->getOption('direct')) {
$packageListFilter = $this->getRootRequires();
}
foreach ($repos as $repo) {
if ($repo === $platformRepo) {
$type = '<info>platform</info>:';
@ -236,7 +248,9 @@ EOT
|| version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<')
) {
if (!$packageFilter || preg_match($packageFilter, $package->getName())) {
$packages[$type][$package->getName()] = $package;
if (!$packageListFilter || in_array($package->getName(), $packageListFilter, true)) {
$packages[$type][$package->getName()] = $package;
}
}
}
}
@ -291,17 +305,20 @@ EOT
$writeDescription = !$input->getOption('name-only') && !$input->getOption('path') && ($nameLength + $versionLength + $latestLength + 24 <= $width);
foreach ($packages[$type] as $package) {
if (is_object($package)) {
$latestPackackage = null;
if ($showLatest && isset($latestPackages[$package->getPrettyName()])) {
$latestPackackage = $latestPackages[$package->getPrettyName()];
}
if ($input->getOption('outdated') && $latestPackackage && $latestPackackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) {
continue;
}
$io->write($indent . str_pad($package->getPrettyName(), $nameLength, ' '), false);
if ($writeVersion) {
$io->write(' ' . str_pad($package->getFullPrettyVersion(), $versionLength, ' '), false);
}
$latestPackackage = null;
if ($showLatest && isset($latestPackages[$package->getPrettyName()])) {
$latestPackackage = $latestPackages[$package->getPrettyName()];
}
if ($writeLatest && $latestPackackage) {
$latestVersion = $latestPackackage->getFullPrettyVersion();
$style = $this->getVersionStyle($latestVersion, $package);
@ -352,6 +369,15 @@ EOT
}
}
protected function getRootRequires()
{
$rootPackage = $this->getComposer()->getPackage();
return array_map(
'strtolower',
array_keys(array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()))
);
}
protected function getVersionStyle($latestVersion, $package)
{
if ($latestVersion === $package->getFullPrettyVersion()) {

Loading…
Cancel
Save