option to show commit hashes
[git-grep-footer.git] / git-grep-footer
index 0a3450ecd9484daaafbffca458201f175938d037..f739228d63fbfaee6d0651df1e94b0f7c53161d5 100755 (executable)
@@ -9,6 +9,7 @@ use Getopt::Long qw(:config bundling);
 
 GetOptions(\my %opt,
        'debug!',
 
 GetOptions(\my %opt,
        'debug!',
+       '',  # stdin
        'count|c!',
        'simplify|s:s',
        'ignore-case|i!',
        'count|c!',
        'simplify|s:s',
        'ignore-case|i!',
@@ -16,11 +17,17 @@ GetOptions(\my %opt,
        'grep|S=s',
        'min|min-count|unique|u:i',
        'max|max-count|show|n:i',
        'grep|S=s',
        'min|min-count|unique|u:i',
        'max|max-count|show|n:i',
+       'hash|H!',
        'version|V'  => sub { Getopt::Long::VersionMessage() },
        'usage|h'    => sub { Getopt::Long::HelpMessage() },
        'help|man|?' => sub { Getopt::Long::HelpMessage(-verbose => 2) },
 ) or exit 129;
 
        'version|V'  => sub { Getopt::Long::VersionMessage() },
        'usage|h'    => sub { Getopt::Long::HelpMessage() },
        'help|man|?' => sub { Getopt::Long::HelpMessage(-verbose => 2) },
 ) or exit 129;
 
+my $inputstream = $opt{''} ? \*ARGV : eval {
+       require Git;
+       Git::command_output_pipe('log', '-z', '--pretty=format:%h%n%b', @ARGV);
+} || die "Automatic git log failed: $@";
+
 local $| = 1;
 local $/ = "\0";
 
 local $| = 1;
 local $/ = "\0";
 
@@ -28,9 +35,9 @@ my $HEADERMATCH = qr/ [a-z]+ (?: (?:-\w+)+ | \ by ) | cc | reference /ix;
 
 my (%headercount, @headercache);
 
 
 my (%headercount, @headercache);
 
-while (readline) {
-       s/^([0-9a-f]{4,40})\n//m and
-       my $hash = $1;
+while (readline $inputstream) {
+       s/^([0-9a-f]{4,40})\n//m;
+       my $hash = $opt{hash} ? $1 : undef;
 
        # strip commit seperator
        chomp;
 
        # strip commit seperator
        chomp;
@@ -159,7 +166,9 @@ git-grep-footer - Find custom header lines in commit messages
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
-F<git> log --pretty=%b%x00 | F<git-grep-footer> [OPTIONS]
+F<git-grep-footer> [OPTIONS] [-- <git log options>]
+
+F<git> log -z --pretty=format:%b | F<git-grep-footer> [OPTIONS] -
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
@@ -226,15 +235,19 @@ Additional samples are optionally given upto the given maximum.
 Prefixes (unique) lines by the number of occurrences.
 Causes output to be buffered until all input has been read (obviously).
 
 Prefixes (unique) lines by the number of occurrences.
 Causes output to be buffered until all input has been read (obviously).
 
+=item -H, --hash
+
+Prefixes the SHA1 hash of the (or a) matching commit.
+
 =back
 
 =head1 EXAMPLES
 
 =over
 
 =back
 
 =head1 EXAMPLES
 
 =over
 
-=item git-grep-footer --grep=^ack
+=item git-grep-footer --grep=^ack v2.6.32..v2.6.33
 
 
-Search for Acked-by lines.
+Search for I<Acked-by> lines for version I<v2.6.33>.
 Append C<-uin> to skip reoccurrences.
 
 =item git-grep-footer -u --grep=junio
 Append C<-uin> to skip reoccurrences.
 
 =item git-grep-footer -u --grep=junio
@@ -249,9 +262,9 @@ Compare various capitalisations and (mis)spellings of signoffs.
 
 List the ten most frequently used attribute names.
 
 
 List the ten most frequently used attribute names.
 
-=item git-grep-footer -n2 -i -s
+=item git-grep-footer -n2 -i -s --hash -- --reverse
 
 
-Upto two examples for each distinct identifier.
+The earliest two usages of each distinct identifier.
 
 =back
 
 
 =back