Commit 1b5e1cf64a7a376417457c7f2b3885decea276e4

Authored by Joe Perches
Committed by Linus Torvalds
1 parent de2fc4922b

scripts/get_maintainer.pl: support M: lines with names and multiple entries per M: line

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>

Showing 1 changed file with 129 additions and 16 deletions Side-by-side Diff

scripts/get_maintainer.pl
... ... @@ -55,6 +55,10 @@
55 55 }
56 56 my $penguin_chiefs = "\(" . join("|",@penguin_chief_names) . "\)";
57 57  
  58 +# rfc822 - preloaded methods go here.
  59 +my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])";
  60 +my $rfc822_char = '[\\000-\\177]';
  61 +
58 62 if (!GetOptions(
59 63 'email!' => \$email,
60 64 'git!' => \$email_git,
... ... @@ -392,18 +396,7 @@
392 396 }
393 397 } elsif ($ptype eq "M") {
394 398 if ($email_maintainer) {
395   - if ($index >= 0) {
396   - my $tv = $typevalue[$index - 1];
397   - if ($tv =~ m/^(\C):\s*(.*)/) {
398   - if ($1 eq "P" && $email_usename) {
399   - push(@email_to, format_email($2, $pvalue));
400   - } else {
401   - push(@email_to, $pvalue);
402   - }
403   - }
404   - } else {
405   - push(@email_to, $pvalue);
406   - }
  399 + push_email_addresses($pvalue);
407 400 }
408 401 } elsif ($ptype eq "T") {
409 402 push(@scm, $pvalue);
... ... @@ -421,6 +414,36 @@
421 414 }
422 415 }
423 416  
  417 +sub push_email_address {
  418 + my ($email_address) = @_;
  419 +
  420 + my $email_name = "";
  421 + if ($email_address =~ m/([^<]+)<(.*\@.*)>$/) {
  422 + $email_name = $1;
  423 + $email_address = $2;
  424 + }
  425 +
  426 + if ($email_usename && $email_name) {
  427 + push(@email_to, format_email($email_name, $email_address));
  428 + } else {
  429 + push(@email_to, $email_address);
  430 + }
  431 +}
  432 +
  433 +sub push_email_addresses {
  434 + my ($address) = @_;
  435 +
  436 + my @address_list = ();
  437 +
  438 + if (@address_list = rfc822_validlist($address)) {
  439 + my $array_count = shift(@address_list);
  440 + while (my $entry = shift(@address_list)) {
  441 + push_email_address($entry);
  442 + }
  443 + }
  444 +
  445 +}
  446 +
424 447 sub which {
425 448 my ($bin) = @_;
426 449  
... ... @@ -480,10 +503,6 @@
480 503 if ($line =~ m/(.+)<(.+)>/) {
481 504 my $git_name = $1;
482 505 my $git_addr = $2;
483   - $git_name =~ tr/^\"//;
484   - $git_name =~ tr/^\\s*//;
485   - $git_name =~ tr/\"$//;
486   - $git_name =~ tr/\\s*$//;
487 506 if ($email_usename) {
488 507 push(@email_to, format_email($git_name, $git_addr));
489 508 } else {
... ... @@ -525,6 +544,100 @@
525 544 } else {
526 545 print(join($output_separator, @parms));
527 546 print("\n");
  547 + }
  548 +}
  549 +
  550 +my $rfc822re;
  551 +
  552 +sub make_rfc822re {
  553 +# Basic lexical tokens are specials, domain_literal, quoted_string, atom, and
  554 +# comment. We must allow for rfc822_lwsp (or comments) after each of these.
  555 +# This regexp will only work on addresses which have had comments stripped
  556 +# and replaced with rfc822_lwsp.
  557 +
  558 + my $specials = '()<>@,;:\\\\".\\[\\]';
  559 + my $controls = '\\000-\\037\\177';
  560 +
  561 + my $dtext = "[^\\[\\]\\r\\\\]";
  562 + my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$rfc822_lwsp*";
  563 +
  564 + my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$rfc822_lwsp)*\"$rfc822_lwsp*";
  565 +
  566 +# Use zero-width assertion to spot the limit of an atom. A simple
  567 +# $rfc822_lwsp* causes the regexp engine to hang occasionally.
  568 + my $atom = "[^$specials $controls]+(?:$rfc822_lwsp+|\\Z|(?=[\\[\"$specials]))";
  569 + my $word = "(?:$atom|$quoted_string)";
  570 + my $localpart = "$word(?:\\.$rfc822_lwsp*$word)*";
  571 +
  572 + my $sub_domain = "(?:$atom|$domain_literal)";
  573 + my $domain = "$sub_domain(?:\\.$rfc822_lwsp*$sub_domain)*";
  574 +
  575 + my $addr_spec = "$localpart\@$rfc822_lwsp*$domain";
  576 +
  577 + my $phrase = "$word*";
  578 + my $route = "(?:\@$domain(?:,\@$rfc822_lwsp*$domain)*:$rfc822_lwsp*)";
  579 + my $route_addr = "\\<$rfc822_lwsp*$route?$addr_spec\\>$rfc822_lwsp*";
  580 + my $mailbox = "(?:$addr_spec|$phrase$route_addr)";
  581 +
  582 + my $group = "$phrase:$rfc822_lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*";
  583 + my $address = "(?:$mailbox|$group)";
  584 +
  585 + return "$rfc822_lwsp*$address";
  586 +}
  587 +
  588 +sub rfc822_strip_comments {
  589 + my $s = shift;
  590 +# Recursively remove comments, and replace with a single space. The simpler
  591 +# regexps in the Email Addressing FAQ are imperfect - they will miss escaped
  592 +# chars in atoms, for example.
  593 +
  594 + while ($s =~ s/^((?:[^"\\]|\\.)*
  595 + (?:"(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*)*)
  596 + \((?:[^()\\]|\\.)*\)/$1 /osx) {}
  597 + return $s;
  598 +}
  599 +
  600 +# valid: returns true if the parameter is an RFC822 valid address
  601 +#
  602 +sub rfc822_valid ($) {
  603 + my $s = rfc822_strip_comments(shift);
  604 +
  605 + if (!$rfc822re) {
  606 + $rfc822re = make_rfc822re();
  607 + }
  608 +
  609 + return $s =~ m/^$rfc822re$/so && $s =~ m/^$rfc822_char*$/;
  610 +}
  611 +
  612 +# validlist: In scalar context, returns true if the parameter is an RFC822
  613 +# valid list of addresses.
  614 +#
  615 +# In list context, returns an empty list on failure (an invalid
  616 +# address was found); otherwise a list whose first element is the
  617 +# number of addresses found and whose remaining elements are the
  618 +# addresses. This is needed to disambiguate failure (invalid)
  619 +# from success with no addresses found, because an empty string is
  620 +# a valid list.
  621 +
  622 +sub rfc822_validlist ($) {
  623 + my $s = rfc822_strip_comments(shift);
  624 +
  625 + if (!$rfc822re) {
  626 + $rfc822re = make_rfc822re();
  627 + }
  628 + # * null list items are valid according to the RFC
  629 + # * the '1' business is to aid in distinguishing failure from no results
  630 +
  631 + my @r;
  632 + if ($s =~ m/^(?:$rfc822re)?(?:,(?:$rfc822re)?)*$/so &&
  633 + $s =~ m/^$rfc822_char*$/) {
  634 + while($s =~ m/(?:^|,$rfc822_lwsp*)($rfc822re)/gos) {
  635 + push @r, $1;
  636 + }
  637 + return wantarray ? (scalar(@r), @r) : 1;
  638 + }
  639 + else {
  640 + return wantarray ? () : 0;
528 641 }
529 642 }