util/scripts: Update get_maintainer.pl to latest from linux kernel

This is version 03aed21 from linux/scripts, updated on Dec 12, 2016.

The version needs to be updated because Perl version 5.20 deprecated the
/C regex expression.  Perl version 5.24 removed it completely, so the
old version fails to run on the coreboot builders.

Change-Id: Ib97997237ca64c65d7f91d568ae4bec000804331
Signed-off-by: Martin Roth <martinroth@google.com>
Reviewed-on: https://review.coreboot.org/18571
Tested-by: build bot (Jenkins)
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Martin Roth 2017-03-04 19:43:02 -07:00
parent 420d3a93c1
commit ae34e97ad7
1 changed files with 117 additions and 38 deletions

View File

@ -16,7 +16,9 @@ my $P = $0;
my $V = '0.26'; my $V = '0.26';
use Getopt::Long qw(:config no_auto_abbrev); use Getopt::Long qw(:config no_auto_abbrev);
use Cwd;
my $cur_path = fastgetcwd() . '/';
my $lk_path = "./"; my $lk_path = "./";
my $email = 1; my $email = 1;
my $email_usename = 1; my $email_usename = 1;
@ -42,10 +44,12 @@ my $output_multiline = 1;
my $output_separator = ", "; my $output_separator = ", ";
my $output_roles = 0; my $output_roles = 0;
my $output_rolestats = 1; my $output_rolestats = 1;
my $output_section_maxlen = 50;
my $scm = 0; my $scm = 0;
my $web = 0; my $web = 0;
my $subsystem = 0; my $subsystem = 0;
my $status = 0; my $status = 0;
my $letters = "";
my $keywords = 1; my $keywords = 1;
my $sections = 0; my $sections = 0;
my $file_emails = 0; my $file_emails = 0;
@ -130,6 +134,7 @@ my %VCS_cmds_git = (
"author_pattern" => "^GitAuthor: (.*)", "author_pattern" => "^GitAuthor: (.*)",
"subject_pattern" => "^GitSubject: (.*)", "subject_pattern" => "^GitSubject: (.*)",
"stat_pattern" => "^(\\d+)\\t(\\d+)\\t\$file\$", "stat_pattern" => "^(\\d+)\\t(\\d+)\\t\$file\$",
"file_exists_cmd" => "git ls-files \$file",
); );
my %VCS_cmds_hg = ( my %VCS_cmds_hg = (
@ -158,6 +163,7 @@ my %VCS_cmds_hg = (
"author_pattern" => "^HgAuthor: (.*)", "author_pattern" => "^HgAuthor: (.*)",
"subject_pattern" => "^HgSubject: (.*)", "subject_pattern" => "^HgSubject: (.*)",
"stat_pattern" => "^(\\d+)\t(\\d+)\t\$file\$", "stat_pattern" => "^(\\d+)\t(\\d+)\t\$file\$",
"file_exists_cmd" => "hg files \$file",
); );
my $conf = which_conf(".get_maintainer.conf"); my $conf = which_conf(".get_maintainer.conf");
@ -186,6 +192,27 @@ if (-f $conf) {
unshift(@ARGV, @conf_args) if @conf_args; unshift(@ARGV, @conf_args) if @conf_args;
} }
my @ignore_emails = ();
my $ignore_file = which_conf(".get_maintainer.ignore");
if (-f $ignore_file) {
open(my $ignore, '<', "$ignore_file")
or warn "$P: Can't find a readable .get_maintainer.ignore file $!\n";
while (<$ignore>) {
my $line = $_;
$line =~ s/\s*\n?$//;
$line =~ s/^\s*//;
$line =~ s/\s+$//;
$line =~ s/#.*$//;
next if ($line =~ m/^\s*$/);
if (rfc822_valid($line)) {
push(@ignore_emails, $line);
}
}
close($ignore);
}
if (!GetOptions( if (!GetOptions(
'email!' => \$email, 'email!' => \$email,
'git!' => \$email_git, 'git!' => \$email_git,
@ -215,6 +242,7 @@ if (!GetOptions(
'status!' => \$status, 'status!' => \$status,
'scm!' => \$scm, 'scm!' => \$scm,
'web!' => \$web, 'web!' => \$web,
'letters=s' => \$letters,
'pattern-depth=i' => \$pattern_depth, 'pattern-depth=i' => \$pattern_depth,
'k|keywords!' => \$keywords, 'k|keywords!' => \$keywords,
'sections!' => \$sections, 'sections!' => \$sections,
@ -245,7 +273,8 @@ $output_multiline = 0 if ($output_separator ne ", ");
$output_rolestats = 1 if ($interactive); $output_rolestats = 1 if ($interactive);
$output_roles = 1 if ($output_rolestats); $output_roles = 1 if ($output_rolestats);
if ($sections) { if ($sections || $letters ne "") {
$sections = 1;
$email = 0; $email = 0;
$email_list = 0; $email_list = 0;
$scm = 0; $scm = 0;
@ -270,7 +299,7 @@ if ($email &&
if (!top_of_kernel_tree($lk_path)) { if (!top_of_kernel_tree($lk_path)) {
die "$P: The current directory does not appear to be " die "$P: The current directory does not appear to be "
. "a coreboot source tree.\n"; . "a linux kernel source tree.\n";
} }
## Read MAINTAINERS for type/value pairs ## Read MAINTAINERS for type/value pairs
@ -283,7 +312,7 @@ open (my $maint, '<', "${lk_path}MAINTAINERS")
while (<$maint>) { while (<$maint>) {
my $line = $_; my $line = $_;
if ($line =~ m/^(\C):\s*(.*)/) { if ($line =~ m/^([A-Z]):\s*(.*)/) {
my $type = $1; my $type = $1;
my $value = $2; my $value = $2;
@ -406,7 +435,9 @@ foreach my $file (@ARGV) {
die "$P: file '${file}' not found\n"; die "$P: file '${file}' not found\n";
} }
} }
if ($from_filename) { if ($from_filename || ($file ne "&STDIN" && vcs_file_exists($file))) {
$file =~ s/^\Q${cur_path}\E//; #strip any absolute path
$file =~ s/^\Q${lk_path}\E//; #or the path to the lk tree
push(@files, $file); push(@files, $file);
if ($file ne "MAINTAINERS" && -f $file && ($keywords || $file_emails)) { if ($file ne "MAINTAINERS" && -f $file && ($keywords || $file_emails)) {
open(my $f, '<', $file) open(my $f, '<', $file)
@ -513,12 +544,22 @@ if ($web) {
exit($exit); exit($exit);
sub ignore_email_address {
my ($address) = @_;
foreach my $ignore (@ignore_emails) {
return 1 if ($ignore eq $address);
}
return 0;
}
sub range_is_maintained { sub range_is_maintained {
my ($start, $end) = @_; my ($start, $end) = @_;
for (my $i = $start; $i < $end; $i++) { for (my $i = $start; $i < $end; $i++) {
my $line = $typevalue[$i]; my $line = $typevalue[$i];
if ($line =~ m/^(\C):\s*(.*)/) { if ($line =~ m/^([A-Z]):\s*(.*)/) {
my $type = $1; my $type = $1;
my $value = $2; my $value = $2;
if ($type eq 'S') { if ($type eq 'S') {
@ -536,7 +577,7 @@ sub range_has_maintainer {
for (my $i = $start; $i < $end; $i++) { for (my $i = $start; $i < $end; $i++) {
my $line = $typevalue[$i]; my $line = $typevalue[$i];
if ($line =~ m/^(\C):\s*(.*)/) { if ($line =~ m/^([A-Z]):\s*(.*)/) {
my $type = $1; my $type = $1;
my $value = $2; my $value = $2;
if ($type eq 'M') { if ($type eq 'M') {
@ -585,7 +626,7 @@ sub get_maintainers {
for ($i = $start; $i < $end; $i++) { for ($i = $start; $i < $end; $i++) {
my $line = $typevalue[$i]; my $line = $typevalue[$i];
if ($line =~ m/^(\C):\s*(.*)/) { if ($line =~ m/^([A-Z]):\s*(.*)/) {
my $type = $1; my $type = $1;
my $value = $2; my $value = $2;
if ($type eq 'X') { if ($type eq 'X') {
@ -600,7 +641,7 @@ sub get_maintainers {
if (!$exclude) { if (!$exclude) {
for ($i = $start; $i < $end; $i++) { for ($i = $start; $i < $end; $i++) {
my $line = $typevalue[$i]; my $line = $typevalue[$i];
if ($line =~ m/^(\C):\s*(.*)/) { if ($line =~ m/^([A-Z]):\s*(.*)/) {
my $type = $1; my $type = $1;
my $value = $2; my $value = $2;
if ($type eq 'F') { if ($type eq 'F') {
@ -644,9 +685,11 @@ sub get_maintainers {
$line =~ s/\\\./\./g; ##Convert \. to . $line =~ s/\\\./\./g; ##Convert \. to .
$line =~ s/\.\*/\*/g; ##Convert .* to * $line =~ s/\.\*/\*/g; ##Convert .* to *
} }
$line =~ s/^([A-Z]):/$1:\t/g; my $count = $line =~ s/^([A-Z]):/$1:\t/g;
if ($letters eq "" || (!$count || $letters =~ /$1/i)) {
print("$line\n"); print("$line\n");
} }
}
print("\n"); print("\n");
} }
} }
@ -749,6 +792,7 @@ MAINTAINER field selection options:
--git-max-maintainers => maximum maintainers to add (default: $email_git_max_maintainers) --git-max-maintainers => maximum maintainers to add (default: $email_git_max_maintainers)
--git-min-percent => minimum percentage of commits required (default: $email_git_min_percent) --git-min-percent => minimum percentage of commits required (default: $email_git_min_percent)
--git-blame => use git blame to find modified commits for patch or file --git-blame => use git blame to find modified commits for patch or file
--git-blame-signatures => when used with --git-blame, also include all commit signers
--git-since => git history to use (default: $email_git_since) --git-since => git history to use (default: $email_git_since)
--hg-since => hg history to use (default: $email_hg_since) --hg-since => hg history to use (default: $email_hg_since)
--interactive => display a menu (mostly useful if used with the --git option) --interactive => display a menu (mostly useful if used with the --git option)
@ -775,12 +819,13 @@ Other options:
--pattern-depth => Number of pattern directory traversals (default: 0 (all)) --pattern-depth => Number of pattern directory traversals (default: 0 (all))
--keywords => scan patch for keywords (default: $keywords) --keywords => scan patch for keywords (default: $keywords)
--sections => print all of the subsystem sections with pattern matches --sections => print all of the subsystem sections with pattern matches
--letters => print all matching 'letter' types from all matching sections
--mailmap => use .mailmap file (default: $email_use_mailmap) --mailmap => use .mailmap file (default: $email_use_mailmap)
--version => show version --version => show version
--help => show this help information --help => show this help information
Default options: Default options:
[--email --nogit --git-fallback --m --n --l --multiline -pattern-depth=0 [--email --nogit --git-fallback --m --r --n --l --multiline --pattern-depth=0
--remove-duplicates --rolestats] --remove-duplicates --rolestats]
Notes: Notes:
@ -812,6 +857,9 @@ Notes:
Entries in this file can be any command line argument. Entries in this file can be any command line argument.
This file is prepended to any additional command line arguments. This file is prepended to any additional command line arguments.
Multiple lines and # comments are allowed. Multiple lines and # comments are allowed.
Most options have both positive and negative forms.
The negative forms for --<foo> are --no<foo> and --no-<foo>.
EOT EOT
} }
@ -821,11 +869,22 @@ sub top_of_kernel_tree {
if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") { if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") {
$lk_path .= "/"; $lk_path .= "/";
} }
if ( (-f "${lk_path}MAINTAINERS") if ( (-f "${lk_path}COPYING")
&& (-f "${lk_path}CREDITS")
&& (-f "${lk_path}Kbuild")
&& (-f "${lk_path}MAINTAINERS")
&& (-f "${lk_path}Makefile") && (-f "${lk_path}Makefile")
&& (-f "${lk_path}README")
&& (-d "${lk_path}Documentation") && (-d "${lk_path}Documentation")
&& (-d "${lk_path}src") && (-d "${lk_path}arch")
&& (-d "${lk_path}util")) { && (-d "${lk_path}include")
&& (-d "${lk_path}drivers")
&& (-d "${lk_path}fs")
&& (-d "${lk_path}init")
&& (-d "${lk_path}ipc")
&& (-d "${lk_path}kernel")
&& (-d "${lk_path}lib")
&& (-d "${lk_path}scripts")) {
return 1; return 1;
} }
return 0; return 0;
@ -890,7 +949,7 @@ sub find_first_section {
while ($index < @typevalue) { while ($index < @typevalue) {
my $tv = $typevalue[$index]; my $tv = $typevalue[$index];
if (($tv =~ m/^(\C):\s*(.*)/)) { if (($tv =~ m/^([A-Z]):\s*(.*)/)) {
last; last;
} }
$index++; $index++;
@ -904,7 +963,7 @@ sub find_starting_index {
while ($index > 0) { while ($index > 0) {
my $tv = $typevalue[$index]; my $tv = $typevalue[$index];
if (!($tv =~ m/^(\C):\s*(.*)/)) { if (!($tv =~ m/^([A-Z]):\s*(.*)/)) {
last; last;
} }
$index--; $index--;
@ -918,7 +977,7 @@ sub find_ending_index {
while ($index < @typevalue) { while ($index < @typevalue) {
my $tv = $typevalue[$index]; my $tv = $typevalue[$index];
if (!($tv =~ m/^(\C):\s*(.*)/)) { if (!($tv =~ m/^([A-Z]):\s*(.*)/)) {
last; last;
} }
$index++; $index++;
@ -927,6 +986,20 @@ sub find_ending_index {
return $index; return $index;
} }
sub get_subsystem_name {
my ($index) = @_;
my $start = find_starting_index($index);
my $subsystem = $typevalue[$start];
if ($output_section_maxlen && length($subsystem) > $output_section_maxlen) {
$subsystem = substr($subsystem, 0, $output_section_maxlen - 3);
$subsystem =~ s/\s*$//;
$subsystem = $subsystem . "...";
}
return $subsystem;
}
sub get_maintainer_role { sub get_maintainer_role {
my ($index) = @_; my ($index) = @_;
@ -935,16 +1008,11 @@ sub get_maintainer_role {
my $end = find_ending_index($index); my $end = find_ending_index($index);
my $role = "unknown"; my $role = "unknown";
my $subsystem = $typevalue[$start]; my $subsystem = get_subsystem_name($index);
if (length($subsystem) > 20) {
$subsystem = substr($subsystem, 0, 17);
$subsystem =~ s/\s*$//;
$subsystem = $subsystem . "...";
}
for ($i = $start + 1; $i < $end; $i++) { for ($i = $start + 1; $i < $end; $i++) {
my $tv = $typevalue[$i]; my $tv = $typevalue[$i];
if ($tv =~ m/^(\C):\s*(.*)/) { if ($tv =~ m/^([A-Z]):\s*(.*)/) {
my $ptype = $1; my $ptype = $1;
my $pvalue = $2; my $pvalue = $2;
if ($ptype eq "S") { if ($ptype eq "S") {
@ -974,16 +1042,7 @@ sub get_maintainer_role {
sub get_list_role { sub get_list_role {
my ($index) = @_; my ($index) = @_;
my $i; my $subsystem = get_subsystem_name($index);
my $start = find_starting_index($index);
my $end = find_ending_index($index);
my $subsystem = $typevalue[$start];
if (length($subsystem) > 20) {
$subsystem = substr($subsystem, 0, 17);
$subsystem =~ s/\s*$//;
$subsystem = $subsystem . "...";
}
if ($subsystem eq "THE REST") { if ($subsystem eq "THE REST") {
$subsystem = ""; $subsystem = "";
@ -1003,7 +1062,7 @@ sub add_categories {
for ($i = $start + 1; $i < $end; $i++) { for ($i = $start + 1; $i < $end; $i++) {
my $tv = $typevalue[$i]; my $tv = $typevalue[$i];
if ($tv =~ m/^(\C):\s*(.*)/) { if ($tv =~ m/^([A-Z]):\s*(.*)/) {
my $ptype = $1; my $ptype = $1;
my $pvalue = $2; my $pvalue = $2;
if ($ptype eq "L") { if ($ptype eq "L") {
@ -1045,7 +1104,7 @@ sub add_categories {
if ($name eq "") { if ($name eq "") {
if ($i > 0) { if ($i > 0) {
my $tv = $typevalue[$i - 1]; my $tv = $typevalue[$i - 1];
if ($tv =~ m/^(\C):\s*(.*)/) { if ($tv =~ m/^([A-Z]):\s*(.*)/) {
if ($1 eq "P") { if ($1 eq "P") {
$name = $2; $name = $2;
$pvalue = format_email($name, $address, $email_usename); $pvalue = format_email($name, $address, $email_usename);
@ -1062,7 +1121,7 @@ sub add_categories {
if ($name eq "") { if ($name eq "") {
if ($i > 0) { if ($i > 0) {
my $tv = $typevalue[$i - 1]; my $tv = $typevalue[$i - 1];
if ($tv =~ m/^(\C):\s*(.*)/) { if ($tv =~ m/^([A-Z]):\s*(.*)/) {
if ($1 eq "P") { if ($1 eq "P") {
$name = $2; $name = $2;
$pvalue = format_email($name, $address, $email_usename); $pvalue = format_email($name, $address, $email_usename);
@ -1071,7 +1130,8 @@ sub add_categories {
} }
} }
if ($email_reviewer) { if ($email_reviewer) {
push_email_addresses($pvalue, 'reviewer'); my $subsystem = get_subsystem_name($i);
push_email_addresses($pvalue, "reviewer:$subsystem");
} }
} elsif ($ptype eq "T") { } elsif ($ptype eq "T") {
push(@scm, $pvalue); push(@scm, $pvalue);
@ -1857,6 +1917,7 @@ sub vcs_assign {
my $percent = $sign_offs * 100 / $divisor; my $percent = $sign_offs * 100 / $divisor;
$percent = 100 if ($percent > 100); $percent = 100 if ($percent > 100);
next if (ignore_email_address($line));
$count++; $count++;
last if ($sign_offs < $email_git_min_signatures || last if ($sign_offs < $email_git_min_signatures ||
$count > $email_git_max_maintainers || $count > $email_git_max_maintainers ||
@ -2071,6 +2132,24 @@ sub vcs_file_blame {
} }
} }
sub vcs_file_exists {
my ($file) = @_;
my $exists;
my $vcs_used = vcs_exists();
return 0 if (!$vcs_used);
my $cmd = $VCS_cmds{"file_exists_cmd"};
$cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd
$cmd .= " 2>&1";
$exists = &{$VCS_cmds{"execute_cmd"}}($cmd);
return 0 if ($? != 0);
return $exists;
}
sub uniq { sub uniq {
my (@parms) = @_; my (@parms) = @_;