From 77e104bd4dcf29057e090ee928097816507b7b9c Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 16:19:03 +0100 Subject: [PATCH 01/10] Fix typo in local variable name --- src/Composer/Command/ShowCommand.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index b90ba2edc..6e3123fe4 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -323,11 +323,11 @@ EOT $hasOutdatedPackages = false; foreach ($packages[$type] as $package) { if (is_object($package)) { - $latestPackackage = null; + $latestPackage = null; if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { - $latestPackackage = $latestPackages[$package->getPrettyName()]; + $latestPackage = $latestPackages[$package->getPrettyName()]; } - if ($input->getOption('outdated') && $latestPackackage && $latestPackackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackackage->isAbandoned()) { + if ($input->getOption('outdated') && $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackage->isAbandoned()) { continue; } elseif ($input->getOption('outdated')) { $hasOutdatedPackages = true; @@ -339,9 +339,9 @@ EOT $io->write(' ' . str_pad($package->getFullPrettyVersion(), $versionLength, ' '), false); } - if ($writeLatest && $latestPackackage) { - $latestVersion = $latestPackackage->getFullPrettyVersion(); - $style = $this->getVersionStyle($latestPackackage, $package); + if ($writeLatest && $latestPackage) { + $latestVersion = $latestPackage->getFullPrettyVersion(); + $style = $this->getVersionStyle($latestPackage, $package); if (!$io->isDecorated()) { $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; } @@ -365,9 +365,9 @@ EOT $io->write(' ' . $path, false); } - if ($latestPackackage && $latestPackackage->isAbandoned()) { - $replacement = (is_string($latestPackackage->getReplacementPackage())) - ? 'Use ' . $latestPackackage->getReplacementPackage() . ' instead' + if ($latestPackage && $latestPackage->isAbandoned()) { + $replacement = (is_string($latestPackage->getReplacementPackage())) + ? 'Use ' . $latestPackage->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $io->writeError(''); From 308fa887469af8a73b71ce947c4459ac55dc40c2 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 21:06:44 +0100 Subject: [PATCH 02/10] Move $io->write calls together --- src/Composer/Command/ShowCommand.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 6e3123fe4..226ca8dd7 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -272,9 +272,6 @@ EOT $latestPackages = array(); foreach (array('platform:' => true, 'available:' => false, 'installed:' => true) as $type => $showVersion) { if (isset($packages[$type])) { - if ($showAllTypes) { - $io->write($type); - } ksort($packages[$type]); $nameLength = $versionLength = $latestLength = 0; @@ -321,6 +318,10 @@ EOT $latestLength += 2; } $hasOutdatedPackages = false; + + if ($showAllTypes) { + $io->write($type); + } foreach ($packages[$type] as $package) { if (is_object($package)) { $latestPackage = null; From e672628565dd9e3d4632f784921680ab9f4c0759 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 21:27:46 +0100 Subject: [PATCH 03/10] Separate package type from view representation --- src/Composer/Command/ShowCommand.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 226ca8dd7..ea05cb53e 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -234,14 +234,14 @@ EOT foreach ($repos as $repo) { if ($repo === $platformRepo) { - $type = 'platform:'; + $type = 'platform'; } elseif ( $repo === $installedRepo || ($installedRepo instanceof CompositeRepository && in_array($repo, $installedRepo->getRepositories(), true)) ) { - $type = 'installed:'; + $type = 'installed'; } else { - $type = 'available:'; + $type = 'available'; } if ($repo instanceof ComposerRepository && $repo->hasProviders()) { foreach ($repo->getProviderNames() as $name) { @@ -270,7 +270,7 @@ EOT $showMinorOnly = $input->getOption('minor-only'); $indent = $showAllTypes ? ' ' : ''; $latestPackages = array(); - foreach (array('platform:' => true, 'available:' => false, 'installed:' => true) as $type => $showVersion) { + foreach (array('platform' => true, 'available' => false, 'installed' => true) as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); @@ -320,7 +320,11 @@ EOT $hasOutdatedPackages = false; if ($showAllTypes) { - $io->write($type); + if ('available' === $type) { + $io->write('' . $type . ':'); + } else { + $io->write('' . $type . ':'); + } } foreach ($packages[$type] as $package) { if (is_object($package)) { From 52ca1bd9c57df413afbfdd17e47bb8d9b5fd6bf7 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 21:53:44 +0100 Subject: [PATCH 04/10] Move command termination outside of output loop --- src/Composer/Command/ShowCommand.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index ea05cb53e..151103b2e 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -270,6 +270,7 @@ EOT $showMinorOnly = $input->getOption('minor-only'); $indent = $showAllTypes ? ' ' : ''; $latestPackages = array(); + $exitCode = 0; foreach (array('platform' => true, 'available' => false, 'installed' => true) as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); @@ -394,10 +395,13 @@ EOT $io->write(''); } if ($input->getOption('strict') && $hasOutdatedPackages) { - return 1; + $exitCode = 1; + break; } } } + + return $exitCode; } protected function getRootRequires() From 086c9d5c5655b6f4e08ae62f8ba56cf43adac512 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 22:33:00 +0100 Subject: [PATCH 05/10] Separate package warning from view representation --- src/Composer/Command/ShowCommand.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 151103b2e..5a6f99fd4 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -375,16 +375,13 @@ EOT $replacement = (is_string($latestPackage->getReplacementPackage())) ? 'Use ' . $latestPackage->getReplacementPackage() . ' instead' : 'No replacement was suggested'; - - $io->writeError(''); - $io->writeError( - sprintf( - "Package %s is abandoned, you should avoid using it. %s.", - $package->getPrettyName(), - $replacement - ), - false + $packageWarning = sprintf( + 'Package %s is abandoned, you should avoid using it. %s.', + $package->getPrettyName(), + $replacement ); + $io->writeError(''); + $io->writeError('' . $packageWarning . '', false); } } else { $io->write($indent . $package, false); From 64139ba32743023701e7d9d2fa79a05325d0d627 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 22:49:06 +0100 Subject: [PATCH 06/10] Move loop-independent code outside of loop --- src/Composer/Command/ShowCommand.php | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 5a6f99fd4..b002ba4fd 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -232,6 +232,21 @@ EOT $packageListFilter = $this->getRootRequires(); } + list($width) = $this->getApplication()->getTerminalDimensions(); + if (null === $width) { + // In case the width is not detected, we're probably running the command + // outside of a real terminal, use space without a limit + $width = PHP_INT_MAX; + } + if (Platform::isWindows()) { + $width--; + } + + if ($input->getOption('path') && null === $composer) { + $io->writeError('No composer.json found in the current directory, disabling "path" option'); + $input->setOption('path', false); + } + foreach ($repos as $repo) { if ($repo === $platformRepo) { $type = 'platform'; @@ -296,20 +311,6 @@ EOT $nameLength = max($nameLength, strlen($package)); } } - list($width) = $this->getApplication()->getTerminalDimensions(); - if (null === $width) { - // In case the width is not detected, we're probably running the command - // outside of a real terminal, use space without a limit - $width = PHP_INT_MAX; - } - if (Platform::isWindows()) { - $width--; - } - - if ($input->getOption('path') && null === $composer) { - $io->writeError('No composer.json found in the current directory, disabling "path" option'); - $input->setOption('path', false); - } $writePath = !$input->getOption('name-only') && $input->getOption('path'); $writeVersion = !$input->getOption('name-only') && !$input->getOption('path') && $showVersion && ($nameLength + $versionLength + 3 <= $width); From 818687849d397d757a86f5cac4083a40aba54c09 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 23:18:39 +0100 Subject: [PATCH 07/10] Extract view logic from data preparation --- src/Composer/Command/ShowCommand.php | 125 ++++++++++++++++++--------- 1 file changed, 82 insertions(+), 43 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index b002ba4fd..baa8cbc8c 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -286,6 +286,8 @@ EOT $indent = $showAllTypes ? ' ' : ''; $latestPackages = array(); $exitCode = 0; + $viewData = array(); + $viewMetaData = array(); foreach (array('platform' => true, 'available' => false, 'installed' => true) as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); @@ -313,22 +315,20 @@ EOT } $writePath = !$input->getOption('name-only') && $input->getOption('path'); - $writeVersion = !$input->getOption('name-only') && !$input->getOption('path') && $showVersion && ($nameLength + $versionLength + 3 <= $width); - $writeLatest = $writeVersion && $showLatest && ($nameLength + $versionLength + $latestLength + 3 <= $width); - $writeDescription = !$input->getOption('name-only') && !$input->getOption('path') && ($nameLength + $versionLength + $latestLength + 24 <= $width); - if ($writeLatest && !$io->isDecorated()) { - $latestLength += 2; - } + $writeVersion = !$input->getOption('name-only') && !$input->getOption('path') && $showVersion; + $writeLatest = $writeVersion && $showLatest; + $writeDescription = !$input->getOption('name-only') && !$input->getOption('path'); + $hasOutdatedPackages = false; - if ($showAllTypes) { - if ('available' === $type) { - $io->write('' . $type . ':'); - } else { - $io->write('' . $type . ':'); - } - } + $viewData[$type] = array(); + $viewMetaData[$type] = array( + 'nameLength' => $nameLength, + 'versionLength' => $versionLength, + 'latestLength' => $latestLength, + ); foreach ($packages[$type] as $package) { + $packageViewData = array(); if (is_object($package)) { $latestPackage = null; if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { @@ -340,36 +340,19 @@ EOT $hasOutdatedPackages = true; } - $io->write($indent . str_pad($package->getPrettyName(), $nameLength, ' '), false); - + $packageViewData['name'] = $package->getPrettyName(); if ($writeVersion) { - $io->write(' ' . str_pad($package->getFullPrettyVersion(), $versionLength, ' '), false); + $packageViewData['version'] = $package->getFullPrettyVersion(); } - if ($writeLatest && $latestPackage) { - $latestVersion = $latestPackage->getFullPrettyVersion(); - $style = $this->getVersionStyle($latestPackage, $package); - if (!$io->isDecorated()) { - $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; - } - $io->write(' <'.$style.'>' . str_pad($latestVersion, $latestLength, ' ') . '', false); + $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); + $packageViewData['latestStyle'] = $this->getVersionStyle($latestPackage, $package); } - if ($writeDescription) { - $description = strtok($package->getDescription(), "\r\n"); - $remaining = $width - $nameLength - $versionLength - 4; - if ($writeLatest) { - $remaining -= $latestLength; - } - if (strlen($description) > $remaining) { - $description = substr($description, 0, $remaining - 3) . '...'; - } - $io->write(' ' . $description, false); + $packageViewData['description'] = $package->getDescription(); } - if ($writePath) { - $path = strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n"); - $io->write(' ' . $path, false); + $packageViewData['path'] = strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n"); } if ($latestPackage && $latestPackage->isAbandoned()) { @@ -381,16 +364,12 @@ EOT $package->getPrettyName(), $replacement ); - $io->writeError(''); - $io->writeError('' . $packageWarning . '', false); + $packageViewData['warning'] = $packageWarning; } } else { - $io->write($indent . $package, false); + $packageViewData['name'] = $package; } - $io->write(''); - } - if ($showAllTypes) { - $io->write(''); + $viewData[$type][] = $packageViewData; } if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; @@ -399,6 +378,66 @@ EOT } } + foreach ($viewData as $type => $packages) { + $nameLength = $viewMetaData[$type]['nameLength']; + $versionLength = $viewMetaData[$type]['versionLength']; + $latestLength = $viewMetaData[$type]['latestLength']; + + $writeVersion = $nameLength + $versionLength + 3 <= $width; + $writeLatest = $nameLength + $versionLength + $latestLength + 3 <= $width; + $writeDescription = $nameLength + $versionLength + $latestLength + 24 <= $width; + + if ($writeLatest && !$io->isDecorated()) { + $latestLength += 2; + } + + if ($showAllTypes) { + if ('available' === $type) { + $io->write('' . $type . ':'); + } else { + $io->write('' . $type . ':'); + } + } + + foreach ($packages as $package) { + $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); + if (isset($package['version']) && $writeVersion) { + $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); + } + if (isset($package['latest']) && $writeLatest) { + $latestVersion = $package['latest']; + $style = $package['latestStyle']; + if (!$io->isDecorated()) { + $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; + } + $io->write(' <'.$style.'>' . str_pad($latestVersion, $latestLength, ' ') . '', false); + } + if (isset($package['description']) && $writeDescription) { + $description = strtok($package['description'], "\r\n"); + $remaining = $width - $nameLength - $versionLength - 4; + if ($writeLatest) { + $remaining -= $latestLength; + } + if (strlen($description) > $remaining) { + $description = substr($description, 0, $remaining - 3) . '...'; + } + $io->write(' ' . $description, false); + } + if (isset($package['path'])) { + $io->write(' ' . $package['path'], false); + } + if (isset($package['warning'])) { + $io->writeError(''); + $io->writeError('' . $package['warning'] . '', false); + } + $io->write(''); + } + + if ($showAllTypes) { + $io->write(''); + } + } + return $exitCode; } From c70aaa421d85e872f27d7b0aa44b9e09f6903ccc Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Sun, 5 Mar 2017 23:50:46 +0100 Subject: [PATCH 08/10] Add json output for show command --- src/Composer/Command/ShowCommand.php | 113 +++++++++++++++------------ 1 file changed, 63 insertions(+), 50 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index baa8cbc8c..d6b909251 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -14,6 +14,7 @@ namespace Composer\Command; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\DefaultPolicy; +use Composer\Json\JsonFile; use Composer\Package\CompletePackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\BasePackage; @@ -74,6 +75,7 @@ class ShowCommand extends BaseCommand new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), 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'), )) ->setHelp(<<getOption('format'); + if (!in_array($format, array('text', 'json'))) { + $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format)); + + return 1; + } + // init repos $platformOverrides = array(); if ($composer) { @@ -378,63 +387,67 @@ EOT } } - foreach ($viewData as $type => $packages) { - $nameLength = $viewMetaData[$type]['nameLength']; - $versionLength = $viewMetaData[$type]['versionLength']; - $latestLength = $viewMetaData[$type]['latestLength']; + if ('json' === $format) { + $io->write(JsonFile::encode($viewData)); + } else { + foreach ($viewData as $type => $packages) { + $nameLength = $viewMetaData[$type]['nameLength']; + $versionLength = $viewMetaData[$type]['versionLength']; + $latestLength = $viewMetaData[$type]['latestLength']; - $writeVersion = $nameLength + $versionLength + 3 <= $width; - $writeLatest = $nameLength + $versionLength + $latestLength + 3 <= $width; - $writeDescription = $nameLength + $versionLength + $latestLength + 24 <= $width; + $writeVersion = $nameLength + $versionLength + 3 <= $width; + $writeLatest = $nameLength + $versionLength + $latestLength + 3 <= $width; + $writeDescription = $nameLength + $versionLength + $latestLength + 24 <= $width; - if ($writeLatest && !$io->isDecorated()) { - $latestLength += 2; - } - - if ($showAllTypes) { - if ('available' === $type) { - $io->write('' . $type . ':'); - } else { - $io->write('' . $type . ':'); + if ($writeLatest && !$io->isDecorated()) { + $latestLength += 2; } - } - foreach ($packages as $package) { - $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); - if (isset($package['version']) && $writeVersion) { - $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); - } - if (isset($package['latest']) && $writeLatest) { - $latestVersion = $package['latest']; - $style = $package['latestStyle']; - if (!$io->isDecorated()) { - $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; + if ($showAllTypes) { + if ('available' === $type) { + $io->write('' . $type . ':'); + } else { + $io->write('' . $type . ':'); } - $io->write(' <'.$style.'>' . str_pad($latestVersion, $latestLength, ' ') . '', false); } - if (isset($package['description']) && $writeDescription) { - $description = strtok($package['description'], "\r\n"); - $remaining = $width - $nameLength - $versionLength - 4; - if ($writeLatest) { - $remaining -= $latestLength; - } - if (strlen($description) > $remaining) { - $description = substr($description, 0, $remaining - 3) . '...'; - } - $io->write(' ' . $description, false); - } - if (isset($package['path'])) { - $io->write(' ' . $package['path'], false); - } - if (isset($package['warning'])) { - $io->writeError(''); - $io->writeError('' . $package['warning'] . '', false); - } - $io->write(''); - } - if ($showAllTypes) { - $io->write(''); + foreach ($packages as $package) { + $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); + if (isset($package['version']) && $writeVersion) { + $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); + } + if (isset($package['latest']) && $writeLatest) { + $latestVersion = $package['latest']; + $style = $package['latestStyle']; + if (!$io->isDecorated()) { + $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; + } + $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); + } + if (isset($package['description']) && $writeDescription) { + $description = strtok($package['description'], "\r\n"); + $remaining = $width - $nameLength - $versionLength - 4; + if ($writeLatest) { + $remaining -= $latestLength; + } + if (strlen($description) > $remaining) { + $description = substr($description, 0, $remaining - 3) . '...'; + } + $io->write(' ' . $description, false); + } + if (isset($package['path'])) { + $io->write(' ' . $package['path'], false); + } + if (isset($package['warning'])) { + $io->writeError(''); + $io->writeError('' . $package['warning'] . '', false); + } + $io->write(''); + } + + if ($showAllTypes) { + $io->write(''); + } } } From 74d82a51e39f6dc3d632c4ea9b50b02097e52e85 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Mon, 6 Mar 2017 00:09:03 +0100 Subject: [PATCH 09/10] Replace latestStyle by status to get style independent json output --- src/Composer/Command/ShowCommand.php | 50 +++++++++++++++++----------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index d6b909251..94f2bcabb 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -355,7 +355,7 @@ EOT } if ($writeLatest && $latestPackage) { $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); - $packageViewData['latestStyle'] = $this->getVersionStyle($latestPackage, $package); + $packageViewData['status'] = $this->getUpdateStatus($latestPackage, $package); } if ($writeDescription) { $packageViewData['description'] = $package->getDescription(); @@ -418,9 +418,10 @@ EOT } if (isset($package['latest']) && $writeLatest) { $latestVersion = $package['latest']; - $style = $package['latestStyle']; + $updateStatus = $package['status']; + $style = $this->updateStatusToVersionStyle($updateStatus); if (!$io->isDecorated()) { - $latestVersion = str_replace(array('info', 'highlight', 'comment'), array('=', '!', '~'), $style) . ' ' . $latestVersion; + $latestVersion = str_replace(array('up-to-date', 'update-recommended', 'update-possible'), array('=', '!', '~'), $updateStatus) . ' ' . $latestVersion; } $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); } @@ -465,22 +466,7 @@ EOT protected function getVersionStyle(PackageInterface $latestPackage, PackageInterface $package) { - if ($latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) { - // print green as it's up to date - return 'info'; - } - - $constraint = $package->getVersion(); - if (0 !== strpos($constraint, 'dev-')) { - $constraint = '^'.$constraint; - } - if ($latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint)) { - // print red as it needs an immediate semver-compliant upgrade - return 'highlight'; - } - - // print yellow as it needs an upgrade but has potential BC breaks so is not urgent - return 'comment'; + return $this->updateStatusToVersionStyle($this->getUpdateStatus($latestPackage, $package)); } /** @@ -775,6 +761,32 @@ EOT } } + private function updateStatusToVersionStyle($updateStatus) + { + // 'up-to-date' is printed green + // 'update-recommended' is printed red + // 'upgrade-possible' is printed yellow + return str_replace(array('up-to-date', 'update-recommended', 'update-possible'), array('info', 'highlight', 'comment'), $updateStatus); + } + + private function getUpdateStatus(PackageInterface $latestPackage, PackageInterface $package) { + if ($latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) { + return 'up-to-date'; + } + + $constraint = $package->getVersion(); + if (0 !== strpos($constraint, 'dev-')) { + $constraint = '^'.$constraint; + } + if ($latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint)) { + // it needs an immediate semver-compliant upgrade + return 'update-recommended'; + } + + // it needs an upgrade but has potential BC breaks so is not urgent + return 'update-possible'; + } + private function writeTreeLine($line) { $io = $this->getIO(); From 527f5b85714bf3aee85bd2e64351c77c84533e02 Mon Sep 17 00:00:00 2001 From: Alexander Schwenn Date: Mon, 6 Mar 2017 00:29:20 +0100 Subject: [PATCH 10/10] Print error message when json is requested for tree or single package info --- src/Composer/Command/ShowCommand.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 94f2bcabb..6a492fd80 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -172,6 +172,9 @@ EOT // show single package or single version if (($packageFilter && false === strpos($packageFilter, '*')) || !empty($package)) { + if ('json' === $format) { + $io->writeError('Format "json" is only supported for package listings, falling back to format "text"'); + } if (empty($package)) { list($package, $versions) = $this->getPackage($installedRepo, $repos, $input->getArgument('package'), $input->getArgument('version')); @@ -214,6 +217,9 @@ EOT // show tree view if requested if ($input->getOption('tree')) { + if ('json' === $format) { + $io->writeError('Format "json" is only supported for package listings, falling back to format "text"'); + } $rootRequires = $this->getRootRequires(); foreach ($installedRepo->getPackages() as $package) { if (in_array($package->getName(), $rootRequires, true)) {