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
@@ -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
@@ -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
@@ -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>>
@@ -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)],
@@ -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); }
@@ -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,
@@ -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; }
@@ -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
@@ -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');
@@ -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.
@@ -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 ) {
@@ -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