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:
parent
420d3a93c1
commit
ae34e97ad7
|
@ -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,8 +685,10 @@ 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;
|
||||||
print("$line\n");
|
if ($letters eq "" || (!$count || $letters =~ /$1/i)) {
|
||||||
|
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) = @_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue