104 lines
2.5 KiB
Perl
104 lines
2.5 KiB
Perl
#!/usr/bin/env perl
|
|
use 5.010;
|
|
use strict;
|
|
use warnings;
|
|
use File::Basename;
|
|
use Getopt::Long;
|
|
require LWP::UserAgent;
|
|
|
|
my %votemap = (
|
|
'unexamined' => 0,
|
|
'rejected' => 1,
|
|
'vote' => 4,
|
|
'picked' => 5,
|
|
);
|
|
|
|
|
|
chomp(my $git_addr = `git config --get cherrymaint.address`);
|
|
my $addr = length $git_addr ? $git_addr : 'localhost:3000';
|
|
|
|
# Usage
|
|
my $program = basename $0;
|
|
my $usage = << "HERE";
|
|
Usage: $program [--address address] [ACTION] [COMMIT]
|
|
|
|
ACTIONS: (default is 'vote' if omitted)
|
|
|
|
HERE
|
|
$usage .= join( "\n", map { " --$_" } (sort keys %votemap), 'help' );
|
|
$usage .= "\n" . << "HERE";
|
|
|
|
COMMIT: a git revision ID (SHA1 or symbolic reference like HEAD)
|
|
|
|
You must first tunnel $addr to perl5.git.perl.org:3000? E.g.
|
|
\$ ssh -C -L${\ join q{:} => reverse split /:/, $addr}:3000 perl5.git.perl.org
|
|
|
|
HERE
|
|
|
|
die $usage if grep { /^(--help|-h)$/ } @ARGV;
|
|
|
|
# Determine action
|
|
my %opt = (address => \$addr);
|
|
GetOptions( \%opt, 'address=s', keys %votemap ) or die $usage;
|
|
|
|
if ( keys(%opt) > 2 ) {
|
|
die "Error: cherrymaint takes only one action argument\n\n$usage"
|
|
}
|
|
|
|
my ($action) = grep { exists $votemap{$_} } keys %opt;
|
|
$action ||= 'vote';
|
|
|
|
# Determine commit SHA1
|
|
my $commit = shift @ARGV;
|
|
|
|
unless ( defined $commit ) {
|
|
die "Error: cherrymaint requires an explicit commit ID\n\n$usage"
|
|
}
|
|
|
|
my $short_id = qx/git rev-parse --short $commit/;
|
|
if ( $? ) {
|
|
die "Error: couldn't get git commit SHA1 from '$commit'\n";
|
|
}
|
|
chomp $short_id;
|
|
|
|
# Confirm actions
|
|
unless ( $action eq 'vote' ) {
|
|
say "Are you sure you want to mark $short_id as $action? (y/n)";
|
|
my $ans = <STDIN>;
|
|
exit 0 unless $ans =~ /^y/i;
|
|
}
|
|
|
|
# Send the action to cherrymaint
|
|
my $n = $votemap{$action};
|
|
my $url = "http://$addr/mark?commit=${short_id}&value=${n}";
|
|
|
|
my $ua = LWP::UserAgent->new(
|
|
agent => 'Porting/cherrymaint ',
|
|
timeout => 30,
|
|
env_proxy => 1,
|
|
);
|
|
|
|
my $response = $ua->get($url);
|
|
|
|
if ($response->is_success) {
|
|
say "Done.";
|
|
}
|
|
else {
|
|
die $response->status_line . << "HERE";
|
|
|
|
Have you remembered to tunnel $addr to perl5.git.perl.org:3000? E.g.
|
|
\$ ssh -C -L${\ join q{:} => reverse split /:/, $addr}:3000 perl5.git.perl.org
|
|
|
|
Or maybe you created a different tunnel? You can specify the address to use
|
|
either on the command line with --address, or by doing
|
|
\$ git config cherrymaint.address host:port
|
|
|
|
HERE
|
|
|
|
# Note that you can vote through your browser by pointing it at the local
|
|
# end of the tunnel. For example, L<http://localhost:3000/> if you went with
|
|
# the suggested default values
|
|
}
|
|
|
|
exit 0;
|