From d0719e8ad715588446409155d68fd1783486aa69 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 6 Jan 2012 01:14:29 -0600 Subject: show the entire cycle in the warning --- Changes | 1 + lib/circular/require.pm | 18 ++++++++++++------ t/basic.t | 6 +++--- t/hidden_cycle.t | 2 +- t/hide_middleman.t | 2 +- t/hide_middleman2.t | 2 +- t/hide_middleman3.t | 2 +- t/long_cycle.t | 23 +++++++++++++++++++++++ t/long_cycle/Bar.pm | 3 +++ t/long_cycle/Baz.pm | 3 +++ t/long_cycle/Blorg.pm | 3 +++ t/long_cycle/Foo.pm | 3 +++ t/long_cycle/Quux.pm | 3 +++ 13 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 t/long_cycle.t create mode 100644 t/long_cycle/Bar.pm create mode 100644 t/long_cycle/Baz.pm create mode 100644 t/long_cycle/Blorg.pm create mode 100644 t/long_cycle/Foo.pm create mode 100644 t/long_cycle/Quux.pm diff --git a/Changes b/Changes index 05b13b3..d1a1ffb 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,7 @@ Revision history for circular-require {{$NEXT}} + - show the entire cycle in the warning 0.05 2012-01-04 - allow using -hide to avoid reporting unhelpful packages in the error diff --git a/lib/circular/require.pm b/lib/circular/require.pm index 5cc4657..6216653 100644 --- a/lib/circular/require.pm +++ b/lib/circular/require.pm @@ -60,17 +60,23 @@ sub _require { # string contexts at all my $string_file = $file; if (exists $loaded_from{$string_file}) { + my @cycle = ($string_file); + my $caller = $previous_file; - while (grep { m/^$caller$/ } @hide) { + while (defined($caller)) { + unshift @cycle, $caller + unless grep { /^$caller$/ } @hide; + last if $caller eq $string_file; $caller = $loaded_from{$caller}; - if (!defined($caller) || $caller eq $string_file) { - $caller = ''; - last; - } } - warn "Circular require detected: $string_file (from $caller)\n"; + if (@cycle > 1) { + warn "Circular require detected:\n " . join("\n ", @cycle) . "\n"; + } + else { + warn "Circular require detected in $string_file (from unknown file)\n"; + } } local $loaded_from{$string_file} = $previous_file; local $previous_file = $string_file; diff --git a/t/basic.t b/t/basic.t index 14eda8d..44fade4 100644 --- a/t/basic.t +++ b/t/basic.t @@ -12,7 +12,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Foo'); - is($warnings, "Circular require detected: Foo.pm (from Baz.pm)\nCircular require detected: Baz.pm (from Bar.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Foo.pm\n Baz.pm\n Foo.pm\nCircular require detected:\n Baz.pm\n Bar.pm\n Baz.pm\n", "correct warnings"); undef $warnings; use_ok('Foo'); @@ -25,7 +25,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Bar'); - is($warnings, "Circular require detected: Baz.pm (from Foo.pm)\nCircular require detected: Bar.pm (from Baz.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Baz.pm\n Foo.pm\n Baz.pm\nCircular require detected:\n Bar.pm\n Baz.pm\n Bar.pm\n", "correct warnings"); clear(); } @@ -33,7 +33,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Baz'); - is($warnings, "Circular require detected: Baz.pm (from Foo.pm)\nCircular require detected: Baz.pm (from Bar.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Baz.pm\n Foo.pm\n Baz.pm\nCircular require detected:\n Baz.pm\n Bar.pm\n Baz.pm\n", "correct warnings"); clear(); } diff --git a/t/hidden_cycle.t b/t/hidden_cycle.t index a2b33f1..39d03bc 100644 --- a/t/hidden_cycle.t +++ b/t/hidden_cycle.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Bar.pm (from )\n"], + ["Circular require detected in Bar.pm (from unknown file)\n"], "hiding all packages in the cycle shouldn't report a package outside of the cycle as being the source" ); diff --git a/t/hide_middleman.t b/t/hide_middleman.t index 90950b2..1bdb627 100644 --- a/t/hide_middleman.t +++ b/t/hide_middleman.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from Bar.pm)\n"], + ["Circular require detected:\n Foo.pm\n Bar.pm\n Foo.pm\n"], "Show the module that used base, instead of 'base' when a cycle occurs from a use base." ); diff --git a/t/hide_middleman2.t b/t/hide_middleman2.t index bb3092a..f0cfae3 100644 --- a/t/hide_middleman2.t +++ b/t/hide_middleman2.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from Bar.pm)\n"], + ["Circular require detected:\n Foo.pm\n Bar.pm\n Foo.pm\n"], "Show the module that used base, instead of 'base' when a cycle occurs from a use base." ); diff --git a/t/hide_middleman3.t b/t/hide_middleman3.t index 361eb45..1f888b3 100644 --- a/t/hide_middleman3.t +++ b/t/hide_middleman3.t @@ -19,7 +19,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from )\n"], + ["Circular require detected in Foo.pm (from unknown file)\n"], "don't loop infinitely if all packages are hidden" ); diff --git a/t/long_cycle.t b/t/long_cycle.t new file mode 100644 index 0000000..fb0c703 --- /dev/null +++ b/t/long_cycle.t @@ -0,0 +1,23 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; +use lib 't/long_cycle'; + +no circular::require; + +my @warnings; + +{ + $SIG{__WARN__} = sub { push @warnings => @_ }; + + use_ok( 'Foo' ); +} + +is_deeply( + \@warnings, + ["Circular require detected:\n Bar.pm\n Baz.pm\n Quux.pm\n Blorg.pm\n Bar.pm\n"], + "detection of longer cycles" +); + +done_testing; diff --git a/t/long_cycle/Bar.pm b/t/long_cycle/Bar.pm new file mode 100644 index 0000000..5d7209a --- /dev/null +++ b/t/long_cycle/Bar.pm @@ -0,0 +1,3 @@ +package Bar; +use Baz; +1; diff --git a/t/long_cycle/Baz.pm b/t/long_cycle/Baz.pm new file mode 100644 index 0000000..0ece003 --- /dev/null +++ b/t/long_cycle/Baz.pm @@ -0,0 +1,3 @@ +package Baz; +use Quux; +1; diff --git a/t/long_cycle/Blorg.pm b/t/long_cycle/Blorg.pm new file mode 100644 index 0000000..d84c3fc --- /dev/null +++ b/t/long_cycle/Blorg.pm @@ -0,0 +1,3 @@ +package Blorg; +use Bar; +1; diff --git a/t/long_cycle/Foo.pm b/t/long_cycle/Foo.pm new file mode 100644 index 0000000..1558402 --- /dev/null +++ b/t/long_cycle/Foo.pm @@ -0,0 +1,3 @@ +package Foo; +use Bar; +1; diff --git a/t/long_cycle/Quux.pm b/t/long_cycle/Quux.pm new file mode 100644 index 0000000..d0357d4 --- /dev/null +++ b/t/long_cycle/Quux.pm @@ -0,0 +1,3 @@ +package Quux; +use Blorg; +1; -- cgit v1.2.3-54-g00ecf