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