Loading scripts/get_maintainer.pl +129 −16 Original line number Diff line number Diff line Loading @@ -55,6 +55,10 @@ foreach my $chief (@penguin_chief) { } my $penguin_chiefs = "\(" . join("|",@penguin_chief_names) . "\)"; # rfc822 - preloaded methods go here. my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])"; my $rfc822_char = '[\\000-\\177]'; if (!GetOptions( 'email!' => \$email, 'git!' => \$email_git, Loading Loading @@ -392,18 +396,7 @@ sub add_categories { } } elsif ($ptype eq "M") { if ($email_maintainer) { if ($index >= 0) { my $tv = $typevalue[$index - 1]; if ($tv =~ m/^(\C):\s*(.*)/) { if ($1 eq "P" && $email_usename) { push(@email_to, format_email($2, $pvalue)); } else { push(@email_to, $pvalue); } } } else { push(@email_to, $pvalue); } push_email_addresses($pvalue); } } elsif ($ptype eq "T") { push(@scm, $pvalue); Loading @@ -421,6 +414,36 @@ sub add_categories { } } sub push_email_address { my ($email_address) = @_; my $email_name = ""; if ($email_address =~ m/([^<]+)<(.*\@.*)>$/) { $email_name = $1; $email_address = $2; } if ($email_usename && $email_name) { push(@email_to, format_email($email_name, $email_address)); } else { push(@email_to, $email_address); } } sub push_email_addresses { my ($address) = @_; my @address_list = (); if (@address_list = rfc822_validlist($address)) { my $array_count = shift(@address_list); while (my $entry = shift(@address_list)) { push_email_address($entry); } } } sub which { my ($bin) = @_; Loading Loading @@ -480,10 +503,6 @@ sub recent_git_signoffs { if ($line =~ m/(.+)<(.+)>/) { my $git_name = $1; my $git_addr = $2; $git_name =~ tr/^\"//; $git_name =~ tr/^\\s*//; $git_name =~ tr/\"$//; $git_name =~ tr/\\s*$//; if ($email_usename) { push(@email_to, format_email($git_name, $git_addr)); } else { Loading Loading @@ -527,3 +546,97 @@ sub output { print("\n"); } } my $rfc822re; sub make_rfc822re { # Basic lexical tokens are specials, domain_literal, quoted_string, atom, and # comment. We must allow for rfc822_lwsp (or comments) after each of these. # This regexp will only work on addresses which have had comments stripped # and replaced with rfc822_lwsp. my $specials = '()<>@,;:\\\\".\\[\\]'; my $controls = '\\000-\\037\\177'; my $dtext = "[^\\[\\]\\r\\\\]"; my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$rfc822_lwsp*"; my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$rfc822_lwsp)*\"$rfc822_lwsp*"; # Use zero-width assertion to spot the limit of an atom. A simple # $rfc822_lwsp* causes the regexp engine to hang occasionally. my $atom = "[^$specials $controls]+(?:$rfc822_lwsp+|\\Z|(?=[\\[\"$specials]))"; my $word = "(?:$atom|$quoted_string)"; my $localpart = "$word(?:\\.$rfc822_lwsp*$word)*"; my $sub_domain = "(?:$atom|$domain_literal)"; my $domain = "$sub_domain(?:\\.$rfc822_lwsp*$sub_domain)*"; my $addr_spec = "$localpart\@$rfc822_lwsp*$domain"; my $phrase = "$word*"; my $route = "(?:\@$domain(?:,\@$rfc822_lwsp*$domain)*:$rfc822_lwsp*)"; my $route_addr = "\\<$rfc822_lwsp*$route?$addr_spec\\>$rfc822_lwsp*"; my $mailbox = "(?:$addr_spec|$phrase$route_addr)"; my $group = "$phrase:$rfc822_lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*"; my $address = "(?:$mailbox|$group)"; return "$rfc822_lwsp*$address"; } sub rfc822_strip_comments { my $s = shift; # Recursively remove comments, and replace with a single space. The simpler # regexps in the Email Addressing FAQ are imperfect - they will miss escaped # chars in atoms, for example. while ($s =~ s/^((?:[^"\\]|\\.)* (?:"(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*)*) \((?:[^()\\]|\\.)*\)/$1 /osx) {} return $s; } # valid: returns true if the parameter is an RFC822 valid address # sub rfc822_valid ($) { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } return $s =~ m/^$rfc822re$/so && $s =~ m/^$rfc822_char*$/; } # validlist: In scalar context, returns true if the parameter is an RFC822 # valid list of addresses. # # In list context, returns an empty list on failure (an invalid # address was found); otherwise a list whose first element is the # number of addresses found and whose remaining elements are the # addresses. This is needed to disambiguate failure (invalid) # from success with no addresses found, because an empty string is # a valid list. sub rfc822_validlist ($) { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } # * null list items are valid according to the RFC # * the '1' business is to aid in distinguishing failure from no results my @r; if ($s =~ m/^(?:$rfc822re)?(?:,(?:$rfc822re)?)*$/so && $s =~ m/^$rfc822_char*$/) { while($s =~ m/(?:^|,$rfc822_lwsp*)($rfc822re)/gos) { push @r, $1; } return wantarray ? (scalar(@r), @r) : 1; } else { return wantarray ? () : 0; } } Loading
scripts/get_maintainer.pl +129 −16 Original line number Diff line number Diff line Loading @@ -55,6 +55,10 @@ foreach my $chief (@penguin_chief) { } my $penguin_chiefs = "\(" . join("|",@penguin_chief_names) . "\)"; # rfc822 - preloaded methods go here. my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])"; my $rfc822_char = '[\\000-\\177]'; if (!GetOptions( 'email!' => \$email, 'git!' => \$email_git, Loading Loading @@ -392,18 +396,7 @@ sub add_categories { } } elsif ($ptype eq "M") { if ($email_maintainer) { if ($index >= 0) { my $tv = $typevalue[$index - 1]; if ($tv =~ m/^(\C):\s*(.*)/) { if ($1 eq "P" && $email_usename) { push(@email_to, format_email($2, $pvalue)); } else { push(@email_to, $pvalue); } } } else { push(@email_to, $pvalue); } push_email_addresses($pvalue); } } elsif ($ptype eq "T") { push(@scm, $pvalue); Loading @@ -421,6 +414,36 @@ sub add_categories { } } sub push_email_address { my ($email_address) = @_; my $email_name = ""; if ($email_address =~ m/([^<]+)<(.*\@.*)>$/) { $email_name = $1; $email_address = $2; } if ($email_usename && $email_name) { push(@email_to, format_email($email_name, $email_address)); } else { push(@email_to, $email_address); } } sub push_email_addresses { my ($address) = @_; my @address_list = (); if (@address_list = rfc822_validlist($address)) { my $array_count = shift(@address_list); while (my $entry = shift(@address_list)) { push_email_address($entry); } } } sub which { my ($bin) = @_; Loading Loading @@ -480,10 +503,6 @@ sub recent_git_signoffs { if ($line =~ m/(.+)<(.+)>/) { my $git_name = $1; my $git_addr = $2; $git_name =~ tr/^\"//; $git_name =~ tr/^\\s*//; $git_name =~ tr/\"$//; $git_name =~ tr/\\s*$//; if ($email_usename) { push(@email_to, format_email($git_name, $git_addr)); } else { Loading Loading @@ -527,3 +546,97 @@ sub output { print("\n"); } } my $rfc822re; sub make_rfc822re { # Basic lexical tokens are specials, domain_literal, quoted_string, atom, and # comment. We must allow for rfc822_lwsp (or comments) after each of these. # This regexp will only work on addresses which have had comments stripped # and replaced with rfc822_lwsp. my $specials = '()<>@,;:\\\\".\\[\\]'; my $controls = '\\000-\\037\\177'; my $dtext = "[^\\[\\]\\r\\\\]"; my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$rfc822_lwsp*"; my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$rfc822_lwsp)*\"$rfc822_lwsp*"; # Use zero-width assertion to spot the limit of an atom. A simple # $rfc822_lwsp* causes the regexp engine to hang occasionally. my $atom = "[^$specials $controls]+(?:$rfc822_lwsp+|\\Z|(?=[\\[\"$specials]))"; my $word = "(?:$atom|$quoted_string)"; my $localpart = "$word(?:\\.$rfc822_lwsp*$word)*"; my $sub_domain = "(?:$atom|$domain_literal)"; my $domain = "$sub_domain(?:\\.$rfc822_lwsp*$sub_domain)*"; my $addr_spec = "$localpart\@$rfc822_lwsp*$domain"; my $phrase = "$word*"; my $route = "(?:\@$domain(?:,\@$rfc822_lwsp*$domain)*:$rfc822_lwsp*)"; my $route_addr = "\\<$rfc822_lwsp*$route?$addr_spec\\>$rfc822_lwsp*"; my $mailbox = "(?:$addr_spec|$phrase$route_addr)"; my $group = "$phrase:$rfc822_lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*"; my $address = "(?:$mailbox|$group)"; return "$rfc822_lwsp*$address"; } sub rfc822_strip_comments { my $s = shift; # Recursively remove comments, and replace with a single space. The simpler # regexps in the Email Addressing FAQ are imperfect - they will miss escaped # chars in atoms, for example. while ($s =~ s/^((?:[^"\\]|\\.)* (?:"(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*)*) \((?:[^()\\]|\\.)*\)/$1 /osx) {} return $s; } # valid: returns true if the parameter is an RFC822 valid address # sub rfc822_valid ($) { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } return $s =~ m/^$rfc822re$/so && $s =~ m/^$rfc822_char*$/; } # validlist: In scalar context, returns true if the parameter is an RFC822 # valid list of addresses. # # In list context, returns an empty list on failure (an invalid # address was found); otherwise a list whose first element is the # number of addresses found and whose remaining elements are the # addresses. This is needed to disambiguate failure (invalid) # from success with no addresses found, because an empty string is # a valid list. sub rfc822_validlist ($) { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } # * null list items are valid according to the RFC # * the '1' business is to aid in distinguishing failure from no results my @r; if ($s =~ m/^(?:$rfc822re)?(?:,(?:$rfc822re)?)*$/so && $s =~ m/^$rfc822_char*$/) { while($s =~ m/(?:^|,$rfc822_lwsp*)($rfc822re)/gos) { push @r, $1; } return wantarray ? (scalar(@r), @r) : 1; } else { return wantarray ? () : 0; } }