git-shortlog script
Attached is the 'git-shortlog' script I whipped up, to mimic the shortlog script that was used back in the BitKeeper days.
shortlog reads a changelog in the 'git-whatchanged' format, such as
git-whatchanged | git-shortlog
or
git-shortlog changes.txt
and outputs the changes sorted by author:
author1: cset 1-line desc cset 1-line desc ... author2: cset 1-line desc ... ...
Since git distinguishes 'author' from 'committer', I ran
git-whatchanged | git-shortlog > changes.txt
to look at the kernel authors throughout the entire history [of which is in git].
It's fun to browse, since this is the first time we've been able to get a better picture who is actually writing the patches, versus committing them. See changes.txt.bz2, attached.
Jeff
#!/usr/bin/perl -w
use strict;
my ($author, $desc, %map);
my $pstate = 1;
while (<>) {
# get author
if ($pstate == 1) {
next unless /^Author: (.*)$/;
$author = $1;
$pstate++;
}
# skip to blank line
elsif ($pstate == 2) {
next unless /^\s*$/;
$pstate++;
}
# skip to non-blank line
elsif ($pstate == 3) {
next if /^\s*$/;
chomp;
$desc = $_;
&shortlog_entry($author, $desc);
$pstate = 1;
}
else {
die "invalid parse state $pstate";
}
}&shortlog_output;
exit(0);
sub shortlog_entry($$) {
my ($tmp_author, $tmp_desc) = @_;
$tmp_desc =~ s#/pub/scm/linux/kernel/git/#/.../#g;
$tmp_desc =~ s#\[PATCH\] ##g;
$tmp_desc =~ s#^\s+##g;
if (exists $map{$tmp_author}) {
# grab ref
my $obj = $map{$tmp_author};
# add desc to array
push(@$obj, $tmp_desc);
} else {
# create new array, containing 1 item
my @arr = ($tmp_desc);
# store ref to array
$map{$tmp_author} = \@arr;
}
}sub shortlog_output {
my ($obj);
foreach $author (sort keys %map) {
print "$author:\n";
$obj = $map{$author};
foreach $desc (@$obj) {
print " $desc\n";
}
print "\n";
}
}Quoted 3 lines · Jeff Garzik
Attached is the 'git-shortlog' script I whipped up, to mimic the shortlog script that was used back in the BitKeeper days.
Thanks, I'll add this to the git stuff, and next kernel release will have a proper shortlog.
Btw, it shows how broken your merge script is: you don't fill in the AUTHOR field properly for some reason:
<[email protected]>:
Automatic merge of /spare/repo/netdev-2.6 branch r8169-fix
Automatic merge of /spare/repo/linux-2.6/.git branch HEAD
Automatic merge of /spare/repo/netdev-2.6 branch use-after-unmap Automatic merge of rsync://rsync.kernel.org/.../torvalds/linux-2.6.git branch HEAD
but "committer" is right. Pls fix.
Linus
Quoted 3 lines · Linus Torvalds
Btw, it shows how broken your merge script is: you don't fill in the AUTHOR field properly for some reason:
Oh, and the reason you didn't notice is that "git-whatchanged" normally ignores merges. Do
git-rev-list --pretty HEAD ^v2.6.12-rc5 | git-shortlog | less -S
to see what I'm talking about ("show shortlog of all the changes since v2.6.12-rc5").
Linus
Quoted 7 lines · Linus Torvalds
Quoted 1 line · Jeff Garzik
Attached is the 'git-shortlog' script I whipped up, to mimic the shortlog script that was used back in the BitKeeper days.
Thanks, I'll add this to the git stuff, and next kernel release will have a proper shortlog.
cool
Quoted 9 lines
Btw, it shows how broken your merge script is: you don't fill in the AUTHOR field properly for some reason:
<[email protected]>:
Automatic merge of /spare/repo/netdev-2.6 branch r8169-fix
Automatic merge of /spare/repo/linux-2.6/.git branch HEAD
Automatic merge of /spare/repo/netdev-2.6 branch use-after-unmap Automatic merge of rsync://rsync.kernel.org/.../torvalds/linux-2.6.git branch HEADbut "committer" is right. Pls fix.
hehe, my merge script is Ctrl-R (recall last git-resolve-script invocation).
Committer is right because I set that in my .bash_profile. I'll do that for author too, to provide a sane default.
I'm surprised git doesn't fall back to GIT_COMMITTER_NAME if GIT_AUTHOR_NAME doesn't exist, though.
Jeff
Quoted 3 lines · Jeff Garzik
I'm surprised git doesn't fall back to
GIT_COMMITTER_NAMEifGIT_AUTHOR_NAMEdoesn't exist, though.
GIT_AUTHOR_NAME existed first ;)
Btw, what does your /etc/passwd look like, and I'll try to hack it up to just get that case right by default too..
Linus
Quoted 9 lines · Linus Torvalds
Quoted 1 line · Jeff Garzik
I'm surprised git doesn't fall back to
GIT_COMMITTER_NAMEifGIT_AUTHOR_NAMEdoesn't exist, though.
GIT_AUTHOR_NAMEexisted first ;)Btw, what does your
/etc/passwdlook like, and I'll try to hack it up to just get that case right by default too..
ah, it looks like I forget the name when I was creating the account.
Quoted 9 lines
[jgarzik@pretzel libata-dev]$ grep jgarzik
/etc/passwdjgarzik:x:500:500::/g/g:/bin/bash[jgarzik@pretzel libata-dev]$ chfn
Changing finger information for jgarzik.
Password: Name []: Jeff Garzik
Office []: Office Phone []: Home Phone []:Finger information changed.
Fixed. :)
In any case, I'll set GIT_AUTHOR_NAME in .bash_profile, to get my proper email addy rather than the local one.
Jeff