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, ' ') . ''.$style.'>', 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, ' ') . ''.$style.'>', 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;
}