comparison vendor/psy/psysh/src/Psy/Command/WtfCommand.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 7a779792577d
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 /*
4 * This file is part of Psy Shell.
5 *
6 * (c) 2012-2017 Justin Hileman
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Psy\Command;
13
14 use Psy\Context;
15 use Psy\ContextAware;
16 use Psy\Input\FilterOptions;
17 use Psy\Output\ShellOutput;
18 use Symfony\Component\Console\Input\InputArgument;
19 use Symfony\Component\Console\Input\InputInterface;
20 use Symfony\Component\Console\Input\InputOption;
21 use Symfony\Component\Console\Output\OutputInterface;
22
23 /**
24 * Show the last uncaught exception.
25 */
26 class WtfCommand extends TraceCommand implements ContextAware
27 {
28 /**
29 * Context instance (for ContextAware interface).
30 *
31 * @var Context
32 */
33 protected $context;
34
35 /**
36 * ContextAware interface.
37 *
38 * @param Context $context
39 */
40 public function setContext(Context $context)
41 {
42 $this->context = $context;
43 }
44
45 /**
46 * {@inheritdoc}
47 */
48 protected function configure()
49 {
50 list($grep, $insensitive, $invert) = FilterOptions::getOptions();
51
52 $this
53 ->setName('wtf')
54 ->setAliases(array('last-exception', 'wtf?'))
55 ->setDefinition(array(
56 new InputArgument('incredulity', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Number of lines to show'),
57 new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show entire backtrace.'),
58
59 $grep,
60 $insensitive,
61 $invert,
62 ))
63 ->setDescription('Show the backtrace of the most recent exception.')
64 ->setHelp(
65 <<<'HELP'
66 Shows a few lines of the backtrace of the most recent exception.
67
68 If you want to see more lines, add more question marks or exclamation marks:
69
70 e.g.
71 <return>>>> wtf ?</return>
72 <return>>>> wtf ?!???!?!?</return>
73
74 To see the entire backtrace, pass the -a/--all flag:
75
76 e.g.
77 <return>>>> wtf -v</return>
78 HELP
79 );
80 }
81
82 /**
83 * {@inheritdoc}
84 */
85 protected function execute(InputInterface $input, OutputInterface $output)
86 {
87 $this->filter->bind($input);
88
89 $incredulity = implode('', $input->getArgument('incredulity'));
90 if (strlen(preg_replace('/[\\?!]/', '', $incredulity))) {
91 throw new \InvalidArgumentException('Incredulity must include only "?" and "!".');
92 }
93
94 $exception = $this->context->getLastException();
95 $count = $input->getOption('all') ? PHP_INT_MAX : max(3, pow(2, strlen($incredulity) + 1));
96
97 $shell = $this->getApplication();
98 $output->startPaging();
99 do {
100 $traceCount = count($exception->getTrace());
101 $showLines = $count;
102 // Show the whole trace if we'd only be hiding a few lines
103 if ($traceCount < max($count * 1.2, $count + 2)) {
104 $showLines = PHP_INT_MAX;
105 }
106
107 $trace = $this->getBacktrace($exception, $showLines);
108 $moreLines = $traceCount - count($trace);
109
110 $output->writeln($shell->formatException($exception));
111 $output->writeln('--');
112 $output->write($trace, true, ShellOutput::NUMBER_LINES);
113 $output->writeln('');
114
115 if ($moreLines > 0) {
116 $output->writeln(sprintf(
117 '<aside>Use <return>wtf -a</return> to see %d more lines</aside>',
118 $moreLines
119 ));
120 $output->writeln('');
121 }
122 } while ($exception = $exception->getPrevious());
123 $output->stopPaging();
124 }
125 }