| @@ -13,7 +13,7 @@ · 12 unmodified lines |
| 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; · 7 unmodified lines |
| 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( · 32 unmodified lines |
| 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>) { · 61 unmodified lines |
| 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); · 8 unmodified lines |
| 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 { · 138 unmodified lines |
| 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: · 2 unmodified lines |
| 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: · 15 unmodified lines |
| 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 { · 154 unmodified lines |
| 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 { · 17 unmodified lines |
| 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; |