Fix up diagnostic.pm’s backtrace for multiline msgs
authorFather Chrysostomos <sprout@cpan.org>
Tue, 27 Dec 2011 06:26:20 +0000 (22:26 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 27 Dec 2011 06:26:20 +0000 (22:26 -0800)
I hope you agree this backtrace does not look very good:

$ ./perl -Ilib -Mdiagnostics -e '
  sub foo { bar () }
  sub bar { baz() }
  sub baz {
  die "Attempt to reload foo aborted.\nCompilation failed in require"} foo
'
Attempt to reload foo aborted (#1)
    (F) You tried to load a file with use or require that failed to
    compile once already.  Perl will not try to compile this file again
    unless you delete its entry from %INC.  See "require" in perlfunc and
    "%INC" in perlvar.

Compilation failed in require at -e line 1 (#2)
    (F) Perl could not compile a file specified in a require statement.
    Perl uses this generic message when none of the errors that it
    encountered were severe enough to halt compilation immediately.

Uncaught exception from user code:
Attempt to reload foo aborted.
Compilation failed in require at -e line 1.
main::baz() called at -e line 1
main::bar() called at -e line 1
main::foo() called at -e line 1

lib/diagnostics.pm
lib/diagnostics.t

index b8effa8..a1841cf 100644 (file)
@@ -574,6 +574,8 @@ sub death_trap {
     # traps.
     $SIG{__DIE__} = $SIG{__WARN__} = '';
 
+    $exception =~ s/\n(?=.)/\n\t/gas;
+
     die Carp::longmess("__diagnostics__")
          =~ s/^__diagnostics__.*?line \d+\.?\n/
                  "Uncaught exception from user code:\n\t$exception"
index 8c581b0..c983ac6 100644 (file)
@@ -4,7 +4,7 @@ BEGIN {
     chdir '..' if -d '../pod' && -d '../t';
     @INC = 'lib';
     require './t/test.pl';
-    plan(17);
+    plan(18);
 }
 
 BEGIN {
@@ -132,3 +132,16 @@ is runperl(@runperl_args, prog => 'die q _panick: gremlins_'),
 Uncaught exception from user code:
        panick: gremlins at -e line 1.
 EOW
+like runperl(
+      @runperl_args,
+      prog => $subs =~
+         s[panic: gremlins]
+          [Attempt to reload foo aborted.\nCompilation failed in require]r,
+     ),
+     qr/Uncaught exception from user code:
+       Attempt to reload foo aborted\.
+       Compilation failed in require at -e line \d+\.
+       main::baz\(\) called at -e line \d+
+       main::bar\(\) called at -e line \d+
+       main::foo\(\) called at -e line \d+
+/,  'backtrace from multiline error';