Browse Source
* 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/emailsmaint

2 changed files with 82 additions and 33 deletions
@ -1,38 +1,70 @@ |
|||||||
#!/usr/bin/perl -w |
#!/usr/bin/perl |
||||||
my %mailmap = (); |
|
||||||
open I, "<", ".mailmap"; |
use warnings 'all'; |
||||||
while (<I>) { |
use strict; |
||||||
chomp; |
use Getopt::Long; |
||||||
next if /^#/; |
|
||||||
if (my ($author, $mail) = /^(.*?)\s+<(.+)>$/) { |
my $match_emails; |
||||||
$mailmap{$mail} = $author; |
my $match_names; |
||||||
} |
my $order_by = 'count'; |
||||||
|
Getopt::Long::Configure(qw(bundling)); |
||||||
|
GetOptions( |
||||||
|
'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; |
close($fh); |
||||||
|
|
||||||
my %mail2author = (); |
if ($match_emails) { |
||||||
open I, "git log --pretty='format:%ae %an' |"; |
foreach my $e (dups($email)) { |
||||||
while (<I>) { |
foreach my $n (vals($email->{$e})) { |
||||||
chomp; |
show($n, $e, $email->{$e}->{$n}); |
||||||
my ($mail, $author) = split(/\t/, $_); |
} |
||||||
next if exists $mailmap{$mail}; |
print "\n"; |
||||||
$mail2author{$mail} ||= {}; |
} |
||||||
$mail2author{$mail}{$author} ||= 0; |
|
||||||
$mail2author{$mail}{$author}++; |
|
||||||
} |
} |
||||||
close I; |
if ($match_names) { |
||||||
|
foreach my $n (dups($name)) { |
||||||
|
foreach my $e (vals($name->{$n})) { |
||||||
|
show($n, $e, $name->{$n}->{$e}); |
||||||
|
} |
||||||
|
print "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
exit 0; |
||||||
|
|
||||||
while (my ($mail, $authorcount) = each %mail2author) { |
sub mark { |
||||||
# %$authorcount is ($author => $count); |
my ($h, $k, $v, $t) = @_; |
||||||
# sort and show the names from the most frequent ones. |
my $e = $h->{$k}->{$v} ||= { count => 0, stamp => 0 }; |
||||||
my @names = (map { $_->[0] } |
$e->{count}++; |
||||||
sort { $b->[1] <=> $a->[1] } |
$e->{stamp} = $t unless $t < $e->{stamp}; |
||||||
map { [$_, $authorcount->{$_}] } |
|
||||||
keys %$authorcount); |
|
||||||
if (1 < @names) { |
|
||||||
for (@names) { |
|
||||||
print "$_ <$mail>\n"; |
|
||||||
} |
} |
||||||
|
|
||||||
|
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"; |
||||||
|
} |
||||||
|
Loading…
Reference in new issue