scripts/get_maintainer.pl: add .mailmap use, shell and email cleanups
Joe Perches [Tue, 22 Sep 2009 00:04:21 +0000 (17:04 -0700)]
Add reading and using .mailmap file if it exists
Convert address entries in .mailmap to first encountered address
Don't terminate shell commands with \n
Strip characters found after sign-offs by: name <address> [stripped]

Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

scripts/get_maintainer.pl

index 1200d72..8b80b5a 100755 (executable)
@@ -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;