| @@ -13,7 +13,7 @@ · 12 unmodified lines |
| 13 | 13 | use strict; |
| 14 | 14 | |
| 15 | 15 | my $P = $0; |
| 16 | | −my $V = '0.16'; |
| 16 | +my $V = '0.17'; |
| 17 | 17 | |
| 18 | 18 | use Getopt::Long qw(:config no_auto_abbrev); |
| 19 | 19 | |
| @@ -27,6 +27,7 @@ my $email_git = 1; · 7 unmodified lines |
| 27 | 27 | my $email_git_penguin_chiefs = 0; |
| 28 | 28 | my $email_git_min_signatures = 1; |
| 29 | 29 | my $email_git_max_maintainers = 5; |
| 30 | +my $email_git_min_percent = 5; |
| 30 | 31 | my $email_git_since = "1-year-ago"; |
| 31 | 32 | my $output_multiline = 1; |
| 32 | 33 | my $output_separator = ", "; |
| @@ -65,6 +66,7 @@ if (!GetOptions( · 32 unmodified lines |
| 65 | 66 | 'git-chief-penguins!' => \$email_git_penguin_chiefs, |
| 66 | 67 | 'git-min-signatures=i' => \$email_git_min_signatures, |
| 67 | 68 | 'git-max-maintainers=i' => \$email_git_max_maintainers, |
| 69 | + 'git-min-percent=i' => \$email_git_min_percent, |
| 68 | 70 | 'git-since=s' => \$email_git_since, |
| 69 | 71 | 'm!' => \$email_maintainer, |
| 70 | 72 | 'n!' => \$email_usename, |
| @@ -132,6 +134,10 @@ while (<MAINT>) { · 61 unmodified lines |
| 132 | 134 | $value =~ s@\.@\\\.@g; ##Convert . to \. |
| 133 | 135 | $value =~ s/\*/\.\*/g; ##Convert * to .* |
| 134 | 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 | 142 | push(@typevalue, "$type:$value"); |
| 137 | 143 | } elsif (!/^(\s)*$/) { |
| @@ -146,8 +152,10 @@ close(MAINT); · 8 unmodified lines |
| 146 | 152 | my @files = (); |
| 147 | 153 | |
| 148 | 154 | foreach my $file (@ARGV) { |
| 149 | | − next if ((-d $file)); |
| 150 | | − if (!(-f $file)) { |
| 155 | + ##if $file is a directory and it lacks a trailing slash, add one |
| 156 | + if ((-d $file)) { |
| 157 | + $file =~ s@([^/])$@$1/@; |
| 158 | + } elsif (!(-f $file)) { |
| 151 | 159 | die "$P: file '${file}' not found\n"; |
| 152 | 160 | } |
| 153 | 161 | if ($from_filename) { |
| @@ -292,7 +300,7 @@ sub file_match_pattern { · 138 unmodified lines |
| 292 | 300 | sub usage { |
| 293 | 301 | print <<EOT; |
| 294 | 302 | usage: $P [options] patchfile |
| 295 | | − $P [options] -f file |
| 303 | + $P [options] -f file|directory |
| 296 | 304 | version: $V |
| 297 | 305 | |
| 298 | 306 | MAINTAINER field selection options: |
| @@ -301,6 +309,7 @@ MAINTAINER field selection options: · 2 unmodified lines |
| 301 | 309 | --git-chief-penguins => include ${penguin_chiefs} |
| 302 | 310 | --git-min-signatures => number of signatures required (default: 1) |
| 303 | 311 | --git-max-maintainers => maximum maintainers to add (default: 5) |
| 312 | + --git-min-percent => minimum percentage of commits required (default: 5) |
| 304 | 313 | --git-since => git history to use (default: 1-year-ago) |
| 305 | 314 | --m => include maintainer(s) if any |
| 306 | 315 | --n => include name 'Full Name <addr\@domain.tld>' |
| @@ -322,6 +331,15 @@ Other options: · 15 unmodified lines |
| 322 | 331 | --version => show version |
| 323 | 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 | 343 | EOT |
| 326 | 344 | } |
| 327 | 345 | |
| @@ -482,6 +500,7 @@ sub recent_git_signoffs { · 154 unmodified lines |
| 482 | 500 | my $output = ""; |
| 483 | 501 | my $count = 0; |
| 484 | 502 | my @lines = (); |
| 503 | + my $total_sign_offs; |
| 485 | 504 | |
| 486 | 505 | if (which("git") eq "") { |
| 487 | 506 | warn("$P: git not found. Add --nogit to options?\n"); |
| @@ -505,17 +524,26 @@ sub recent_git_signoffs { · 17 unmodified lines |
| 505 | 524 | $output =~ s/^\s*//gm; |
| 506 | 525 | |
| 507 | 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 | 537 | foreach my $line (@lines) { |
| 509 | 538 | if ($line =~ m/([0-9]+)\s+(.*)/) { |
| 510 | 539 | my $sign_offs = $1; |
| 511 | 540 | $line = $2; |
| 512 | 541 | $count++; |
| 513 | 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 | 545 | last; |
| 516 | 546 | } |
| 517 | | − } else { |
| 518 | | − die("$P: Unexpected git output: ${line}\n"); |
| 519 | 547 | } |
| 520 | 548 | if ($line =~ m/(.+)<(.+)>/) { |
| 521 | 549 | my $git_name = $1; |