/usr/local/CPAN/CPANPLUS-Shell-Default-Plugins-RT/CPANPLUS/Shell/Default/Plugins/RT.pm
package CPANPLUS::Shell::Default::Plugins::RT;
use strict;
use LWP::Simple qw[get];
use Data::Dumper;
use Params::Check qw[check];
use CPANPLUS::Error qw[error msg];
use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
use vars qw[$VERSION];
$VERSION = '0.01';
my $ListUri = 'http://rt.cpan.org/NoAuth/bugs.tsv?Dist=';
my $ShowUri = 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=';
my $Format = " [%6d] [%4s] %s\n";
my $Address = "bug-%s\@rt.cpan.org";
local $Data::Dumper::Indent = 1;
sub plugins { ( rt => 'rt' ) }
sub rt {
my $class = shift;
my $shell = shift;
my $cb = shift;
my $cmd = shift;
my $input = shift || '';
my $opts = shift || {};
my $report;
my $tmpl = {
report => { default => 0, store => \$report },
};
check( $tmpl, $opts ) or (
error( Params::Check->last_error ),
return
);
### no input? wrong usage, show help
if ( not length $input ) {
print __PACKAGE__->rt_help;
return;
}
### find the first module in the list
### also gets rid of trailing whitespace
my @list = split /\s+/, $input;
### multiple entries not supported (yet)
if( @list > 1 ) {
error(loc("Viewing multiple distributions at once is not supported"));
}
### use the frontmost instead
my $try = $list[0];
if( $try =~ /^\d+$/ ) {
error(loc("Viewing tickets not yet supported"));
return;
### fetching by name or reporting...
} else {
my $mod = $cb->module_tree( $try ) or (
error(loc("Could not find '%1' in the module tree", $try )),
return
);
### the package this module is in
my $dist = $mod->package_name;
### not reporting, just display the list
unless( $report ) {
my $url = $ListUri . $dist;
msg(loc("Fetching bug list for '%1' from '%2'", $dist, $url ));
my $content = get( $url );
### some error occurred
unless( defined $content ) {
error(loc("Failed to fetch content from '%1'", $url));
return;
}
### no bugs reported
if( not length $content ) {
print "\n", loc("No bugs reported for '%1'", $dist);
print "\n\n";
### list the bugs
} else {
print "\n", loc("Bug list for '%1':", $dist), "\n\n";
my @list =
sort { $a->[1] <=> $b->[1] }
map { [ /^\s*(\S+)\s+(\d+)\s+(.+?)\s+(\w+)\s*$/ ] }
split /\n/, $content;
for my $aref ( @list ) {
my( $link, $id, $topic, $status ) = @$aref;
printf $Format, $id, $status, $topic;
}
print "\n\n Web Url: $ShowUri$dist\n\n";
}
} else {
error(loc("Submitting reports not yet supported"));
return;
}
}
}
sub rt_help {
return loc(
" /rt Module::Name\n" .
" Retrieves the open bug reports for this module from rt.cpan.org\n".
" Viewing a specific bug ticket and reporting a bug are not yet\n" .
" supported, but will be in the future\n"
);
}
1;