diff options
Diffstat (limited to 'maintenance/eval.php')
-rw-r--r-- | maintenance/eval.php | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/maintenance/eval.php b/maintenance/eval.php index abedc61a..51f2cace 100644 --- a/maintenance/eval.php +++ b/maintenance/eval.php @@ -1,6 +1,5 @@ <?php /** - * PHP lacks an interactive mode, but this can be very helpful when debugging. * This script lets a command-line user start up the wiki engine and then poke * about by issuing PHP commands directly. * @@ -56,7 +55,7 @@ if ( isset( $options['d'] ) ) { } $useReadline = function_exists( 'readline_add_history' ) - && Maintenance::posix_isatty( 0 /*STDIN*/ ); + && Maintenance::posix_isatty( 0 /*STDIN*/ ); if ( $useReadline ) { $historyFile = isset( $_ENV['HOME'] ) ? @@ -64,13 +63,28 @@ if ( $useReadline ) { readline_read_history( $historyFile ); } +$e = null; // PHP exception while ( ( $line = Maintenance::readconsole() ) !== false ) { + if ( $e && !preg_match( '/^(exit|die);?$/', $line ) ) { + // Internal state may be corrupted or fatals may occur later due + // to some object not being set. Don't drop out of eval in case + // lines were being pasted in (which would then get dumped to the shell). + // Instead, just absorb the remaning commands. Let "exit" through per DWIM. + echo "Exception was thrown before; please restart eval.php\n"; + continue; + } if ( $useReadline ) { readline_add_history( $line ); readline_write_history( $historyFile ); } - $val = eval( $line . ";" ); - if ( wfIsHipHop() || is_null( $val ) ) { + try { + $val = eval( $line . ";" ); + } catch ( Exception $e ) { + echo "Caught exception " . get_class( $e ) . + ": {$e->getMessage()}\n" . $e->getTraceAsString() . "\n"; + continue; + } + if ( wfIsHHVM() || is_null( $val ) ) { echo "\n"; } elseif ( is_string( $val ) || is_numeric( $val ) ) { echo "$val\n"; |