Skip to content

Commit

Permalink
Allow files without an extension to be recognized as a distinct type.…
Browse files Browse the repository at this point in the history
… Keep old behavior unless --type-allow-empty is explicitly specified. Added tests and help text for this change.
  • Loading branch information
willert committed Mar 7, 2012
1 parent 2a7f8eb commit 4ffcc40
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 5 deletions.
15 changes: 13 additions & 2 deletions Ack.pm
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 ) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
15 changes: 13 additions & 2 deletions ack
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 ) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions t/ack-text.t 100644 → 100755
Expand Up @@ -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
Expand Down
20 changes: 19 additions & 1 deletion t/ack-type.t 100644 → 100755
Expand Up @@ -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 );
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 );
Expand Down
1 change: 1 addition & 0 deletions t/swamp/no-extension
@@ -0,0 +1 @@
nothing to see here, move along

0 comments on commit 4ffcc40

Please sign in to comment.