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: }