From 4ffcc40cb7332b3700ea827434ba8c2944d41ef6 Mon Sep 17 00:00:00 2001 From: Sebastian Willert Date: Wed, 7 Mar 2012 17:23:05 +0100 Subject: [PATCH] Allow files without an extension to be recognized as a distinct type. Keep old behavior unless --type-allow-empty is explicitly specified. Added tests and help text for this change. --- Ack.pm | 15 +++++++++++++-- ack | 15 +++++++++++++-- t/ack-text.t | 1 + t/ack-type.t | 20 +++++++++++++++++++- t/swamp/no-extension | 1 + 5 files changed, 47 insertions(+), 5 deletions(-) mode change 100644 => 100755 t/ack-text.t mode change 100644 => 100755 t/ack-type.t create mode 100644 t/swamp/no-extension diff --git a/Ack.pm b/Ack.pm index 1a3387b..d2ee9cb 100644 --- a/Ack.pm +++ b/Ack.pm @@ -381,6 +381,7 @@ i.e. into %mappings, etc. sub def_types_from_ARGV { my @typedef; + my $allow_empty_types; my $parser = Getopt::Long::Parser->new(); # pass_through => leave unrecognized command line arguments alone @@ -389,10 +390,11 @@ sub def_types_from_ARGV { $parser->getoptions( 'type-set=s' => sub { shift; push @typedef, ['c', shift] }, 'type-add=s' => sub { shift; push @typedef, ['a', shift] }, + 'type-allow-empty' => \$allow_empty_types, ) or App::Ack::die( 'See ack --help or ack --man for options.' ); for my $td (@typedef) { - my ($type, $ext) = split /=/, $td->[1]; + my ($type, $ext) = split /=/, $td->[1], -1; if ( $td->[0] eq 'c' ) { # type-set @@ -415,9 +417,12 @@ sub def_types_from_ARGV { unless exists $mappings{$type}; } - my @exts = split /,/, $ext; + my @exts = length($ext) ? split /,/, $ext, -1 : ''; # split returns undef on empty string s/^\.// for @exts; + # restore old behavior of ignoring empty typedefs unless explicitly asked to do otherwise + @exts = grep{ $_ } @exts unless $allow_empty_types; + if ( !exists $mappings{$type} || ref($mappings{$type}) eq 'ARRAY' ) { push @{$mappings{$type}}, @exts; for my $e ( @exts ) { @@ -508,6 +513,10 @@ sub filetypes { if ( $filename =~ m{\.([^\.$dir_sep_chars]+)$}o ) { my $ref = $types{lc $1}; return (@{$ref},TEXT) if $ref; + } elsif ( exists $types{''} ) { + # files without extensions could have an user defined type + my $ref = $types{''}; + return (@{$ref},TEXT) if $ref; } # At this point, we can't tell from just the name. Now we have to @@ -806,6 +815,8 @@ File inclusion/exclusion: --type-add TYPE=.EXTENSION[,.EXT2[,...]] Files with the given EXTENSION(s) are recognized as being of (the existing) type TYPE + --type-allow-empty Allow files without an extension to be recognized as + a distinct type. --[no]follow Follow symlinks. Default is off. diff --git a/ack b/ack index 655f434..a450b59 100755 --- a/ack +++ b/ack @@ -1503,6 +1503,7 @@ sub get_command_line_options { sub def_types_from_ARGV { my @typedef; + my $allow_empty_types; my $parser = Getopt::Long::Parser->new(); # pass_through => leave unrecognized command line arguments alone @@ -1511,10 +1512,11 @@ sub def_types_from_ARGV { $parser->getoptions( 'type-set=s' => sub { shift; push @typedef, ['c', shift] }, 'type-add=s' => sub { shift; push @typedef, ['a', shift] }, + 'type-allow-empty' => \$allow_empty_types, ) or App::Ack::die( 'See ack --help or ack --man for options.' ); for my $td (@typedef) { - my ($type, $ext) = split /=/, $td->[1]; + my ($type, $ext) = split /=/, $td->[1], -1; if ( $td->[0] eq 'c' ) { # type-set @@ -1537,9 +1539,12 @@ sub def_types_from_ARGV { unless exists $mappings{$type}; } - my @exts = split /,/, $ext; + my @exts = length($ext) ? split /,/, $ext, -1 : ''; # split returns undef on empty string s/^\.// for @exts; + # restore old behavior of ignoring empty typedefs unless explicitly asked to do otherwise + @exts = grep{ $_ } @exts unless $allow_empty_types; + if ( !exists $mappings{$type} || ref($mappings{$type}) eq 'ARRAY' ) { push @{$mappings{$type}}, @exts; for my $e ( @exts ) { @@ -1600,6 +1605,10 @@ sub filetypes { if ( $filename =~ m{\.([^\.$dir_sep_chars]+)$}o ) { my $ref = $types{lc $1}; return (@{$ref},TEXT) if $ref; + } elsif ( exists $types{''} ) { + # files without extensions could have an user defined type + my $ref = $types{''}; + return (@{$ref},TEXT) if $ref; } # At this point, we can't tell from just the name. Now we have to @@ -1848,6 +1857,8 @@ File inclusion/exclusion: --type-add TYPE=.EXTENSION[,.EXT2[,...]] Files with the given EXTENSION(s) are recognized as being of (the existing) type TYPE + --type-allow-empty Allow files without an extension to be recognized as + a distinct type. --[no]follow Follow symlinks. Default is off. diff --git a/t/ack-text.t b/t/ack-text.t old mode 100644 new mode 100755 index 21c1186..7982d97 --- a/t/ack-text.t +++ b/t/ack-text.t @@ -48,6 +48,7 @@ ACK_F_TEXT: { t/swamp/Makefile t/swamp/Makefile.PL t/swamp/javascript.js + t/swamp/no-extension t/swamp/not-an-#emacs-workfile# t/swamp/notaMakefile t/swamp/notaRakefile diff --git a/t/ack-type.t b/t/ack-type.t old mode 100644 new mode 100755 index 8f0bd16..a9dc646 --- a/t/ack-type.t +++ b/t/ack-type.t @@ -3,7 +3,7 @@ use warnings; use strict; -use Test::More tests => 74; +use Test::More tests => 82; use lib 't'; use Util qw( sets_match ); @@ -37,6 +37,15 @@ my $bar = [qw( t/swamp/file.bar )]; +my $none = [ + 't/swamp/0', + 't/swamp/no-extension', + 't/swamp/not-an-#emacs-workfile#', + 't/swamp/notaMakefile', + 't/swamp/notaRakefile', + 't/swamp/perl-without-extension', +]; + my $xml = [qw( t/etc/buttonhook.rss.xxx t/etc/buttonhook.xml.xxx @@ -109,6 +118,15 @@ check_with( '--type-add xml=.foo,.bar --xml', $foo_bar_xml ); # check that --type-set redefines check_with( '--type-set cc=.foo --cc', $foo ); +# check --type-set with empty EXT +check_with( '--type-set empty= --type empty --no-recurse', [] ); +check_with( '--type-set empty= --type empty --no-recurse --type-allow-empty', $none ); + +# check --type-add with empty EXT +check_with( '--type-add cc= --cc --no-recurse', $cc_hh ); +check_with( '--type-add cc= --cc --no-recurse --type-allow-empty', [ sort @$cc_hh, @$none ]); + + # check that builtin types cannot be changed BUILTIN: { my @builtins = qw( make skipped text binary ); diff --git a/t/swamp/no-extension b/t/swamp/no-extension new file mode 100644 index 0000000..e69b2e0 --- /dev/null +++ b/t/swamp/no-extension @@ -0,0 +1 @@ +nothing to see here, move along