Commit ccc3ae79 authored by Junio C Hamano's avatar Junio C Hamano

Merge branch 'jk/mailmap-cleanup' into maint

* jk/mailmap-cleanup:
  contrib: update stats/mailmap script
  .mailmap: normalize emails for Linus Torvalds
  .mailmap: normalize emails for Jeff King
  .mailmap: fix broken entry for Martin Langhoff
  .mailmap: match up some obvious names/emails
parents 66afe50b 53474eb9
......@@ -9,7 +9,9 @@ Alex Bennée <[email protected]>
Alexander Gavrilov <[email protected]>
Aneesh Kumar K.V <[email protected]>
Brian M. Carlson <[email protected]>
Cheng Renquan <[email protected]>
Chris Shoemaker <[email protected]>
Dan Johnson <[email protected]>
Dana L. How <[email protected]>
Dana L. How <[email protected]>
Daniel Barkalow <[email protected]>
......@@ -18,14 +20,18 @@ David Kågedal <[email protected]>
David S. Miller <[email protected]>
Deskin Miller <[email protected]>
Dirk Süsserott <[email protected]>
Eric S. Raymond <[email protected]>
Erik Faye-Lund <[email protected]> <[email protected]>
Fredrik Kuivinen <[email protected]>
Frédéric Heitzmann <[email protected]>
H. Peter Anvin <[email protected]>
H. Peter Anvin <[email protected]>
H. Peter Anvin <[email protected]>
Horst H. von Brand <[email protected]>
İsmail Dönmez <[email protected]>
Jakub Narębski <[email protected]>
Jay Soffian <[email protected]>
Jeff King <[email protected]> <[email protected]>
Joachim Berdal Haga <[email protected]>
Johannes Sixt <[email protected]> <[email protected]>
Johannes Sixt <[email protected]> <[email protected]>
......@@ -41,12 +47,21 @@ Junio C Hamano <[email protected]> <[email protected]>
Junio C Hamano <[email protected]> <[email protected]>
Junio C Hamano <[email protected]> <[email protected]>
Karl Hasselström <[email protected]>
Kevin Leung <[email protected]>
Kent Engstrom <[email protected]>
Lars Doelle <[email protected] ! de>
Lars Doelle <[email protected]>
Li Hong <[email protected]>
Linus Torvalds <[email protected]> <[email protected]>
Linus Torvalds <[email protected]> <[email protected]>
Linus Torvalds <[email protected]> <[email protected]>
Linus Torvalds <[email protected]> <[email protected]>
Linus Torvalds <[email protected]> <[email protected]>
Linus Torvalds <[email protected]> <[email protected](none)>
Lukas Sandström <[email protected]>
Martin Langhoff <[email protected]>
Marc-André Lureau <[email protected]>
Mark Rada <[email protected]>
Martin Langhoff <[email protected]> <[email protected]>
Martin von Zweigbergk <[email protected]> <[email protected]>
Michael Coleman <[email protected]>
Michael J Gruber <[email protected]> <[email protected]>
......@@ -63,11 +78,13 @@ Ralf Thielow <[email protected]> <[email protected]>
Ramsay Allan Jones <[email protected]>
René Scharfe <[email protected]>
Robert Fitzsimons <[email protected]>
Robert Zeh <[email protected]>
Sam Vilain <[email protected]>
Santi Béjar <[email protected]>
Sean Estabrooks <[email protected]>
Shawn O. Pearce <[email protected]>
Steven Grimm <[email protected]>
Tay Ray Chuan <[email protected]>
Theodore Ts'o <[email protected]>
Thomas Rast <[email protected]> <[email protected]>
Tony Luck <[email protected]>
#!/usr/bin/perl -w
my %mailmap = ();
open I, "<", ".mailmap";
while (<I>) {
next if /^#/;
if (my ($author, $mail) = /^(.*?)\s+<(.+)>$/) {
$mailmap{$mail} = $author;
use warnings 'all';
use strict;
use Getopt::Long;
my $match_emails;
my $match_names;
my $order_by = 'count';
'emails|e!' => \$match_emails,
'names|n!' => \$match_names,
'count|c' => sub { $order_by = 'count' },
'time|t' => sub { $order_by = 'stamp' },
) or exit 1;
$match_emails = 1 unless $match_names;
my $email = {};
my $name = {};
open(my $fh, '-|', "git log --format='%at <%aE> %aN'");
while(<$fh>) {
my ($t, $e, $n) = /(\S+) <(\S+)> (.*)/;
mark($email, $e, $n, $t);
mark($name, $n, $e, $t);
close I;
my %mail2author = ();
open I, "git log --pretty='format:%ae %an' |";
while (<I>) {
my ($mail, $author) = split(/\t/, $_);
next if exists $mailmap{$mail};
$mail2author{$mail} ||= {};
$mail2author{$mail}{$author} ||= 0;
if ($match_emails) {
foreach my $e (dups($email)) {
foreach my $n (vals($email->{$e})) {
show($n, $e, $email->{$e}->{$n});
print "\n";
close I;
while (my ($mail, $authorcount) = each %mail2author) {
# %$authorcount is ($author => $count);
# sort and show the names from the most frequent ones.
my @names = (map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { [$_, $authorcount->{$_}] }
keys %$authorcount);
if (1 < @names) {
for (@names) {
print "$_ <$mail>\n";
if ($match_names) {
foreach my $n (dups($name)) {
foreach my $e (vals($name->{$n})) {
show($n, $e, $name->{$n}->{$e});
print "\n";
exit 0;
sub mark {
my ($h, $k, $v, $t) = @_;
my $e = $h->{$k}->{$v} ||= { count => 0, stamp => 0 };
$e->{stamp} = $t unless $t < $e->{stamp};
sub dups {
my $h = shift;
return grep { keys($h->{$_}) > 1 } keys($h);
sub vals {
my $h = shift;
return sort {
$h->{$b}->{$order_by} <=> $h->{$a}->{$order_by}
} keys($h);
sub show {
my ($n, $e, $h) = @_;
print "$n <$e> ($h->{$order_by})\n";
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment