Browse Source

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>
maint v1.4.3-rc2
Nicolas Pitre 19 years ago committed by Junio C Hamano
parent
commit
4e27fb06f0
  1. 17
      Documentation/git-shortlog.txt
  2. 44
      git-shortlog.perl

17
Documentation/git-shortlog.txt

@ -7,16 +7,29 @@ git-shortlog - Summarize 'git log' output @@ -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'::

44
git-shortlog.perl

@ -1,6 +1,18 @@ @@ -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($$) { @@ -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 { @@ -152,7 +186,7 @@ sub finalize {

&setup_mailmap;
&changelog_input;
&shortlog_output;
$opt_s ? &summary_output : &shortlog_output;
&finalize;
exit(0);


Loading…
Cancel
Save