add commit count options to git-shortlog

This patch does 3 things:

1) Output the number of commits along with the name for each author
   (nice to know for long lists spending more than a screen worth of
   commit lines).

2) Provide a switch (-n) to sort authors according to their number of
   commits instead of author alphabetic order.

3) Provide a switch (-s) to supress commit lines and only keep a
   summary of authors and the number of commits for each of them.

And for good measure a short usage is displayed with -h.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Nicolas Pitre 2006-10-06 15:39:09 -04:00 committed by Junio C Hamano
parent 96779be48a
commit 4e27fb06f0
2 changed files with 54 additions and 7 deletions

View File

@ -7,16 +7,29 @@ git-shortlog - Summarize 'git log' output
SYNOPSIS
--------
git-log --pretty=short | 'git-shortlog'
git-log --pretty=short | 'git-shortlog' [-h] [-n] [-s]
DESCRIPTION
-----------
Summarizes 'git log' output in a format suitable for inclusion
in release announcements. Each commit will be grouped by author
in release announcements. Each commit will be grouped by author and
the first line of the commit message will be shown.
Additionally, "[PATCH]" will be stripped from the commit description.
OPTIONS
-------
-h::
Print a short usage message and exit.
-n::
Sort output according to the number of commits per author instead
of author alphabetic order.
-s:
Supress commit description and Provide a commit count summary only.
FILES
-----
'.mailmap'::

View File

@ -1,6 +1,18 @@
#!/usr/bin/perl -w
use strict;
use Getopt::Std;
use File::Basename qw(basename dirname);
our ($opt_h, $opt_n, $opt_s);
getopts('hns');
$opt_h && usage();
sub usage {
print STDERR "Usage: ${\basename $0} [-h] [-n] [-s] < <log_data>\n";
exit(1);
}
my (%mailmap);
my (%email);
@ -38,16 +50,38 @@ sub by_name($$) {
uc($a) cmp uc($b);
}
sub by_nbentries($$) {
my ($a, $b) = @_;
my $a_entries = $map{$a};
my $b_entries = $map{$b};
@$b_entries - @$a_entries || by_name $a, $b;
}
my $sort_method = $opt_n ? \&by_nbentries : \&by_name;
sub summary_output {
my ($obj, $num, $key);
foreach $key (sort $sort_method keys %map) {
$obj = $map{$key};
$num = @$obj;
printf "%s: %u\n", $key, $num;
$n_output += $num;
}
}
sub shortlog_output {
my ($obj, $key, $desc);
my ($obj, $num, $key, $desc);
foreach $key (sort $sort_method keys %map) {
$obj = $map{$key};
$num = @$obj;
foreach $key (sort by_name keys %map) {
# output author
printf "%s:\n", $key;
printf "%s (%u):\n", $key, $num;
# output author's 1-line summaries
$obj = $map{$key};
foreach $desc (reverse @$obj) {
print " $desc\n";
$n_output++;
@ -152,7 +186,7 @@ sub finalize {
&setup_mailmap;
&changelog_input;
&shortlog_output;
$opt_s ? &summary_output : &shortlog_output;
&finalize;
exit(0);