Add --direct and --outdated flags to ShowCommand & OutdatedCommand, fixes #5240
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.
|
* **--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.
|
* **--name-only (-N):** List package names only.
|
||||||
* **--path (-P):** List package paths.
|
* **--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
|
## outdated
|
||||||
|
|
||||||
|
@ -334,6 +336,11 @@ The color coding is as such:
|
||||||
you can but it may involve work.
|
you can but it may involve work.
|
||||||
- **red**: Dependency has a new version that is semver-compatible and you should upgrade it.
|
- **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
|
## browse / home
|
||||||
|
|
||||||
The `browse` (aliased to `home`) opens a package's repository URL or homepage
|
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\InputInterface;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\StringInput;
|
use Symfony\Component\Console\Input\StringInput;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
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.')
|
->setDescription('Shows a list of installed packages including their latest version.')
|
||||||
->setDefinition(array(
|
->setDefinition(array(
|
||||||
new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'),
|
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
|
->setHelp(<<<EOT
|
||||||
The outdated command is just a proxy for `composer show -l`
|
The outdated command is just a proxy for `composer show -l`
|
||||||
|
@ -50,8 +53,10 @@ EOT
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output)
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
$pkg = $input->getArgument('package') ? ProcessExecutor::escape($input->getArgument('package')) : '';
|
$args = array($input->getArgument('package') ? ProcessExecutor::escape($input->getArgument('package')) : '');
|
||||||
$input = new StringInput('show --latest '.$pkg);
|
$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);
|
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('path', 'P', InputOption::VALUE_NONE, 'Show package paths'),
|
||||||
new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'),
|
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('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
|
->setHelp(<<<EOT
|
||||||
The show command displays detailed information about a package, or
|
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>');
|
$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'))) {
|
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)');
|
$io->writeError('The --tree (-t) option is not usable in combination with --all or --available (-a)');
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// init repos
|
// init repos
|
||||||
|
@ -185,12 +197,7 @@ EOT
|
||||||
|
|
||||||
// show tree view if requested
|
// show tree view if requested
|
||||||
if ($input->getOption('tree')) {
|
if ($input->getOption('tree')) {
|
||||||
$rootPackage = $this->getComposer()->getPackage();
|
$rootRequires = $this->getRootRequires();
|
||||||
$rootRequires = array_map(
|
|
||||||
'strtolower',
|
|
||||||
array_keys(array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()))
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($installedRepo->getPackages() as $package) {
|
foreach ($installedRepo->getPackages() as $package) {
|
||||||
if (in_array($package->getName(), $rootRequires, true)) {
|
if (in_array($package->getName(), $rootRequires, true)) {
|
||||||
$this->displayPackageTree($package, $installedRepo, $repos);
|
$this->displayPackageTree($package, $installedRepo, $repos);
|
||||||
|
@ -212,6 +219,11 @@ EOT
|
||||||
$packageFilter = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i';
|
$packageFilter = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$packageListFilter = array();
|
||||||
|
if ($input->getOption('direct')) {
|
||||||
|
$packageListFilter = $this->getRootRequires();
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($repos as $repo) {
|
foreach ($repos as $repo) {
|
||||||
if ($repo === $platformRepo) {
|
if ($repo === $platformRepo) {
|
||||||
$type = '<info>platform</info>:';
|
$type = '<info>platform</info>:';
|
||||||
|
@ -236,12 +248,14 @@ EOT
|
||||||
|| version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<')
|
|| version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<')
|
||||||
) {
|
) {
|
||||||
if (!$packageFilter || preg_match($packageFilter, $package->getName())) {
|
if (!$packageFilter || preg_match($packageFilter, $package->getName())) {
|
||||||
|
if (!$packageListFilter || in_array($package->getName(), $packageListFilter, true)) {
|
||||||
$packages[$type][$package->getName()] = $package;
|
$packages[$type][$package->getName()] = $package;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$showAllTypes = $input->getOption('all');
|
$showAllTypes = $input->getOption('all');
|
||||||
$showLatest = $input->getOption('latest');
|
$showLatest = $input->getOption('latest');
|
||||||
|
@ -291,17 +305,20 @@ EOT
|
||||||
$writeDescription = !$input->getOption('name-only') && !$input->getOption('path') && ($nameLength + $versionLength + $latestLength + 24 <= $width);
|
$writeDescription = !$input->getOption('name-only') && !$input->getOption('path') && ($nameLength + $versionLength + $latestLength + 24 <= $width);
|
||||||
foreach ($packages[$type] as $package) {
|
foreach ($packages[$type] as $package) {
|
||||||
if (is_object($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);
|
$io->write($indent . str_pad($package->getPrettyName(), $nameLength, ' '), false);
|
||||||
|
|
||||||
if ($writeVersion) {
|
if ($writeVersion) {
|
||||||
$io->write(' ' . str_pad($package->getFullPrettyVersion(), $versionLength, ' '), false);
|
$io->write(' ' . str_pad($package->getFullPrettyVersion(), $versionLength, ' '), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$latestPackackage = null;
|
|
||||||
if ($showLatest && isset($latestPackages[$package->getPrettyName()])) {
|
|
||||||
$latestPackackage = $latestPackages[$package->getPrettyName()];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($writeLatest && $latestPackackage) {
|
if ($writeLatest && $latestPackackage) {
|
||||||
$latestVersion = $latestPackackage->getFullPrettyVersion();
|
$latestVersion = $latestPackackage->getFullPrettyVersion();
|
||||||
$style = $this->getVersionStyle($latestVersion, $package);
|
$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)
|
protected function getVersionStyle($latestVersion, $package)
|
||||||
{
|
{
|
||||||
if ($latestVersion === $package->getFullPrettyVersion()) {
|
if ($latestVersion === $package->getFullPrettyVersion()) {
|
||||||
|
|
Loading…
Reference in New Issue