summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-01-04 18:02:30 -0600
committerJesse Luehrs <doy@tozt.net>2012-01-04 18:02:30 -0600
commitea2dd4c149d78e54c66a3400d2b0ecec5c959a40 (patch)
treec2d97880439669968a75757b005e8c9527c34613
parent79b443187ee06d8ee7eedc29012e2b68235e3cd1 (diff)
downloadcircular-require-ea2dd4c149d78e54c66a3400d2b0ecec5c959a40.tar.gz
circular-require-ea2dd4c149d78e54c66a3400d2b0ecec5c959a40.zip
if an entire cycle is hidden, don't show something from outside of it
-rw-r--r--lib/circular/require.pm12
-rw-r--r--t/hidden_cycle.t23
-rw-r--r--t/hidden_cycle/Bar.pm3
-rw-r--r--t/hidden_cycle/Baz.pm3
-rw-r--r--t/hidden_cycle/Foo.pm3
-rw-r--r--t/hide_middleman3.t2
6 files changed, 40 insertions, 6 deletions
diff --git a/lib/circular/require.pm b/lib/circular/require.pm
index db1738f..9b69394 100644
--- a/lib/circular/require.pm
+++ b/lib/circular/require.pm
@@ -62,11 +62,13 @@ sub _require {
if (exists $being_loaded{$string_file}) {
my $caller = $current;
- $caller = $being_loaded{$caller}
- while defined($caller) && grep { m/^$caller$/ } @hide;
-
- $caller = '<unknown package>'
- unless defined $caller;
+ while (grep { m/^$caller$/ } @hide) {
+ $caller = $being_loaded{$caller};
+ if (!defined($caller) || $caller eq $string_file) {
+ $caller = '<unknown file>';
+ last;
+ }
+ }
warn "Circular require detected: $string_file (from $caller)\n";
}
diff --git a/t/hidden_cycle.t b/t/hidden_cycle.t
new file mode 100644
index 0000000..a2b33f1
--- /dev/null
+++ b/t/hidden_cycle.t
@@ -0,0 +1,23 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use lib 't/hidden_cycle';
+use Test::More;
+
+no circular::require -hide => [qw(Bar Baz)];
+
+my @warnings;
+
+{
+ $SIG{__WARN__} = sub { push @warnings => @_ };
+
+ use_ok( 'Foo' );
+}
+
+is_deeply(
+ \@warnings,
+ ["Circular require detected: 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"
+);
+
+done_testing;
diff --git a/t/hidden_cycle/Bar.pm b/t/hidden_cycle/Bar.pm
new file mode 100644
index 0000000..5d7209a
--- /dev/null
+++ b/t/hidden_cycle/Bar.pm
@@ -0,0 +1,3 @@
+package Bar;
+use Baz;
+1;
diff --git a/t/hidden_cycle/Baz.pm b/t/hidden_cycle/Baz.pm
new file mode 100644
index 0000000..c718929
--- /dev/null
+++ b/t/hidden_cycle/Baz.pm
@@ -0,0 +1,3 @@
+package Baz;
+use Bar;
+1;
diff --git a/t/hidden_cycle/Foo.pm b/t/hidden_cycle/Foo.pm
new file mode 100644
index 0000000..1558402
--- /dev/null
+++ b/t/hidden_cycle/Foo.pm
@@ -0,0 +1,3 @@
+package Foo;
+use Bar;
+1;
diff --git a/t/hide_middleman3.t b/t/hide_middleman3.t
index bbd920f..361eb45 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 <unknown package>)\n"],
+ ["Circular require detected: Foo.pm (from <unknown file>)\n"],
"don't loop infinitely if all packages are hidden"
);