#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use LWP::UserAgent;
use Getopt::Long;
use Pod::Usage;
use Digest::SHA1 qw /sha1_hex/;
my %opt = (
);
GetOptions(
'review-num|review|r=i' => \$opt{review_num},
'diff-num|diff|d=i' => \$opt{diff_num},
'help|?' => \$opt{help},
man => \$opt{man}
) or pod2usage(2);
pod2usage(1) if ($opt{help});
if (not defined $opt{review_num}) {
print STDERR "$0: Error: review number (-r) is required\n";
pod2usage(2);
}
pod2usage(-exitstatus => 0, -verbose => 2) if $opt{man};
my $reviewboard_server ="reviewboard.asterisk.org";
my $base_url="https://reviewboard.asterisk.org";
my $diff_num;
my $diff_num_str = "";
if (defined $opt{diff_num}) {
$diff_num = $opt{diff_num};
print STDERR "$diff_num\n";
$diff_num_str = "/$diff_num";
exit 1;
}
my $review_num = $opt{review_num};
my $review_url = "$base_url/r/$review_num";
my $diff_page_url = "$review_url/diff$diff_num_str";
my $diff_url = "$diff_page_url/raw";
my $content = get($diff_page_url);
die "$0: Failed to get reviewboard page $diff_page_url\n" unless defined $content;
# Simple lines-based parsing will do hor now
my @page = split(/\n/, $content);
$content =~ m{
([^<]*)
};
my $summary = $1;
$content =~ m{([^<]*)};
my ($user_name, $full_name) = ($1, $2);
$content =~ m{([^<]*)};
my $branch = $1;
$content =~ m{var gRevision = '(\d+)';};
$diff_num = $1;
my $ua = LWP::UserAgent->new;
my $response = $ua->get($diff_url);
#my $raw_diff = get($diff_url);
die "$0: Failed to get raw diff $diff_url".($response->status_live)."\n"
unless $response->is_success;
my $raw_diff = $response->content;
my $date = $response->header('Date');
my $checksum = sha1_hex("${review_num}::${diff_num}::${user_name}::${date}");
#my @head = head($diff_page_url);
##my $date = $head[2];
#my $date = join '>|<', @head;
# Fix patch-level from -p0 to -p1
# Alternatively you could use git-am -p0
$raw_diff =~ m{\n--- [^\n]*\s\(revision (\d+)\)};
my $revision = $1;
$raw_diff =~ s{\n--- } {$&a/}g;
$raw_diff =~ s{\n\+\+\+ }{$&b/}g;
print
"From $checksum $date
From: $full_name <$user_name\@$reviewboard_server>
Date: $date
Subject: [PATCH] $summary
Review: $review_num
Diff: $diff_num
Svn-Branch: $branch
Svn-Revision: $revision
Origin: $diff_page_url
$raw_diff
--
$0
"
__END__
=head1 NAME
rb-patch
=head1 SYNOPSIS
rb-patch -r I
Options:
-r --review number of reivewboard review to fetch. Required.
-d --diff number of the diff to fetch. Default: last one.
--help brief help message
--man full documentation
=head1 OPTIONS
=over
=item B<--review> I
Fetch ReviewBoard review number I. This parameter is required.
=item B<--diff> I
Fetch diff no. I rather than the last one.
=item B<--help>
Print a brief help message and exits.
=item B<--man>
Prints the manual page and exits.
=back
=head1 DESCRIPTION
This script is intended, in the long run, to convert a review-board review
to a mailbox that could be merged into a git repository through git-am(1).
At the moment, however, it only fetches latest review. Use:
git checkout -b test-branch
../asterisk-tools/rb-patch -r I >patch
git am patch
=cut