summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xscripts/get_maintainer.pl72
1 files changed, 65 insertions, 7 deletions
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl
index 1200d724e73b..8b80b5abb860 100755
--- a/scripts/get_maintainer.pl
+++ b/scripts/get_maintainer.pl
@@ -152,6 +152,36 @@ while (<MAINT>) {
}
close(MAINT);
+my %mailmap;
+
+open(MAILMAP, "<${lk_path}.mailmap") || warn "$P: Can't open .mailmap\n";
+while (<MAILMAP>) {
+ my $line = $_;
+
+ next if ($line =~ m/^\s*#/);
+ next if ($line =~ m/^\s*$/);
+
+ my ($name, $address) = parse_email($line);
+ $line = format_email($name, $address);
+
+ next if ($line =~ m/^\s*$/);
+
+ if (exists($mailmap{$name})) {
+ my $obj = $mailmap{$name};
+ push(@$obj, $address);
+ } else {
+ my @arr = ($address);
+ $mailmap{$name} = \@arr;
+ }
+}
+close(MAILMAP);
+
+foreach my $name (sort {$mailmap{$a} <=> $mailmap{$b}} keys %mailmap) {
+ my $obj = $mailmap{$name};
+ foreach my $address (@$obj) {
+ }
+}
+
## use the filenames on the command line or find the filenames in the patchfiles
my @files = ();
@@ -403,12 +433,12 @@ sub parse_email {
my $name = "";
my $address = "";
- if ($formatted_email =~ /^([^<]+)<(.*\@.*)>$/) {
+ if ($formatted_email =~ /^([^<]+)<(.*\@.*)>.*$/) {
$name = $1;
$address = $2;
- } elsif ($formatted_email =~ /^<(.*\@.*)>$/) {
+ } elsif ($formatted_email =~ /^\s*<(.*\@.*)>.*$/) {
$address = $1;
- } elsif ($formatted_email =~ /^(.*\@.*)$/) {
+ } elsif ($formatted_email =~ /^\s*(.*\@.*)$/) {
$address = $1;
}
@@ -557,6 +587,29 @@ sub which {
return "";
}
+sub mailmap {
+ my @lines = @_;
+ my %hash;
+
+ foreach my $line (@lines) {
+ my ($name, $address) = parse_email($line);
+ if (!exists($hash{$name})) {
+ $hash{$name} = $address;
+ }
+ if (exists($mailmap{$name})) {
+ my $obj = $mailmap{$name};
+ foreach my $map_address (@$obj) {
+ if (($map_address eq $address) &&
+ ($map_address ne $hash{$name})) {
+ $line = format_email($name, $hash{$name});
+ }
+ }
+ }
+ }
+
+ return @lines;
+}
+
sub recent_git_signoffs {
my ($file) = @_;
@@ -592,9 +645,10 @@ sub recent_git_signoffs {
# cut -f2- -d":"
s/.*:\s*(.+)\s*/$1/ for (@lines);
+ $total_sign_offs = @lines;
+
@lines = mailmap(@lines);
- $total_sign_offs = @lines;
@lines = sort(@lines);
# uniq -c
foreach my $line (@lines) {
@@ -655,12 +709,12 @@ sub git_assign_blame {
my $diff_start = $2;
my $diff_length = $3;
next if (!("$file" eq "$diff_file"));
- $cmd = "git blame -l -L $diff_start,+$diff_length $file\n";
+ $cmd = "git blame -l -L $diff_start,+$diff_length $file";
@commits = save_commits($cmd, @commits);
}
} else {
if (-f $file) {
- $cmd = "git blame -l $file\n";
+ $cmd = "git blame -l $file";
@commits = save_commits($cmd, @commits);
}
}
@@ -678,11 +732,15 @@ sub git_assign_blame {
if (!$email_git_penguin_chiefs) {
@lines = grep(!/${penguin_chiefs}/i, @lines);
}
+
# cut -f2- -d":"
s/.*:\s*(.+)\s*/$1/ for (@lines);
- $hash{$_}++ for @lines;
$total_sign_offs += @lines;
+
+ @lines = mailmap(@lines);
+
+ $hash{$_}++ for @lines;
}
$count = 0;