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;
*/
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(
<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>
);
}
- /**
- * {@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();
}
}