blob: 4e7983e3a239680aed34f11f46db79706692d58d [file] [log] [blame]
#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Long;
sub parsing () { 1; }
sub waiting () { 2; }
my $state = parsing;
my @more;
my $append;
my $debug;
sub find_author {
my $map = shift;
for my $name (@_) {
my $fh;
print STDERR "Checking <$name>..."
if ($debug);
if (!open($fh, "-|",
qw(git log -1 --no-merges),
'--format=%an <%ae>',
"--author=$name",
"--all")) {
print STDERR "opening pipe to read from git log failed\n"
if ($debug);
$map->{$name} = $name;
next;
}
my $line = <$fh>;
if ($line) {
chomp $line;
print STDERR "read <$line> from git log\n"
if ($debug);
$map->{$name} = $line;
} else {
print STDERR "read false ($line) from git log\n"
if ($debug);
$map->{$name} = $name;
}
}
}
sub accumulate {
push @more, [@_];
}
sub add_more_bylines {
if (!defined $append) {
my %names = map { $_->[1] => 1 } @more;
my %map = ();
my @append;
find_author(\%map, keys (%names));
for (@more) {
my ($tag, $name) = @$_;
$tag = ucfirst($tag);
push @append, "$tag: $map{$name}";
}
if (@append) {
$append = join("\n", @append) . "\n";
} else {
$append = "";
}
}
print $append;
}
my $check_only;
exit 1 unless (GetOptions("signed-off-by=s" => \&accumulate,
"acked-by=s" => \&accumulate,
"reviewed-by=s" => \&accumulate,
"tested-by=s" => \&accumulate,
"helped-by=s" => \&accumulate,
"check-only!" => \$check_only,
"debug!" => \$debug,
));
if ($check_only) {
add_more_bylines();
exit 0;
}
while (<>) {
if ($state == parsing) {
if (/^[-A-Za-z]+-by: /i || /^Cc: /i) {
$state = waiting;
}
} elsif ($state == waiting) {
if (/^[-A-Za-z]+-by: /i || /^Cc: /i) {
$state = waiting;
} else {
add_more_bylines();
$state = parsing;
}
}
print;
}