Browse Source

Fix some formatting and prettify the tree, refs #4917

Jordi Boggiano 9 years ago
parent
commit
d7855d03c7

+ 24 - 9
src/Composer/Command/BaseDependencyCommand.php

@@ -78,8 +78,11 @@ class BaseDependencyCommand extends BaseCommand
         $pool->addRepository($repository);
 
         // Parse package name and constraint
-        list($needle, $textConstraint) = array_pad(explode(':', $input->getArgument(self::ARGUMENT_PACKAGE)),
-                    2, $input->getArgument(self::ARGUMENT_CONSTRAINT));
+        list($needle, $textConstraint) = array_pad(
+            explode(':', $input->getArgument(self::ARGUMENT_PACKAGE)),
+            2,
+            $input->getArgument(self::ARGUMENT_CONSTRAINT)
+        );
 
         // Find packages that are or provide the requested package first
         $packages = $pool->whatProvides($needle);
@@ -118,7 +121,7 @@ class BaseDependencyCommand extends BaseCommand
         } elseif ($renderTree) {
             $root = $packages[0];
             $this->getIO()->write(sprintf('<info>%s</info> %s %s', $root->getPrettyName(), $root->getPrettyVersion(), $root->getDescription()));
-            $this->printTree($output, $results);
+            $this->printTree($results);
         } else {
             $this->printTable($output, $results);
         }
@@ -131,7 +134,7 @@ class BaseDependencyCommand extends BaseCommand
      * @param OutputInterface $output
      * @param array $results
      */
-    protected function printTable(OutputInterface $output, $results)
+    protected function printTable($output, $results)
     {
         $table = array();
         $doubles = array();
@@ -159,17 +162,19 @@ class BaseDependencyCommand extends BaseCommand
 
         // Render table
         $renderer = new Table($output);
-        $renderer->setStyle('compact')->setRows($table)->render();
+        $renderer->setStyle('compact');
+        $renderer->getStyle()->setVerticalBorderChar('');
+        $renderer->getStyle()->setCellRowContentFormat('%s  ');
+        $renderer->setRows($table)->render();
     }
 
     /**
      * Recursively prints a tree of the selected results.
      *
-     * @param OutputInterface $output
      * @param array $results
      * @param string $prefix
      */
-    protected function printTree(OutputInterface $output, $results, $prefix = '')
+    protected function printTree($results, $prefix = '')
     {
         $count = count($results);
         $idx = 0;
@@ -183,8 +188,18 @@ class BaseDependencyCommand extends BaseCommand
             $versionText = (strpos($package->getPrettyVersion(), 'No version set') === 0) ? '' : $package->getPrettyVersion();
             $packageText = rtrim(sprintf('%s %s', $package->getPrettyName(), $versionText));
             $linkText = implode(' ', array($link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()));
-            $output->write(sprintf("%s%s %s (%s)\n", $prefix, $isLast ? '`-' : '|-', $packageText, $linkText));
-            $this->printTree($output, $children, $prefix . ($isLast ? '   ' : '|  '));
+            $this->writeTreeLine(sprintf("%s%s%s (%s)", $prefix, $isLast ? '└──' : '├──', $packageText, $linkText));
+            $this->printTree($children, $prefix . ($isLast ? '   ' : '│  '));
+        }
+    }
+
+    private function writeTreeLine($line)
+    {
+        $io = $this->getIO();
+        if (!$io->isDecorated()) {
+            $line = str_replace(array('└', '├', '──', '│'), array('`-', '|-', '-', '|'), $line);
         }
+
+        $io->write($line);
     }
 }

+ 6 - 8
src/Composer/Command/ShowCommand.php

@@ -137,7 +137,7 @@ EOT
             }
 
             if ($input->getOption('tree')) {
-                $this->displayPackageTree($package, $installedRepo, $repos, $output);
+                $this->displayPackageTree($package, $installedRepo, $repos);
             } else {
                 $this->printMeta($package, $versions, $installedRepo, $repos);
                 $this->printLinks($package, 'requires');
@@ -166,7 +166,7 @@ EOT
 
             foreach ($installedRepo->getPackages() as $package) {
                 if (in_array($package->getName(), $rootRequires, true)) {
-                    $this->displayPackageTree($package, $installedRepo, $repos, $output);
+                    $this->displayPackageTree($package, $installedRepo, $repos);
                 }
             }
 
@@ -483,9 +483,8 @@ EOT
      * @param PackageInterface|string $package
      * @param RepositoryInterface     $installedRepo
      * @param RepositoryInterface     $distantRepos
-     * @param OutputInterface         $output
      */
-    protected function displayPackageTree(PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos, OutputInterface $output)
+    protected function displayPackageTree(PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos)
     {
         $packagesInTree = array();
         $packagesInTree[] = $package;
@@ -517,7 +516,7 @@ EOT
 
                 $packagesInTree[] = $requireName;
 
-                $this->displayTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree, $output, $treeBar, $level + 1);
+                $this->displayTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree, $treeBar, $level + 1);
             }
         }
     }
@@ -530,11 +529,10 @@ EOT
      * @param RepositoryInterface     $installedRepo
      * @param RepositoryInterface     $distantRepos
      * @param array                   $packagesInTree
-     * @param OutputInterface         $output
      * @param string                  $previousTreeBar
      * @param int                     $level
      */
-    protected function displayTree($name, $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos, array $packagesInTree, OutputInterface $output, $previousTreeBar = '├', $level = 1)
+    protected function displayTree($name, $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos, array $packagesInTree, $previousTreeBar = '├', $level = 1)
     {
         $previousTreeBar = str_replace('├', '│', $previousTreeBar);
         list($package, $versions) = $this->getPackage($installedRepo, $distantRepos, $name, $package->getPrettyConstraint() === 'self.version' ? $package->getConstraint() : $package->getPrettyConstraint());
@@ -556,7 +554,7 @@ EOT
                 $treeBar = str_replace('└', ' ', $treeBar);
                 if (!in_array($requireName, $packagesInTree)) {
                     $packagesInTree[] = $requireName;
-                    $this->displayTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree, $output, $treeBar, $level + 1);
+                    $this->displayTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree, $treeBar, $level + 1);
                 }
             }
         }

+ 5 - 2
src/Composer/Repository/BaseRepository.php

@@ -36,7 +36,7 @@ abstract class BaseRepository implements RepositoryInterface
      */
     public function getDependents($needle, $constraint = null, $invert = false, $recurse = true)
     {
-        $needles = is_array($needle) ? $needle : array($needle);
+        $needles = (array) $needle;
         $results = array();
 
         // Loop over all currently installed packages.
@@ -58,13 +58,16 @@ abstract class BaseRepository implements RepositoryInterface
                 foreach ($needles as $needle) {
                     if ($link->getTarget() === $needle) {
                         if (is_null($constraint) || (($link->getConstraint()->matches($constraint) === !$invert))) {
-                            $results[$link->getSource()] = array($package, $link, $recurse ? $this->getDependents($link->getSource(), null, false, true) : array());
+                            $dependents = $recurse ? $this->getDependents($link->getSource(), null, false, true) : array();
+                            $results[$link->getSource()] = array($package, $link, $dependents);
                         }
                     }
                 }
             }
         }
+
         ksort($results);
+
         return $results;
     }
 }