additional hash simplifications for -s'any'
[git-grep-footer.git] / git-grep-footer
index ff279a606bc2ad4cc8545b1e2e14f039b23550ce..53f6f1cf49d15e0d6f63d062c91e844c7bb24c6d 100755 (executable)
@@ -9,6 +9,7 @@ use Getopt::Long qw(:config bundling);
 
 GetOptions(\my %opt,
        'debug!',
+       'count|c!',
        'simplify|s:s',
        'ignore-case|i!',
        'min|min-count|unique|u:i',
@@ -23,6 +24,8 @@ local $/ = "\0";
 
 my $HEADERMATCH = qr/ [a-z]+ (?: (?:-\w+)+ | \ by ) /ix;
 
+my (%headercount, @headercache);
+
 while (readline) {
        s/(.+)\n//m;
        my $hash = $1;
@@ -76,7 +79,8 @@ while (readline) {
                                                s{\b (https?)://\S+ }{[$1]}gmsx;  # url
                                                s{(?: < | \A ) [^@>\s]+ @ [^>]+ (?: > | \Z )}{<...>}igmsx;  # address
                                                s{\b [0-9]+ \b}{[num]}gmsx;  # number
-                                               s{\b I? [0-9a-f]{40} \b}{[sha1]}gmsx;  # hash
+                                               s{\b [Ig]? [0-9a-f]{  40} \b}{[sha1]}gmsx;  # hash
+                                               s{\b [Ig]? [0-9a-f]{6,40} \b}{[hash]}gmsx;  # abbrev
                                        }
                                }
                                when (['all', 'contents']) {
@@ -105,19 +109,28 @@ while (readline) {
                }
 
                for (@headers) {
+                       my $line = $_->[2] // join(': ', @$_);
                        if (defined $opt{min} or $opt{max}) {
-                               state $seen;
-                               my $count = $seen->{ $_->[0] }->{ $_->[1] // '' }++;
-                               next if $count >= ($opt{min} // 0) + ($opt{max} || 1);
-                               next if $count < ($opt{min} // 0);
+                               my $counter = \$headercount{ $_->[0] }->{ $_->[1] // '' };
+                               my $excess = $$counter++ - ($opt{min} // 0);
+                               next if $excess >= ($opt{max} || 1);
+                               next if $excess <  0;
+                               if ($opt{count}) {
+                                       push @headercache, [ $line, $excess ? \undef : $counter ];
+                                       next;
+                               }
                        }
-                       say $_->[2] // join(': ', @$_);
+                       say $line;
                }
 
                last BLOCK;
        }
 }
 
+for (@headercache) {
+       say ${$_->[1]} // '', "\t", $_->[0];
+}
+
 __END__
 
 =head1 NAME