Chris@13: context = $context;
Chris@13: }
Chris@13:
Chris@13: /**
Chris@13: * {@inheritdoc}
Chris@13: */
Chris@13: protected function configure()
Chris@13: {
Chris@13: list($grep, $insensitive, $invert) = FilterOptions::getOptions();
Chris@13:
Chris@13: $this
Chris@13: ->setName('wtf')
Chris@13: ->setAliases(['last-exception', 'wtf?'])
Chris@13: ->setDefinition([
Chris@13: new InputArgument('incredulity', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Number of lines to show.'),
Chris@13: new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show entire backtrace.'),
Chris@13:
Chris@13: $grep,
Chris@13: $insensitive,
Chris@13: $invert,
Chris@13: ])
Chris@13: ->setDescription('Show the backtrace of the most recent exception.')
Chris@13: ->setHelp(
Chris@13: <<<'HELP'
Chris@13: Shows a few lines of the backtrace of the most recent exception.
Chris@13:
Chris@13: If you want to see more lines, add more question marks or exclamation marks:
Chris@13:
Chris@13: e.g.
Chris@13: >>> wtf ?
Chris@13: >>> wtf ?!???!?!?
Chris@13:
Chris@13: To see the entire backtrace, pass the -a/--all flag:
Chris@13:
Chris@13: e.g.
Chris@13: >>> wtf -a
Chris@13: HELP
Chris@13: );
Chris@13: }
Chris@13:
Chris@13: /**
Chris@13: * {@inheritdoc}
Chris@13: */
Chris@13: protected function execute(InputInterface $input, OutputInterface $output)
Chris@13: {
Chris@13: $this->filter->bind($input);
Chris@13:
Chris@17: $incredulity = \implode('', $input->getArgument('incredulity'));
Chris@17: if (\strlen(\preg_replace('/[\\?!]/', '', $incredulity))) {
Chris@13: throw new \InvalidArgumentException('Incredulity must include only "?" and "!"');
Chris@13: }
Chris@13:
Chris@13: $exception = $this->context->getLastException();
Chris@17: $count = $input->getOption('all') ? PHP_INT_MAX : \max(3, \pow(2, \strlen($incredulity) + 1));
Chris@13:
Chris@13: $shell = $this->getApplication();
Chris@13: $output->startPaging();
Chris@13: do {
Chris@17: $traceCount = \count($exception->getTrace());
Chris@13: $showLines = $count;
Chris@13: // Show the whole trace if we'd only be hiding a few lines
Chris@17: if ($traceCount < \max($count * 1.2, $count + 2)) {
Chris@13: $showLines = PHP_INT_MAX;
Chris@13: }
Chris@13:
Chris@13: $trace = $this->getBacktrace($exception, $showLines);
Chris@17: $moreLines = $traceCount - \count($trace);
Chris@13:
Chris@13: $output->writeln($shell->formatException($exception));
Chris@13: $output->writeln('--');
Chris@13: $output->write($trace, true, ShellOutput::NUMBER_LINES);
Chris@13: $output->writeln('');
Chris@13:
Chris@13: if ($moreLines > 0) {
Chris@17: $output->writeln(\sprintf(
Chris@13: '',
Chris@13: $moreLines
Chris@13: ));
Chris@13: $output->writeln('');
Chris@13: }
Chris@13: } while ($exception = $exception->getPrevious());
Chris@13: $output->stopPaging();
Chris@13: }
Chris@13: }