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