@@ -88,12 +88,16 @@ sub _compile_descend_filter {
8888 return unless $idirs && @{$idirs };
8989
9090 my %ignore_dirs ;
91+ my @ignore_dirs_re ;
9192
9293 foreach my $idir (@{$idirs }) {
9394 if ( $idir =~ / ^(\w +):(.*)/ ) {
9495 if ( $1 eq ' is' ) {
9596 $ignore_dirs {$2 } = 1;
9697 }
98+ elsif ( $1 eq ' match' ) {
99+ push @ignore_dirs_re , $2 ;
100+ }
97101 else {
98102 Carp::croak( ' Non-is filters are not yet supported for --ignore-dir' );
99103 }
@@ -104,7 +108,8 @@ sub _compile_descend_filter {
104108 }
105109
106110 return sub {
107- return !exists $ignore_dirs {$_ } && !exists $ignore_dirs {$File::Next::dir };
111+ return !exists $ignore_dirs {$_ } && !exists $ignore_dirs {$File::Next::dir }
112+ && !grep { $File::Next::dir =~ $_ } @ignore_dirs_re ;
108113 };
109114}
110115
@@ -147,12 +152,17 @@ sub _compile_file_filter {
147152 my $dont_ignore_dir_list = $opt -> {no_ignore_dirs };
148153
149154 my %ignore_dir_set ;
155+ my @ignore_dirs_re ;
150156 my %dont_ignore_dir_set ;
157+ my @dont_ignore_dirs_re ;
151158
152159 foreach my $filter (@{ $ignore_dir_list }) {
153160 if ( $filter =~ / ^(\w +):(.*)/ ) {
154161 if ( $1 eq ' is' ) {
155162 $ignore_dir_set { $2 } = 1;
163+ }
164+ elsif ( $1 eq ' match' ) {
165+ push @ignore_dirs_re , $2 ;
156166 } else {
157167 Carp::croak( ' Non-is filters are not yet supported for --ignore-dir' );
158168 }
@@ -164,6 +174,9 @@ sub _compile_file_filter {
164174 if ( $filter =~ / ^(\w +):(.*)/ ) {
165175 if ( $1 eq ' is' ) {
166176 $dont_ignore_dir_set { $2 } = 1;
177+ }
178+ elsif ( $1 eq ' match' ) {
179+ push @dont_ignore_dirs_re , $2 ;
167180 } else {
168181 Carp::croak( ' Non-is filters are not yet supported for --ignore-dir' );
169182 }
@@ -196,6 +209,7 @@ sub _compile_file_filter {
196209
197210 my $is_ignoring = 0;
198211
212+ $is_ignoring = grep { $dirname =~ $_ } @ignore_dirs_re ;
199213 foreach my $dir ( @dirs ) {
200214 if ( $ignore_dir_set { $dir } ) {
201215 $is_ignoring = 1;
@@ -204,7 +218,7 @@ sub _compile_file_filter {
204218 $is_ignoring = 0;
205219 }
206220 }
207- if ( $is_ignoring ) {
221+ if ( $is_ignoring && ! grep { $dirname =~ $_ } @dont_ignore_dirs_re ) {
208222 return 0;
209223 }
210224 }
0 commit comments