Yaffs site version 1.1
[yaffs-website] / vendor / psy / psysh / src / Psy / Command / WtfCommand.php
index 7e3d08d1f7520fe109faa0e5d8938ed769601b7f..2e5c00ce14e108384ba2c3fdb25c6eb5aeb06dcb 100644 (file)
@@ -13,6 +13,7 @@ namespace Psy\Command;
 
 use Psy\Context;
 use Psy\ContextAware;
+use Psy\Input\FilterOptions;
 use Psy\Output\ShellOutput;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
@@ -46,12 +47,18 @@ class WtfCommand extends TraceCommand implements ContextAware
      */
     protected function configure()
     {
+        list($grep, $insensitive, $invert) = FilterOptions::getOptions();
+
         $this
             ->setName('wtf')
             ->setAliases(array('last-exception', 'wtf?'))
             ->setDefinition(array(
                 new InputArgument('incredulity', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Number of lines to show'),
-                new InputOption('verbose', 'v',  InputOption::VALUE_NONE, 'Show entire backtrace.'),
+                new InputOption('all', 'a',  InputOption::VALUE_NONE, 'Show entire backtrace.'),
+
+                $grep,
+                $insensitive,
+                $invert,
             ))
             ->setDescription('Show the backtrace of the most recent exception.')
             ->setHelp(
@@ -64,7 +71,7 @@ e.g.
 <return>>>> wtf ?</return>
 <return>>>> wtf ?!???!?!?</return>
 
-To see the entire backtrace, pass the -v/--verbose flag:
+To see the entire backtrace, pass the -a/--all flag:
 
 e.g.
 <return>>>> wtf -v</return>
@@ -72,40 +79,47 @@ HELP
             );
     }
 
-    /**
-     * {@inheritdoc}
-     *
-     * --verbose is not hidden for this option :)
-     *
-     * @return array
-     */
-    protected function getHiddenOptions()
-    {
-        $options = parent::getHiddenOptions();
-        unset($options[array_search('verbose', $options)]);
-
-        return $options;
-    }
-
     /**
      * {@inheritdoc}
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
+        $this->filter->bind($input);
+
         $incredulity = implode('', $input->getArgument('incredulity'));
         if (strlen(preg_replace('/[\\?!]/', '', $incredulity))) {
             throw new \InvalidArgumentException('Incredulity must include only "?" and "!".');
         }
 
         $exception = $this->context->getLastException();
-        $count     = $input->getOption('verbose') ? PHP_INT_MAX : pow(2, max(0, (strlen($incredulity) - 1)));
-        $trace     = $this->getBacktrace($exception, $count);
+        $count     = $input->getOption('all') ? PHP_INT_MAX : max(3, pow(2, strlen($incredulity) + 1));
 
         $shell = $this->getApplication();
-        $output->page(function ($output) use ($exception, $trace, $shell) {
-            $shell->renderException($exception, $output);
+        $output->startPaging();
+        do {
+            $traceCount = count($exception->getTrace());
+            $showLines = $count;
+            // Show the whole trace if we'd only be hiding a few lines
+            if ($traceCount < max($count * 1.2, $count + 2)) {
+                $showLines = PHP_INT_MAX;
+            }
+
+            $trace = $this->getBacktrace($exception, $showLines);
+            $moreLines = $traceCount - count($trace);
+
+            $output->writeln($shell->formatException($exception));
             $output->writeln('--');
             $output->write($trace, true, ShellOutput::NUMBER_LINES);
-        });
+            $output->writeln('');
+
+            if ($moreLines > 0) {
+                $output->writeln(sprintf(
+                    '<aside>Use <return>wtf -a</return> to see %d more lines</aside>',
+                    $moreLines
+                ));
+                $output->writeln('');
+            }
+        } while ($exception = $exception->getPrevious());
+        $output->stopPaging();
     }
 }