In addition to hardcoded list of kernel people, read from .mailmap file the list of email-to-name translations. Modernize regexps here and there minimally while at it. Signed-off-by: Junio C Hamano <junkio@cox.net>
		
			
				
	
	
		
			201 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/perl -w
 | 
						||
 | 
						||
use strict;
 | 
						||
 | 
						||
my (%mailmap);
 | 
						||
my (%email);
 | 
						||
my (%map);
 | 
						||
my $pstate = 1;
 | 
						||
my $n_records = 0;
 | 
						||
my $n_output = 0;
 | 
						||
 | 
						||
sub shortlog_entry($$) {
 | 
						||
	my ($name, $desc) = @_;
 | 
						||
	my $key = $name;
 | 
						||
 | 
						||
	$desc =~ s#/pub/scm/linux/kernel/git/#/.../#g;
 | 
						||
	$desc =~ s#\[PATCH\] ##g;
 | 
						||
 | 
						||
	# store description in array, in email->{desc list} map
 | 
						||
	if (exists $map{$key}) {
 | 
						||
		# grab ref
 | 
						||
		my $obj = $map{$key};
 | 
						||
 | 
						||
		# add desc to array
 | 
						||
		push(@$obj, $desc);
 | 
						||
	} else {
 | 
						||
		# create new array, containing 1 item
 | 
						||
		my @arr = ($desc);
 | 
						||
 | 
						||
		# store ref to array
 | 
						||
		$map{$key} = \@arr;
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
# sort comparison function
 | 
						||
sub by_name($$) {
 | 
						||
	my ($a, $b) = @_;
 | 
						||
 | 
						||
	uc($a) cmp uc($b);
 | 
						||
}
 | 
						||
 | 
						||
sub shortlog_output {
 | 
						||
	my ($obj, $key, $desc);
 | 
						||
 | 
						||
	foreach $key (sort by_name keys %map) {
 | 
						||
		# output author
 | 
						||
		printf "%s:\n", $key;
 | 
						||
 | 
						||
		# output author's 1-line summaries
 | 
						||
		$obj = $map{$key};
 | 
						||
		foreach $desc (reverse @$obj) {
 | 
						||
			print "  $desc\n";
 | 
						||
			$n_output++;
 | 
						||
		}
 | 
						||
 | 
						||
		# blank line separating author from next author
 | 
						||
		print "\n";
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
sub changelog_input {
 | 
						||
	my ($author, $desc);
 | 
						||
 | 
						||
	while (<>) {
 | 
						||
		# get author and email
 | 
						||
		if ($pstate == 1) {
 | 
						||
			my ($email);
 | 
						||
 | 
						||
			next unless /^[Aa]uthor:?\s*(.*?)\s*<(.*)>/;
 | 
						||
 | 
						||
			$n_records++;
 | 
						||
 | 
						||
			$author = $1;
 | 
						||
			$email = $2;
 | 
						||
			$desc = undef;
 | 
						||
 | 
						||
			# cset author fixups
 | 
						||
			if (exists $mailmap{$email}) {
 | 
						||
				$author = $mailmap{$email};
 | 
						||
			} elsif (exists $mailmap{$author}) {
 | 
						||
				$author = $mailmap{$author};
 | 
						||
			} elsif (!$author) {
 | 
						||
				$author = $email;
 | 
						||
			}
 | 
						||
			$email{$author}{$email}++;
 | 
						||
			$pstate++;
 | 
						||
		}
 | 
						||
 | 
						||
		# skip to blank line
 | 
						||
		elsif ($pstate == 2) {
 | 
						||
			next unless /^\s*$/;
 | 
						||
			$pstate++;
 | 
						||
		}
 | 
						||
 | 
						||
		# skip to non-blank line
 | 
						||
		elsif ($pstate == 3) {
 | 
						||
			next unless /^\s*?(.*)/;
 | 
						||
 | 
						||
			# skip lines that are obviously not
 | 
						||
			# a 1-line cset description
 | 
						||
			next if /^\s*From: /;
 | 
						||
 | 
						||
			chomp;
 | 
						||
			$desc = $1;
 | 
						||
 | 
						||
			&shortlog_entry($author, $desc);
 | 
						||
 | 
						||
			$pstate = 1;
 | 
						||
		}
 | 
						||
	
 | 
						||
		else {
 | 
						||
			die "invalid parse state $pstate";
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
sub read_mailmap {
 | 
						||
	my ($fh, $mailmap) = @_;
 | 
						||
	while (<$fh>) {
 | 
						||
		chomp;
 | 
						||
		if (/^([^#].*?)\s*<(.*)>/) {
 | 
						||
			$mailmap->{$2} = $1;
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
sub setup_mailmap {
 | 
						||
	read_mailmap(\*DATA, \%mailmap);
 | 
						||
	if (-f '.mailmap') {
 | 
						||
		my $fh = undef;
 | 
						||
		open $fh, '<', '.mailmap';
 | 
						||
		read_mailmap($fh, \%mailmap);
 | 
						||
		close $fh;
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
sub finalize {
 | 
						||
	#print "\n$n_records records parsed.\n";
 | 
						||
 | 
						||
	if ($n_records != $n_output) {
 | 
						||
		die "parse error: input records != output records\n";
 | 
						||
	}
 | 
						||
	if (0) {
 | 
						||
		for my $author (sort keys %email) {
 | 
						||
			my $e = $email{$author};
 | 
						||
			for my $email (sort keys %$e) {
 | 
						||
				print STDERR "$author <$email>\n";
 | 
						||
			}
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
&setup_mailmap;
 | 
						||
&changelog_input;
 | 
						||
&shortlog_output;
 | 
						||
&finalize;
 | 
						||
exit(0);
 | 
						||
 | 
						||
 | 
						||
__DATA__
 | 
						||
#
 | 
						||
# Even with git, we don't always have name translations.
 | 
						||
# So have an email->real name table to translate the
 | 
						||
# (hopefully few) missing names
 | 
						||
#
 | 
						||
Adrian Bunk <bunk@stusta.de>
 | 
						||
Andreas Herrmann <aherrman@de.ibm.com>
 | 
						||
Andrew Morton <akpm@osdl.org>
 | 
						||
Andrew Vasquez <andrew.vasquez@qlogic.com>
 | 
						||
Christoph Hellwig <hch@lst.de>
 | 
						||
Corey Minyard <minyard@acm.org>
 | 
						||
David Woodhouse <dwmw2@shinybook.infradead.org>
 | 
						||
Domen Puncer <domen@coderock.org>
 | 
						||
Douglas Gilbert <dougg@torque.net>
 | 
						||
Ed L Cashin <ecashin@coraid.com>
 | 
						||
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
 | 
						||
Felix Moeller <felix@derklecks.de>
 | 
						||
Frank Zago <fzago@systemfabricworks.com>
 | 
						||
Greg Kroah-Hartman <gregkh@suse.de>
 | 
						||
James Bottomley <jejb@mulgrave.(none)>
 | 
						||
James Bottomley <jejb@titanic.il.steeleye.com>
 | 
						||
Jeff Garzik <jgarzik@pretzel.yyz.us>
 | 
						||
Jens Axboe <axboe@suse.de>
 | 
						||
Kay Sievers <kay.sievers@vrfy.org>
 | 
						||
Mitesh shah <mshah@teja.com>
 | 
						||
Morten Welinder <terra@gnome.org>
 | 
						||
Morten Welinder <welinder@anemone.rentec.com>
 | 
						||
Morten Welinder <welinder@darter.rentec.com>
 | 
						||
Morten Welinder <welinder@troll.com>
 | 
						||
Nguyen Anh Quynh <aquynh@gmail.com>
 | 
						||
Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
 | 
						||
Peter A Jonsson <pj@ludd.ltu.se>
 | 
						||
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
 | 
						||
Rudolf Marek <R.Marek@sh.cvut.cz>
 | 
						||
Rui Saraiva <rmps@joel.ist.utl.pt>
 | 
						||
Sachin P Sant <ssant@in.ibm.com>
 | 
						||
Santtu Hyrkk,Av(B <santtu.hyrkko@gmail.com>
 | 
						||
Simon Kelley <simon@thekelleys.org.uk>
 | 
						||
Tejun Heo <htejun@gmail.com>
 | 
						||
Tony Luck <tony.luck@intel.com>
 |