diff options
Diffstat (limited to 'scripts/get_maintainer.pl')
| -rwxr-xr-x | scripts/get_maintainer.pl | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 3e733146cd51..278a45bd45a5 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | use strict; | 13 | use strict; |
| 14 | 14 | ||
| 15 | my $P = $0; | 15 | my $P = $0; |
| 16 | my $V = '0.16'; | 16 | my $V = '0.17'; |
| 17 | 17 | ||
| 18 | use Getopt::Long qw(:config no_auto_abbrev); | 18 | use Getopt::Long qw(:config no_auto_abbrev); |
| 19 | 19 | ||
| @@ -27,6 +27,7 @@ my $email_git = 1; | |||
| 27 | my $email_git_penguin_chiefs = 0; | 27 | my $email_git_penguin_chiefs = 0; |
| 28 | my $email_git_min_signatures = 1; | 28 | my $email_git_min_signatures = 1; |
| 29 | my $email_git_max_maintainers = 5; | 29 | my $email_git_max_maintainers = 5; |
| 30 | my $email_git_min_percent = 5; | ||
| 30 | my $email_git_since = "1-year-ago"; | 31 | my $email_git_since = "1-year-ago"; |
| 31 | my $output_multiline = 1; | 32 | my $output_multiline = 1; |
| 32 | my $output_separator = ", "; | 33 | my $output_separator = ", "; |
| @@ -65,6 +66,7 @@ if (!GetOptions( | |||
| 65 | 'git-chief-penguins!' => \$email_git_penguin_chiefs, | 66 | 'git-chief-penguins!' => \$email_git_penguin_chiefs, |
| 66 | 'git-min-signatures=i' => \$email_git_min_signatures, | 67 | 'git-min-signatures=i' => \$email_git_min_signatures, |
| 67 | 'git-max-maintainers=i' => \$email_git_max_maintainers, | 68 | 'git-max-maintainers=i' => \$email_git_max_maintainers, |
| 69 | 'git-min-percent=i' => \$email_git_min_percent, | ||
| 68 | 'git-since=s' => \$email_git_since, | 70 | 'git-since=s' => \$email_git_since, |
| 69 | 'm!' => \$email_maintainer, | 71 | 'm!' => \$email_maintainer, |
| 70 | 'n!' => \$email_usename, | 72 | 'n!' => \$email_usename, |
| @@ -132,6 +134,10 @@ while (<MAINT>) { | |||
| 132 | $value =~ s@\.@\\\.@g; ##Convert . to \. | 134 | $value =~ s@\.@\\\.@g; ##Convert . to \. |
| 133 | $value =~ s/\*/\.\*/g; ##Convert * to .* | 135 | $value =~ s/\*/\.\*/g; ##Convert * to .* |
| 134 | $value =~ s/\?/\./g; ##Convert ? to . | 136 | $value =~ s/\?/\./g; ##Convert ? to . |
| 137 | ##if pattern is a directory and it lacks a trailing slash, add one | ||
| 138 | if ((-d $value)) { | ||
| 139 | $value =~ s@([^/])$@$1/@; | ||
| 140 | } | ||
| 135 | } | 141 | } |
| 136 | push(@typevalue, "$type:$value"); | 142 | push(@typevalue, "$type:$value"); |
| 137 | } elsif (!/^(\s)*$/) { | 143 | } elsif (!/^(\s)*$/) { |
| @@ -146,8 +152,10 @@ close(MAINT); | |||
| 146 | my @files = (); | 152 | my @files = (); |
| 147 | 153 | ||
| 148 | foreach my $file (@ARGV) { | 154 | foreach my $file (@ARGV) { |
| 149 | next if ((-d $file)); | 155 | ##if $file is a directory and it lacks a trailing slash, add one |
| 150 | if (!(-f $file)) { | 156 | if ((-d $file)) { |
| 157 | $file =~ s@([^/])$@$1/@; | ||
| 158 | } elsif (!(-f $file)) { | ||
| 151 | die "$P: file '${file}' not found\n"; | 159 | die "$P: file '${file}' not found\n"; |
| 152 | } | 160 | } |
| 153 | if ($from_filename) { | 161 | if ($from_filename) { |
| @@ -292,7 +300,7 @@ sub file_match_pattern { | |||
| 292 | sub usage { | 300 | sub usage { |
| 293 | print <<EOT; | 301 | print <<EOT; |
| 294 | usage: $P [options] patchfile | 302 | usage: $P [options] patchfile |
| 295 | $P [options] -f file | 303 | $P [options] -f file|directory |
| 296 | version: $V | 304 | version: $V |
| 297 | 305 | ||
| 298 | MAINTAINER field selection options: | 306 | MAINTAINER field selection options: |
| @@ -301,6 +309,7 @@ MAINTAINER field selection options: | |||
| 301 | --git-chief-penguins => include ${penguin_chiefs} | 309 | --git-chief-penguins => include ${penguin_chiefs} |
| 302 | --git-min-signatures => number of signatures required (default: 1) | 310 | --git-min-signatures => number of signatures required (default: 1) |
| 303 | --git-max-maintainers => maximum maintainers to add (default: 5) | 311 | --git-max-maintainers => maximum maintainers to add (default: 5) |
| 312 | --git-min-percent => minimum percentage of commits required (default: 5) | ||
| 304 | --git-since => git history to use (default: 1-year-ago) | 313 | --git-since => git history to use (default: 1-year-ago) |
| 305 | --m => include maintainer(s) if any | 314 | --m => include maintainer(s) if any |
| 306 | --n => include name 'Full Name <addr\@domain.tld>' | 315 | --n => include name 'Full Name <addr\@domain.tld>' |
| @@ -322,6 +331,15 @@ Other options: | |||
| 322 | --version => show version | 331 | --version => show version |
| 323 | --help => show this help information | 332 | --help => show this help information |
| 324 | 333 | ||
| 334 | Notes: | ||
| 335 | Using "-f directory" may give unexpected results: | ||
| 336 | |||
| 337 | Used with "--git", git signators for _all_ files in and below | ||
| 338 | directory are examined as git recurses directories. | ||
| 339 | Any specified X: (exclude) pattern matches are _not_ ignored. | ||
| 340 | Used with "--nogit", directory is used as a pattern match, | ||
| 341 | no individual file within the directory or subdirectory | ||
| 342 | is matched. | ||
| 325 | EOT | 343 | EOT |
| 326 | } | 344 | } |
| 327 | 345 | ||
| @@ -482,6 +500,7 @@ sub recent_git_signoffs { | |||
| 482 | my $output = ""; | 500 | my $output = ""; |
| 483 | my $count = 0; | 501 | my $count = 0; |
| 484 | my @lines = (); | 502 | my @lines = (); |
| 503 | my $total_sign_offs; | ||
| 485 | 504 | ||
| 486 | if (which("git") eq "") { | 505 | if (which("git") eq "") { |
| 487 | warn("$P: git not found. Add --nogit to options?\n"); | 506 | warn("$P: git not found. Add --nogit to options?\n"); |
| @@ -505,17 +524,26 @@ sub recent_git_signoffs { | |||
| 505 | $output =~ s/^\s*//gm; | 524 | $output =~ s/^\s*//gm; |
| 506 | 525 | ||
| 507 | @lines = split("\n", $output); | 526 | @lines = split("\n", $output); |
| 527 | |||
| 528 | $total_sign_offs = 0; | ||
| 529 | foreach my $line (@lines) { | ||
| 530 | if ($line =~ m/([0-9]+)\s+(.*)/) { | ||
| 531 | $total_sign_offs += $1; | ||
| 532 | } else { | ||
| 533 | die("$P: Unexpected git output: ${line}\n"); | ||
| 534 | } | ||
| 535 | } | ||
| 536 | |||
| 508 | foreach my $line (@lines) { | 537 | foreach my $line (@lines) { |
| 509 | if ($line =~ m/([0-9]+)\s+(.*)/) { | 538 | if ($line =~ m/([0-9]+)\s+(.*)/) { |
| 510 | my $sign_offs = $1; | 539 | my $sign_offs = $1; |
| 511 | $line = $2; | 540 | $line = $2; |
| 512 | $count++; | 541 | $count++; |
| 513 | if ($sign_offs < $email_git_min_signatures || | 542 | if ($sign_offs < $email_git_min_signatures || |
| 514 | $count > $email_git_max_maintainers) { | 543 | $count > $email_git_max_maintainers || |
| 544 | $sign_offs * 100 / $total_sign_offs < $email_git_min_percent) { | ||
| 515 | last; | 545 | last; |
| 516 | } | 546 | } |
| 517 | } else { | ||
| 518 | die("$P: Unexpected git output: ${line}\n"); | ||
| 519 | } | 547 | } |
| 520 | if ($line =~ m/(.+)<(.+)>/) { | 548 | if ($line =~ m/(.+)<(.+)>/) { |
| 521 | my $git_name = $1; | 549 | my $git_name = $1; |
