History

scripts/get_maintainer.pl: better email routines, use perl not shell where possible

Added format_email and parse_email routines to reduce inline use. Added email_address_inuse to eliminate multiple maintainer entries for the same email address, the first name encountered is used. Used internal perl equivalents of shell cmd use of grep|cut|sort|uniq

Joe Perches committed 17 years ago

Commit 0e70e831 parent 3fb55651 file · +96 −56Browse files

Showing the changes to scripts (1 of 1 file). Show all

Unified · Split

scripts/get_maintainer.pl+96−56
@@ -13,7 +13,7 @@ · 12 unmodified lines
1313 use strict;
1414
1515 my $P = $0;
16−my $V = '0.19';
16+my $V = '0.20';
1717
1818 use Getopt::Long qw(:config no_auto_abbrev);
1919
@@ -258,11 +258,8 @@ if ($email) { · 238 unmodified lines
258258 foreach my $chief (@penguin_chief) {
259259 if ($chief =~ m/^(.*):(.*)/) {
260260 my $email_address;
261− if ($email_usename) {
262− $email_address = format_email($1, $2);
263− } else {
264− $email_address = $2;
265− }
261+
262+ $email_address = format_email($1, $2);
266263 if ($email_git_penguin_chiefs) {
267264 push(@email_to, $email_address);
268265 } else {
@@ -400,21 +397,57 @@ sub top_of_kernel_tree { · 131 unmodified lines
400397 return 0;
401398 }
402399
403−sub format_email {
404− my ($name, $email) = @_;
400+sub parse_email {
401+ my ($formatted_email) = @_;
402+
403+ my $name = "";
404+ my $address = "";
405+
406+ if ($formatted_email =~ /^([^<]+)<(.*\@.*)>$/) {
407+ $name = $1;
408+ $address = $2;
409+ } elsif ($formatted_email =~ /^<(.*\@.*)>$/) {
410+ $address = $1;
411+ } elsif ($formatted_email =~ /^(.*\@.*)$/) {
412+ $address = $1;
413+ }
405414
406415 $name =~ s/^\s+|\s+$//g;
407416 $name =~ s/^\"|\"$//g;
408− $email =~ s/^\s+|\s+$//g;
417+ $address =~ s/^\s+|\s+$//g;
409418
410− my $formatted_email = "";
419+ if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars
420+ $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
421+ $name = "\"$name\"";
422+ }
423+
424+ return ($name, $address);
425+}
426+
427+sub format_email {
428+ my ($name, $address) = @_;
429+
430+ my $formatted_email;
431+
432+ $name =~ s/^\s+|\s+$//g;
433+ $name =~ s/^\"|\"$//g;
434+ $address =~ s/^\s+|\s+$//g;
411435
412436 if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars
413437 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
414− $formatted_email = "\"${name}\"\ \<${email}\>";
438+ $name = "\"$name\"";
439+ }
440+
441+ if ($email_usename) {
442+ if ("$name" eq "") {
443+ $formatted_email = "$address";
444+ } else {
445+ $formatted_email = "$name <${address}>";
446+ }
415447 } else {
416− $formatted_email = "${name} \<${email}\>";
448+ $formatted_email = $address;
417449 }
450+
418451 return $formatted_email;
419452 }
420453
@@ -444,19 +477,18 @@ sub add_categories { · 23 unmodified lines
444477 }
445478 }
446479 } elsif ($ptype eq "M") {
447− my $p_used = 0;
448− if ($index >= 0) {
449− my $tv = $typevalue[$index - 1];
450− if ($tv =~ m/^(\C):\s*(.*)/) {
451− if ($1 eq "P") {
452− if ($email_usename) {
453− push_email_address(format_email($2, $pvalue));
454− $p_used = 1;
480+ my ($name, $address) = parse_email($pvalue);
481+ if ($name eq "") {
482+ if ($index >= 0) {
483+ my $tv = $typevalue[$index - 1];
484+ if ($tv =~ m/^(\C):\s*(.*)/) {
485+ if ($1 eq "P") {
486+ $name = $2;
455487 }
456488 }
457489 }
458490 }
459− if (!$p_used) {
491+ if ($email_maintainer) {
460492 push_email_addresses($pvalue);
461493 }
462494 } elsif ($ptype eq "T") {
@@ -475,26 +507,24 @@ sub add_categories { · 12 unmodified lines
475507 }
476508 }
477509
510+sub email_address_inuse {
511+ my ($test_address) = @_;
512+
513+ foreach my $line (@email_to) {
514+ my ($name, $address) = parse_email($line);
515+
516+ return 1 if ($address eq $test_address);
517+ }
518+ return 0;
519+}
520+
478521 sub push_email_address {
479− my ($email_address) = @_;
522+ my ($line) = @_;
480523
481− my $email_name = "";
524+ my ($name, $address) = parse_email($line);
482525
483− if ($email_maintainer) {
484− if ($email_address =~ m/([^<]+)<(.*\@.*)>$/) {
485− $email_name = $1;
486− $email_address = $2;
487− if ($email_usename) {
488− push(@email_to, format_email($email_name, $email_address));
489− } else {
490− push(@email_to, $email_address);
491− }
492− } elsif ($email_address =~ m/<(.+)>/) {
493− $email_address = $1;
494− push(@email_to, $email_address);
495− } else {
496− push(@email_to, $email_address);
497− }
526+ if (!email_address_inuse($address)) {
527+ push(@email_to, format_email($name, $address));
498528 }
499529 }
500530
@@ -535,6 +565,7 @@ sub recent_git_signoffs { · 34 unmodified lines
535565 my $output = "";
536566 my $count = 0;
537567 my @lines = ();
568+ my %hash;
538569 my $total_sign_offs;
539570
540571 if (which("git") eq "") {
@@ -548,25 +579,31 @@ sub recent_git_signoffs { · 7 unmodified lines
548579 }
549580
550581 $cmd = "git log --since=${email_git_since} -- ${file}";
551− $cmd .= " | grep -Ei \"^[-_ a-z]+by:.*\\\@.*\$\"";
552− if (!$email_git_penguin_chiefs) {
553− $cmd .= " | grep -Ev \"${penguin_chiefs}\"";
554− }
555− $cmd .= " | cut -f2- -d\":\"";
556− $cmd .= " | sort | uniq -c | sort -rn";
557582
558583 $output = `${cmd}`;
559584 $output =~ s/^\s*//gm;
560585
561586 @lines = split("\n", $output);
562587
563− $total_sign_offs = 0;
588+ @lines = grep(/^[-_ a-z]+by:.*\@.*$/i, @lines);
589+ if (!$email_git_penguin_chiefs) {
590+ @lines = grep(!/${penguin_chiefs}/i, @lines);
591+ }
592+ # cut -f2- -d":"
593+ s/.*:\s*(.+)\s*/$1/ for (@lines);
594+
595+ @lines = mailmap(@lines);
596+
597+ $total_sign_offs = @lines;
598+ @lines = sort(@lines);
599+ # uniq -c
564600 foreach my $line (@lines) {
565− if ($line =~ m/([0-9]+)\s+(.*)/) {
566− $total_sign_offs += $1;
567− } else {
568− die("$P: Unexpected git output: ${line}\n");
569− }
601+ $hash{$line}++;
602+ }
603+ # sort -rn
604+ @lines = ();
605+ foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) {
606+ push(@lines,"$hash{$line} $line");
570607 }
571608
572609 foreach my $line (@lines) {
@@ -579,8 +616,8 @@ sub recent_git_signoffs { · 6 unmodified lines
579616 $sign_offs * 100 / $total_sign_offs < $email_git_min_percent) {
580617 last;
581618 }
619+ push_email_address($line);
582620 }
583− push_email_address($line);
584621 }
585622 }
586623
@@ -632,15 +669,18 @@ sub git_assign_blame { · 45 unmodified lines
632669 @commits = uniq(@commits);
633670 foreach my $commit (@commits) {
634671 $cmd = "git log -1 ${commit}";
635− $cmd .= " | grep -Ei \"^[-_ a-z]+by:.*\\\@.*\$\"";
636− if (!$email_git_penguin_chiefs) {
637− $cmd .= " | grep -Ev \"${penguin_chiefs}\"";
638− }
639− $cmd .= " | cut -f2- -d\":\"";
640672
641673 $output = `${cmd}`;
642674 $output =~ s/^\s*//gm;
643675 @lines = split("\n", $output);
676+
677+ @lines = grep(/^[-_ a-z]+by:.*\@.*$/i, @lines);
678+ if (!$email_git_penguin_chiefs) {
679+ @lines = grep(!/${penguin_chiefs}/i, @lines);
680+ }
681+ # cut -f2- -d":"
682+ s/.*:\s*(.+)\s*/$1/ for (@lines);
683+
644684 $hash{$_}++ for @lines;
645685 $total_sign_offs += @lines;
646686 }