From ea2dd4c149d78e54c66a3400d2b0ecec5c959a40 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 4 Jan 2012 18:02:30 -0600 Subject: if an entire cycle is hidden, don't show something from outside of it --- lib/circular/require.pm | 12 +++++++----- t/hidden_cycle.t | 23 +++++++++++++++++++++++ t/hidden_cycle/Bar.pm | 3 +++ t/hidden_cycle/Baz.pm | 3 +++ t/hidden_cycle/Foo.pm | 3 +++ t/hide_middleman3.t | 2 +- 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 t/hidden_cycle.t create mode 100644 t/hidden_cycle/Bar.pm create mode 100644 t/hidden_cycle/Baz.pm create mode 100644 t/hidden_cycle/Foo.pm 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 = '' - unless defined $caller; + while (grep { m/^$caller$/ } @hide) { + $caller = $being_loaded{$caller}; + if (!defined($caller) || $caller eq $string_file) { + $caller = ''; + 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 )\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 )\n"], + ["Circular require detected: Foo.pm (from )\n"], "don't loop infinitely if all packages are hidden" ); -- cgit v1.2.3