@ 11d698f

250525.1 · ad69fe6933c14a2a070601ed0b5feb800aa3ad6f

The -g option can now use any of the boolean options, --and, --or or --not. The --not option can be used with either --and or --or.

reading declarations

Changes

@@ -1,5 +1,12 @@ History file for ack 3.  https://beyondgrep.com/ +NEXT+========================================+The --not option can be used with either --and or --or.++The -g option can now use any of the boolean options, --and, --or or --not.++ v3.8.2      Sun Apr  6 10:45:04 CDT 2025 ======================================== ack now needs YAML::PP to run its tests. Many of ack's tests are stored in

MANIFEST

@@ -112,6 +112,7 @@ t/lowercase.t t/match-filter.t t/multiple-captures.t t/mutex-options.t+t/mutex.yaml t/named-pipes.t t/needs-line-scan.t t/noackrc.t

ack

@@ -440,7 +440,12 @@ sub _compile_file_filter {      return sub {         if ( $opt_g ) {-            if ( $File::Next::name =~ /$re_match/o ) {+            my $match = ($File::Next::name =~ /$re_match/o);+            if ( $match && $re_not ) {+                $match = ($File::Next::name !~ /$re_not/o);+            }++            if ( $match ) {                 return 0 if $opt_v;             }             else {@@ -1320,8 +1325,7 @@ Note that the options that affect "dogs" also affect "cats", so if you have then the search for both "dogs" and "cats" will be case-insensitive and be word-limited. -See also the other two boolean options C<--or> and C<--not>, neither of-which can be used with C<--and>.+C<--and> cannot be used with C<--or>.  =item B<-A I<NUM>>, B<--after-context=I<NUM>> @@ -1580,9 +1584,6 @@ if you have then the search for both "dogs" and "cats" will be case-insensitive and be word-limited. -See also the other two boolean options C<--and> and C<--or>, neither of-which can be used with C<--not>.- =item B<-o>  Show only the part of each line matching PATTERN (turns off text@@ -1604,8 +1605,7 @@ Note that the options that affect "dogs" also affect "cats", so if you have then the search for both "dogs" and "cats" will be case-insensitive and be word-limited. -See also the other two boolean options C<--and> and C<--not>, neither of-which can be used with C<--or>.+C<--or> cannot be used with C<--and>.  =item B<--output=I<expr>> 

dev/crank-mutex

@@ -15,10 +15,9 @@ sub invalid_combinations {     my @output     = qw( -o --output );     my @fg         = qw( -f -g );     my @case       = qw( -i -I --smart-case );-    my @booleans   = qw( --and --or --not );      return (-        [qw(--and)]      => [qw( --or --not )],+        [qw(--and)]      => [qw( --or )],         [qw(-l)]         => [@context, @file_lists, @pretty, @filename, @output, qw(--passthru --column --show-types)],         [qw(-L)]         => [@context, @file_lists, @pretty, @filename, @output, qw(--passthru --column --show-types -c -v)],         [@output]        => [@context, @file_lists, @output, qw(-c --column --show-types)],@@ -31,7 +30,6 @@ sub invalid_combinations {         [qw(--column)]   => [@file_lists],         [@context]       => [@file_lists],         [qw(-f)]         => [qw(-v), @case],-        [qw(-g)]         => [@booleans],         [@fg]            => [@fg, @pretty, qw(-x -c -u --files-from)],         [qw(-p)]         => [@context, @file_lists, qw(--passthru -c)],         [qw(-v)]         => [qw(--column -o --output --passthru)],

lib/App/Ack.pm

@@ -841,7 +841,7 @@ sub build_all_regexes {      my @parts; -    # AND: alpha and beta+    # AND: alpha AND beta     if ( @parts = @{$opt->{and}} ) {         my @match_parts;         my @hilite_parts;@@ -875,11 +875,14 @@ sub build_all_regexes {         $re_hilite = $re_match;         $re_scan   = join( '|', @scan_parts );     }-    # NOT: alpha NOT beta-    elsif ( @parts = @{$opt->{not}} ) {+    else {         ($re_match, $re_scan) = build_regex( $opt_regex, $opt );         $re_hilite = $re_match;+    } +    # The --not does not affect the main regex. It is checked separately.+    # NOT: alpha NOT beta+    if ( @parts = @{$opt->{not}} ) {         my @not_parts;         for my $part ( @parts ) {             (my $re, undef) = build_regex( $part, $opt );@@ -887,11 +890,6 @@ sub build_all_regexes {         }         $re_not = join( '|', @not_parts );     }-    # No booleans.-    else {-        ($re_match, $re_scan) = build_regex( $opt_regex, $opt );-        $re_hilite = $re_match;-    }      return ($re_match, $re_not, $re_hilite, $re_scan); }

lib/App/Ack/ConfigLoader.pm

@@ -933,8 +933,6 @@ sub mutex_options {             'with-filename' => 1,         },         and => {-            g => 1,-            not => 1,             or => 1,         },         break => {@@ -1012,7 +1010,6 @@ sub mutex_options {             C => 1,             H => 1,             L => 1,-            and => 1,             break => 1,             c => 1,             column => 1,@@ -1025,9 +1022,7 @@ sub mutex_options {             l => 1,             m => 1,             match => 1,-            not => 1,             o => 1,-            or => 1,             output => 1,             p => 1,             passthru => 1,@@ -1094,10 +1089,6 @@ sub mutex_options {             L => 1,             l => 1,         },-        not => {-            and => 1,-            g => 1,-        },         o => {             A => 1,             B => 1,@@ -1117,7 +1108,6 @@ sub mutex_options {         },         or => {             and => 1,-            g => 1,         },         output => {             A => 1,

t/Util.pm

@@ -59,7 +59,7 @@ our @EXPORT = qw(     sets_match     ack_lists_match     ack_sets_match-    ack_error_matches+    ack_stderr_matches      untaint @@ -653,7 +653,7 @@ sub ack_sets_match { }  -sub ack_error_matches {+sub ack_stderr_matches {     local $Test::Builder::Level = $Test::Builder::Level + 1;      my $args     = shift;@@ -661,13 +661,16 @@ sub ack_error_matches {     my $msg      = shift;      return subtest subtest_name( $msg, $args, $expected ) => sub {-        plan tests => 4;+        plan tests => 2;          my ( $stdout, $stderr ) = run_ack_with_stderr( @{$args} );-        isnt( get_rc(), 0, 'Nonzero error' );         is_empty_array( $stdout, 'No normal output' );-        is( scalar @{$stderr}, 1, 'Just one error' );-        like( $stderr->[0], $expected, 'Error matches' );++        # Sometimes we run as ack, sometimes as ack-standalone.+        for ( @{$stderr} ) {+            s/^ack-standalone/ack/g;+        }+        return lists_match( $stderr, $expected, 'stderr matches' );     }; } @@ -1286,7 +1289,11 @@ sub read_tests {     my @tests = $ypp->load_file( $filename );      for my $test ( @tests ) {-        $test->{stdout} = _lineify( $test->{stdout} );+        for my $i ( qw( stdout stderr ) ) {+            if ( exists $test->{$i} ) {+                $test->{$i} = _lineify( $test->{$i} );+            }+        }          if ( my $n = $test->{'indent-stdout'} ) {             my $indent = ' ' x $n;@@ -1352,6 +1359,9 @@ sub _validate_test {     for my $key ( keys %{$test} ) {         die "Invalid key $key" unless _in( $key, \@valid_keys );     }+    if ( not exists $test->{stdout} ) {+        die "stdout must always be specified.";+    }      return; }

t/ack-g.yaml

@@ -119,3 +119,32 @@ stdout: |   t/text/numbered-text.txt   t/text/ozymandias.txt   t/text/raven.txt++---+name: -g and --and+args: -g foo --and test t/+stdout: |+  t/swamp/foo_test.py+  t/swamp/test_foo.py++---+name: -g and --not+args: -g foo --not test t/+stdout: |+  t/etc/shebang.foobar.xxx+  t/swamp/file.foo++---+name: -g and --or+args: -g foo --or ample t/+stdout: |+  t/etc/shebang.foobar.xxx+  t/swamp/example.R+  t/swamp/file.foo+  t/swamp/foo_test.py+  t/swamp/Sample.ascx+  t/swamp/Sample.asmx+  t/swamp/sample.asp+  t/swamp/sample.aspx+  t/swamp/sample.rake+  t/swamp/test_foo.py

t/mutex-options.t

@@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 196;+use Test::More tests => 178; use lib 't'; use Util; @@ -13,20 +13,6 @@ my $file = 't/text/raven.txt'; my $word = 'nevermore';  -# Order doesn't matter.  They are reported in alphabetical order.-for my $opt ( qw( -p --proximate ) ) {-    are_mutually_exclusive( '-f', $opt, ['-f', $opt] );-    are_mutually_exclusive( '-f', $opt, [$opt, '-f'] );-}--# Check for abbreviations. https://github.com/beyondgrep/ack3/issues/57-for my $opt ( qw( --pro --prox --proxima --proximat --proximate ) ) {-    are_mutually_exclusive( '-f', '--proximate',-        ['-f', $opt, '4'],-        ['-f', "$opt=4"],-    );-}- # XXX Should also handle --files-with-matches and --files-without-matches.  See https://github.com/beyondgrep/ack3/issues/57 are_mutually_exclusive('-l', '-L', ['-l', '-L', $word, $file]); for my $opt ( qw( -l -L ) ) {@@ -115,14 +101,6 @@ are_mutually_exclusive('--output', '--after-context', ['--output=$&', '--after-c are_mutually_exclusive('--output', '--before-context', ['--output=$&', '--before-context=2', $word, $file]); are_mutually_exclusive('--output', '--context', ['--output=$&', '--context=2', $word, $file]); -# --match-for my $opt ( qw( -f -g ) ) {-    are_mutually_exclusive('--match', $opt,-        ['--match', $word, $opt, $file],-        ['--match=science', $opt, $file],-    );-}- # --max-count for my $opt ( qw( -1 -c -f -g ) ) {     are_mutually_exclusive( '-m', $opt, ['-m', 1, $opt, $word, $file] );@@ -182,6 +160,7 @@ for my $opt ( qw( -f -g ) ) {     are_mutually_exclusive( $opt, '--files-from', [$opt, '--files-from', $word, $file] ); } + subtest q{Verify that "options" that follow -- aren't factored into the mutual exclusivity} => sub {     my ( $stdout, $stderr ) = run_ack_with_stderr('-A', 5, $word, $file, '--', '-l');     ok(@{$stdout} > 0, 'Some lines should appear on standard output');

t/mutex.yaml

new file mode 100644@@ -0,0 +1,73 @@+---+# Order doesn't matter.  They are reported in alphabetical order.+name: -f and -g+args:+  - -f -g WORD+  - -g WORD -f+exitcode: 255+stdout:+stderr: |+  ack: Options '-f' and '-g' can't be used together.++---+name: -f and -p+args:+  - -f -p+  - -f -p 2+exitcode: 255+stdout:+stderr: |+  ack: Options '-f' and '-p' can't be used together.++---+name: -f and --proximate+args:+  - -f --proximate+  - -f --proximate 2+exitcode: 255+stdout:+stderr: |+  ack: Options '-f' and '--proximate' can't be used together.++---+# Check for abbreviations. https://github.com/beyondgrep/ack3/issues/57+name: -f and --proximate abbreviations+args:+  - -f --pro+  - -f --prox+  - -f --proxi+  - -f --proxim+  - -f --proxima+  - -f --proximat+  - -f --proximate+exitcode: 255+stdout:+stderr: |+  ack: Options '-f' and '--proximate' can't be used together.++---+name: -f and --match+args:+  - -f --match WORD+exitcode: 255+stdout:+stderr: |+  ack: Options '-f' and '--match' can't be used together.++---+name: -g and --match+args:+  - -g WORD --match WORD+exitcode: 255+stdout:+stderr: |+  ack: Options '-g' and '--match' can't be used together.++---+name: --or and --and+args:+  - this --or that --and other+exitcode: 255+stdout:+stderr: |+  ack: Options '--and' and '--or' can't be used together.

t/yaml.t

@@ -3,7 +3,7 @@ use warnings; use strict; -use Test::More tests => 24;+use Test::More tests => 25;  use lib 't'; use Util;@@ -34,14 +34,26 @@ MAIN: {                     if ( $tempfilename ) {                         $args = [ @{$args}, $tempfilename ];                     }-                    subtest $test->{name} . ' ' . join( ', ', @{$args} ) => sub {-                        if ( $test->{ordered} ) {-                            ack_lists_match( $args, $test->{stdout}, $test->{name} );+                    subtest $test->{name} . ': ack ' . join( ' ', @{$args} ) => sub {+                        if ( exists $test->{stderr} ) {+                            ack_stderr_matches( $args, $test->{stderr}, $test->{name} );+                            is( get_rc(), $test->{exitcode}, 'Exit code matches' );                         }                         else {-                            ack_sets_match( $args, $test->{stdout}, $test->{name} );+                            if ( exists $test->{stdout} ) {+                                my $stdout = $test->{stdout};+                                if ( $test->{ordered} ) {+                                    ack_lists_match( $args, $test->{stdout}, $test->{name} );+                                }+                                else {+                                    ack_sets_match( $args, $test->{stdout}, $test->{name} );+                                }+                                is( get_rc(), $test->{exitcode}, 'Exit code matches' );+                            }+                            else {+                                fail( "stdout must always be specified" );+                            }                         }-                        is( get_rc(), $test->{exitcode} );                     }                 }                 if ( $tempfilename ) {

tags

@@ -27,12 +27,10 @@ !_TAG_PROGRAM_URL	https://ctags.io/	/official site/ !_TAG_PROGRAM_VERSION	6.1.0	// ADJACENT_CAPTURE_COLORING	t/ack-color.t	/^ADJACENT_CAPTURE_COLORING: {$/;"	l-AFTER	t/context.t	/^AFTER: {$/;"	l AND	t/boolean.t	/^AND: {$/;"	l AND	t/highlighting.t	/^    AND: {$/;"	l AND	t/highlighting.t	/^AND: {$/;"	l AND_AND	t/highlighting.t	/^    AND_AND: {$/;"	l-ARG_MULTIPLE_FILES	t/ack-output.t	/^ARG_MULTIPLE_FILES: {$/;"	l App::Ack	lib/App/Ack.pm	/^package App::Ack;$/;"	p App::Ack::ConfigDefault	lib/App/Ack/ConfigDefault.pm	/^package App::Ack::ConfigDefault;$/;"	p App::Ack::ConfigFinder	lib/App/Ack/ConfigFinder.pm	/^package App::Ack::ConfigFinder;$/;"	p@@ -52,62 +50,35 @@ App::Ack::Filter::IsPath	lib/App/Ack/Filter/IsPath.pm	/^package App::Ack::Filter App::Ack::Filter::IsPathGroup	lib/App/Ack/Filter/IsPathGroup.pm	/^package App::Ack::Filter::IsPathGroup;$/;"	p App::Ack::Filter::Match	lib/App/Ack/Filter/Match.pm	/^package App::Ack::Filter::Match;$/;"	p App::Ack::Filter::MatchGroup	lib/App/Ack/Filter/MatchGroup.pm	/^package App::Ack::Filter::MatchGroup;$/;"	p-BACK_ANCHORED	t/anchored.t	/^BACK_ANCHORED: {$/;"	l BASIC	t/highlighting.t	/^BASIC: {$/;"	l-BEFORE	t/context.t	/^BEFORE: {$/;"	l-BEFORE_WITH_LINE_NO	t/context.t	/^BEFORE_WITH_LINE_NO: {$/;"	l BREAK_NO_HEADING	t/ack-group.t	/^BREAK_NO_HEADING: {$/;"	l BRITISH_COLOR	t/ack-color.t	/^BRITISH_COLOR: {$/;"	l-Barfly	t/Barfly.pm	/^package Barfly;$/;"	p-Barfly::Block	t/Barfly.pm	/^package Barfly::Block;$/;"	p CAPTURE_PARSED	lib/App/Ack/ConfigLoader.pm	/^    CAPTURE_PARSED: {$/;"	l CAPTURE_RAW	lib/App/Ack/ConfigLoader.pm	/^    CAPTURE_RAW: {$/;"	l CHARACTER_SUBSTITUTIONS	t/ack-output.t	/^CHARACTER_SUBSTITUTIONS: {$/;"	l-COMBOS_1	t/ack-output.t	/^COMBOS_1: {$/;"	l-COMBOS_2	t/ack-output.t	/^COMBOS_2: {$/;"	l-COMBOS_3	t/ack-output.t	/^COMBOS_3: {$/;"	l CONTEXT	t/highlighting.t	/^CONTEXT: {$/;"	l-CONTEXT_ADJACENT	t/context.t	/^CONTEXT_ADJACENT: {$/;"	l-CONTEXT_DEFAULT	t/context.t	/^CONTEXT_DEFAULT: {$/;"	l CONTEXT_MAX_COUNT	t/context.t	/^CONTEXT_MAX_COUNT: {$/;"	l-CONTEXT_NONADJACENT	t/context.t	/^CONTEXT_NONADJACENT: {$/;"	l-CONTEXT_ONE	t/context.t	/^CONTEXT_ONE: {$/;"	l-CONTEXT_OVERLAPPING	t/context.t	/^CONTEXT_OVERLAPPING: {$/;"	l CONTEXT_OVERLAPPING_COLOR	t/context.t	/^CONTEXT_OVERLAPPING_COLOR: {$/;"	l CONTEXT_OVERLAPPING_COLOR_AFTER	t/context.t	/^CONTEXT_OVERLAPPING_COLOR_AFTER: {$/;"	l CONTEXT_OVERLAPPING_COLOR_BEFORE	t/context.t	/^CONTEXT_OVERLAPPING_COLOR_BEFORE: {$/;"	l COUNT_PRINT0	t/ack-print0.t	/^COUNT_PRINT0: {$/;"	l-DASH_CAPITAL_L	t/ack-l.t	/^DASH_CAPITAL_L: {$/;"	l-DASH_F	t/ack-1.t	/^DASH_F: {$/;"	l-DASH_F	t/zero.t	/^DASH_F: {$/;"	l-DASH_F_CWD	t/zero.t	/^DASH_F_CWD: {$/;"	l-DASH_G	t/ack-1.t	/^DASH_G: {$/;"	l DASH_IGNORE_DIR	t/ack-ignore-dir.t	/^DASH_IGNORE_DIR: {$/;"	l DASH_IGNORE_DIR_IGNORES_RELATIVE_PATHS	t/ack-ignore-dir.t	/^DASH_IGNORE_DIR_IGNORES_RELATIVE_PATHS: {$/;"	l DASH_IGNORE_DIR_MULTIPLE_TIMES	t/ack-ignore-dir.t	/^DASH_IGNORE_DIR_MULTIPLE_TIMES: {$/;"	l DASH_IGNORE_DIR_WITH_DASH_NOIGNORE_DIR	t/ack-ignore-dir.t	/^DASH_IGNORE_DIR_WITH_DASH_NOIGNORE_DIR: {$/;"	l DASH_IGNORE_DIR_WITH_SLASH	t/ack-ignore-dir.t	/^DASH_IGNORE_DIR_WITH_SLASH: {$/;"	l-DASH_L	t/ack-1.t	/^DASH_L: {$/;"	l-DASH_L	t/ack-l.t	/^DASH_L: {$/;"	l-DASH_LV	t/ack-l.t	/^DASH_LV: {$/;"	l DASH_NOIGNORE_DIR	t/ack-ignore-dir.t	/^DASH_NOIGNORE_DIR: {$/;"	l DASH_NOIGNORE_DIR_MULTIPLE_TIMES	t/ack-ignore-dir.t	/^DASH_NOIGNORE_DIR_MULTIPLE_TIMES: {$/;"	l DASH_Q	t/build_regex.t	/^DASH_Q: {$/;"	l-DASH_V	t/ack-1.t	/^DASH_V: {$/;"	l DASH_i	t/build_regex.t	/^DASH_i: {$/;"	l DASH_w	t/build_regex.t	/^DASH_w: {$/;"	l-DOLLAR_1	t/ack-output.t	/^DOLLAR_1: {$/;"	l-DOLLAR_UNDERSCORE	t/ack-output.t	/^DOLLAR_UNDERSCORE: {$/;"	l-DOUBLE_QUOTES	t/ack-output.t	/^DOUBLE_QUOTES: {$/;"	l DUMP	t/ack-dump.t	/^DUMP: {$/;"	l DUMP	t/ack-type-del.t	/^DUMP: {$/;"	l-EXCLUDE_ONLY	t/inverted-file-filter.t	/^EXCLUDE_ONLY: {$/;"	l FILENAME_SUBSTITUTION_1	t/ack-output.t	/^FILENAME_SUBSTITUTION_1 : {$/;"	l FILENAME_SUBSTITUTION_2	t/ack-output.t	/^FILENAME_SUBSTITUTION_2 : {$/;"	l FILENAME_SUBSTITUTION_3	t/ack-output.t	/^FILENAME_SUBSTITUTION_3 : {$/;"	l FILE_NOT_THERE	t/command-line-files.t	/^FILE_NOT_THERE: {$/;"	l FORCE_NO_PAGER	t/ack-pager.t	/^FORCE_NO_PAGER: {$/;"	l-FRONT_ANCHORED	t/anchored.t	/^FRONT_ANCHORED: {$/;"	l F_PRINT0	t/ack-print0.t	/^F_PRINT0: {$/;"	l FilterTest	t/FilterTest.pm	/^package FilterTest;$/;"	p GROUPING_MULTIPLE_FILES	t/context.t	/^GROUPING_MULTIPLE_FILES: {$/;"	l@@ -116,7 +87,6 @@ G_NO_PRINT0	t/ack-print0.t	/^G_NO_PRINT0: {$/;"	l G_PRINT0	t/ack-print0.t	/^G_PRINT0: {$/;"	l HEADING_NO_BREAK	t/ack-group.t	/^HEADING_NO_BREAK: {$/;"	l HIGHLIGHTING	t/context.t	/^HIGHLIGHTING: {$/;"	l-IGNORE_CASE	t/ack-v.t	/^IGNORE_CASE: {$/;"	l IGNORE_DIR_DONT_IGNORE_TARGET	t/ack-ignore-dir.t	/^IGNORE_DIR_DONT_IGNORE_TARGET: {$/;"	l IGNORE_DIR_EXT	t/ack-ignore-dir.t	/^IGNORE_DIR_EXT: {$/;"	l IGNORE_DIR_FIRSTMATCH	t/ack-ignore-dir.t	/^IGNORE_DIR_FIRSTMATCH: {$/;"	l@@ -125,10 +95,7 @@ IGNORE_DIR_MATCH_NOIGNORE_DIR	t/ack-ignore-dir.t	/^IGNORE_DIR_MATCH_NOIGNORE_DIR IGNORE_DIR_MATCH_NOIGNORE_DIR_IS	t/ack-ignore-dir.t	/^IGNORE_DIR_MATCH_NOIGNORE_DIR_IS: {$/;"	l IGNORE_DIR_MATCH_NOIGNORE_DIR_MATCH	t/ack-ignore-dir.t	/^IGNORE_DIR_MATCH_NOIGNORE_DIR_MATCH: {$/;"	l IGNORE_SUBDIR_OF_TARGET	t/ack-ignore-dir.t	/^IGNORE_SUBDIR_OF_TARGET: {$/;"	l-INCLUDE_PLUS_EXCLUDE_ONLY	t/inverted-file-filter.t	/^INCLUDE_PLUS_EXCLUDE_ONLY: {$/;"	l INCOMPLETE_LAST_LINE	t/incomplete-last-line.t	/^INCOMPLETE_LAST_LINE: {$/;"	l-INPUT_LINE_NUMBER	t/ack-output.t	/^INPUT_LINE_NUMBER: {$/;"	l-INPUT_LINE_NUMBER_MULTIPLE_FILES	t/ack-output.t	/^INPUT_LINE_NUMBER_MULTIPLE_FILES: {$/;"	l INTERACTIVE_GROUPING_COLOR	t/interactive.t	/^INTERACTIVE_GROUPING_COLOR: {$/;"	l INTERACTIVE_GROUPING_NOCOLOR	t/interactive.t	/^INTERACTIVE_GROUPING_NOCOLOR: {$/;"	l INTERACTIVE_NOCOLOR_REGEXP_CAPTURE	t/interactive.t	/^INTERACTIVE_NOCOLOR_REGEXP_CAPTURE: {$/;"	l@@ -137,12 +104,10 @@ INTERACTIVE_NOHEADING_NOCOLOR	t/interactive.t	/^INTERACTIVE_NOHEADING_NOCOLOR: { INTERACTIVE_SINGLE_TARGET	t/interactive.t	/^INTERACTIVE_SINGLE_TARGET: {$/;"	l JUST_THE_DIR	t/command-line-files.t	/^JUST_THE_DIR: {$/;"	l LAST_ONE_LISTED_WINS	t/ack-ignore-dir.t	/^LAST_ONE_LISTED_WINS: {$/;"	l-LAST_PAREN_MATCH	t/ack-output.t	/^LAST_PAREN_MATCH: {$/;"	l L_PRINT0	t/ack-print0.t	/^L_PRINT0: {$/;"	l MAIN	ack	/^MAIN: {$/;"	l MAIN	t/named-pipes.t	/^MAIN: {$/;"	l-MATCH	t/ack-output.t	/^MATCH: {$/;"	l-MATCH_MULTIPLE_FILES	t/ack-output.t	/^MATCH_MULTIPLE_FILES: {$/;"	l+MAIN	t/yaml.t	/^MAIN: {$/;"	l MATCH_VIA_CONTENT	t/filetypes.t	/^MATCH_VIA_CONTENT: {$/;"	l MATCH_WITH_BACKREF	t/ack-color.t	/^MATCH_WITH_BACKREF: {$/;"	l METACHARACTERS	t/highlighting.t	/^METACHARACTERS: {$/;"	l@@ -151,25 +116,17 @@ MY	Makefile.PL	/^package MY;$/;"	p MY	Makefile.PL	/^sub MY::postamble {$/;"	s MY	Makefile.PL	/^sub MY::test {$/;"	s NEEDS_LINE_SCAN	t/needs-line-scan.t	/^NEEDS_LINE_SCAN: {$/;"	l-NEVERMORE_NOT_QUOTH	t/boolean.t	/^NEVERMORE_NOT_QUOTH: {$/;"	l-NEVERMORE_NOT_QUOTH_NOT_THE	t/boolean.t	/^NEVERMORE_NOT_QUOTH_NOT_THE: {$/;"	l NOIGNORE_DIR_RELATIVE_PATHS	t/ack-ignore-dir.t	/^NOIGNORE_DIR_RELATIVE_PATHS: {$/;"	l NOIGNORE_SUBDIR_WINS	t/ack-ignore-dir.t	/^NOIGNORE_SUBDIR_WINS: {$/;"	l-NORMAL_CASE	t/ack-v.t	/^NORMAL_CASE: {$/;"	l NORMAL_COLOR	t/ack-color.t	/^NORMAL_COLOR: {$/;"	l NOT	t/boolean.t	/^NOT: {$/;"	l NOT	t/highlighting.t	/^    NOT: {$/;"	l NOT	t/highlighting.t	/^NOT: {$/;"	l NOT_AGAIN	t/highlighting.t	/^    NOT_AGAIN: {$/;"	l-NO_BOOLEANS	t/boolean.t	/^NO_BOOLEANS: {$/;"	l NO_GROUPING	t/ack-group.t	/^NO_GROUPING: {$/;"	l-NO_O	t/ack-o.t	/^NO_O: {$/;"	l NO_PAGER	t/ack-pager.t	/^NO_PAGER: {$/;"	l NO_SPECIALS_IN_OUTPUT_EXPRESSION	t/ack-output.t	/^NO_SPECIALS_IN_OUTPUT_EXPRESSION : {$/;"	l-NO_SWITCHES_MULTIPLE_FILES	t/ack-h.t	/^NO_SWITCHES_MULTIPLE_FILES: {$/;"	l-NO_SWITCHES_ONE_FILE	t/ack-h.t	/^NO_SWITCHES_ONE_FILE: {$/;"	l NTESTS	t/file-permission.t	/^use constant NTESTS => 5;$/;"	c-NUMERIC_SUBSTITUTIONS	t/ack-output.t	/^NUMERIC_SUBSTITUTIONS: {$/;"	l OR	t/boolean.t	/^OR: {$/;"	l OR	t/highlighting.t	/^    OR: {$/;"	l OR	t/highlighting.t	/^OR: {$/;"	l@@ -186,24 +143,16 @@ PIPE_INTO_ACK	t/from-stdin.t	/^PIPE_INTO_ACK: {$/;"	l PIPE_INTO_DASH_C	t/from-stdin.t	/^PIPE_INTO_DASH_C: {$/;"	l PIPE_INTO_DASH_I	t/from-stdin.t	/^PIPE_INTO_DASH_I: {$/;"	l PLAIN	t/build_regex.t	/^PLAIN: {$/;"	l-POSTMATCH	t/ack-output.t	/^POSTMATCH: {$/;"	l-POSTMATCH_MULTIPLE_FILES	t/ack-output.t	/^POSTMATCH_MULTIPLE_FILES: {$/;"	l-PREMATCH	t/ack-output.t	/^PREMATCH: {$/;"	l-PREMATCH_MULTIPLE_FILES	t/ack-output.t	/^PREMATCH_MULTIPLE_FILES: {$/;"	l-QUOTH_NOT_NEVERMORE	t/boolean.t	/^QUOTH_NOT_NEVERMORE: {$/;"	l REQUIRE_F_OR_G	t/ack-show-types.t	/^REQUIRE_F_OR_G: {$/;"	l RESTRICTED_DIRECTORIES	t/ack-s.t	/^RESTRICTED_DIRECTORIES: {$/;"	l RUBY_AND_RAKE	t/ack-show-types.t	/^RUBY_AND_RAKE: {$/;"	l RangeFile	t/range/rangefile.pm	/^package RangeFile;$/;"	p-SINGLE_TEXT_MATCH	t/ack-1.t	/^SINGLE_TEXT_MATCH: {$/;"	l SKIP	t/ack-passthru.t	/^SKIP: {$/;"	l SKIP	t/file-permission.t	/^SKIP: {$/;"	l SMARTCASE	t/build_regex.t	/^SMARTCASE: {$/;"	l SMART_CASE	t/longopts.t	/^SMART_CASE: {$/;"	l SPECIFYING_A_BAK_FILE	t/command-line-files.t	/^SPECIFYING_A_BAK_FILE: {$/;"	l STANDARD_GROUPING	t/ack-group.t	/^STANDARD_GROUPING: {$/;"	l-SUBPATTERN_MATCH	t/ack-output.t	/^SUBPATTERN_MATCH: {$/;"	l-SUBPATTERN_MATCH_MULTIPLE_FILES	t/ack-output.t	/^SUBPATTERN_MATCH_MULTIPLE_FILES: {$/;"	l TEST_NOTYPE	t/ack-type.t	/^TEST_NOTYPE: {$/;"	l TEST_NOTYPES	t/ack-type.t	/^TEST_NOTYPES: {$/;"	l TEST_NOTYPE_ACKRC_CMD_LINE_OVERRIDE	t/ack-type.t	/^TEST_NOTYPE_ACKRC_CMD_LINE_OVERRIDE: {$/;"	l@@ -213,20 +162,12 @@ TEST_TYPE_ACKRC_CMD_LINE_OVERRIDE	t/ack-type.t	/^TEST_TYPE_ACKRC_CMD_LINE_OVERRI TEST_TYPE_OVERRIDE	t/ack-type.t	/^TEST_TYPE_OVERRIDE: {$/;"	l TEST_UNKNOWN_TYPE	t/ack-type.t	/^TEST_UNKNOWN_TYPE: {$/;"	l TestFilter	t/filter.t	/^package TestFilter;$/;"	p-UNANCHORED	t/anchored.t	/^UNANCHORED: {$/;"	l UNFILTERED	t/file-iterator.t	/^UNFILTERED: {$/;"	l Util	t/Util.pm	/^package Util;$/;"	p VERIFY_LAST_LINE_IS_MISSING_NEWLINE	t/incomplete-last-line.t	/^VERIFY_LAST_LINE_IS_MISSING_NEWLINE: {$/;"	l-WITHOUT_COLUMNS	t/ack-column.t	/^WITHOUT_COLUMNS: {$/;"	l WITHOUT_S	t/ack-s.t	/^WITHOUT_S: {$/;"	l-WITH_COLUMNS	t/ack-column.t	/^WITH_COLUMNS: {$/;"	l WITH_COLUMNS_AND_CONTEXT	t/context.t	/^WITH_COLUMNS_AND_CONTEXT: {$/;"	l-WITH_COLUMNS_AND_NOT	t/ack-column.t	/^WITH_COLUMNS_AND_NOT: {$/;"	l-WITH_NOT	t/ack-v.t	/^WITH_NOT: {$/;"	l-WITH_O	t/ack-o.t	/^WITH_O: {$/;"	l WITH_S	t/ack-s.t	/^WITH_S: {$/;"	l-WITH_SWITCHES_MULTIPLE_FILES	t/ack-h.t	/^WITH_SWITCHES_MULTIPLE_FILES: {$/;"	l-WITH_SWITCHES_ONE_FILE	t/ack-h.t	/^WITH_SWITCHES_ONE_FILE: {$/;"	l _argjoin	t/boolean.t	/^sub _argjoin {$/;"	s _big_split	t/lowercase.t	/^sub _big_split {$/;"	s _check	t/build_regex.t	/^sub _check {$/;"	s@@ -274,20 +215,18 @@ _test_home_ackrc	t/forbidden-options.t	/^sub _test_home_ackrc {$/;"	s _test_project_ackrc	t/forbidden-options.t	/^sub _test_project_ackrc {$/;"	s _type_handler	lib/App/Ack/ConfigLoader.pm	/^    sub _type_handler {$/;"	s _uninvert_filter	lib/App/Ack/ConfigLoader.pm	/^sub _uninvert_filter {$/;"	s-_untaint	t/Barfly.pm	/^sub _untaint {$/;"	s _validate_test	t/Util.pm	/^sub _validate_test {$/;"	s _where	dev/generate-rgb-codes.pl	/^sub _where {$/;"	s _write_file	t/Util.pm	/^sub _write_file {$/;"	s-ack_error_matches	t/Util.pm	/^sub ack_error_matches {$/;"	s ack_lists_match	t/Util.pm	/^sub ack_lists_match {$/;"	s ack_sets_match	t/Util.pm	/^sub ack_sets_match {$/;"	s+ack_stderr_matches	t/Util.pm	/^sub ack_stderr_matches {$/;"	s ackbar	lib/App/Ack.pm	/^sub ackbar {$/;"	s add	lib/App/Ack/Filter/Collection.pm	/^sub add {$/;"	s add	lib/App/Ack/Filter/ExtensionGroup.pm	/^sub add {$/;"	s add	lib/App/Ack/Filter/IsGroup.pm	/^sub add {$/;"	s add	lib/App/Ack/Filter/IsPathGroup.pm	/^sub add {$/;"	s add	lib/App/Ack/Filter/MatchGroup.pm	/^sub add {$/;"	s-add_line	t/Barfly.pm	/^sub add_line {$/;"	s adjust_executable	t/Util.pm	/^sub adjust_executable {$/;"	s append_file	t/Util.pm	/^sub append_file {$/;"	s are_mutually_exclusive	t/mutex-options.t	/^sub are_mutually_exclusive {$/;"	s@@ -410,7 +349,6 @@ new	lib/App/Ack/Filter/IsPath.pm	/^sub new {$/;"	s new	lib/App/Ack/Filter/IsPathGroup.pm	/^sub new {$/;"	s new	lib/App/Ack/Filter/Match.pm	/^sub new {$/;"	s new	lib/App/Ack/Filter/MatchGroup.pm	/^sub new {$/;"	s-new	t/Barfly.pm	/^sub new {$/;"	s new	t/filter.t	/^sub new {$/;"	s next	lib/App/Ack/Files.pm	/^sub next {$/;"	s no_home	t/config-finder.t	/^sub no_home {$/;"	s@@ -447,12 +385,10 @@ reslash	t/Util.pm	/^sub reslash {$/;"	s reslash_all	t/Util.pm	/^sub reslash_all {$/;"	s retrieve_arg_sources	lib/App/Ack/ConfigLoader.pm	/^sub retrieve_arg_sources {$/;"	s retrieve_issues	dev/issues-scrub.pl	/^sub retrieve_issues {$/;"	s-run	t/Barfly.pm	/^sub run {$/;"	s run_ack	t/Util.pm	/^sub run_ack {$/;"	s run_ack_with_stderr	t/Util.pm	/^sub run_ack_with_stderr {$/;"	s run_cmd	t/Util.pm	/^sub run_cmd {$/;"	s run_piped	t/Util.pm	/^sub run_piped {$/;"	s-run_tests	t/Barfly.pm	/^sub run_tests {$/;"	s safe_chdir	t/Util.pm	/^sub safe_chdir {$/;"	s safe_mkdir	t/Util.pm	/^sub safe_mkdir {$/;"	s say	lib/App/Ack.pm	/^sub say              { print {$fh} @_, $ors; return; }$/;"	s