#!/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