App-MetaCPANUtils
view release on metacpan or search on metacpan
lib/App/MetaCPANUtils.pm view on Meta::CPAN
$SPEC{download_metacpan_release} = {
v => 1.1,
summary => 'Download a release to the current directory',
description => <<'_',
Uses <pm:HTTP::Tiny::Plugin> so you can customize download behavior using
e.g. `HTTP_TINY_PLUGINS` environment variable.
_
args => {
distribution => {
schema => 'perl::distname*',
req => 1,
pos => 0,
},
version => {
summary => 'If unspecified, will select the latest release',
schema => 'perl::module::release::version',
pos => 1,
},
overwrite => {
summary => 'Whether to overwrite existing downloaded file',
schema => 'true*',
cmdline_aliases => {O=>{}},
},
# XXX filename
},
examples => [
{
summary => 'Download latest release of App-orgadb distribution',
argv => [qw/App-orgadb/],
test => 0,
'x.doc.show_result' => 0,
},
{
summary => 'Download the second latest release of App-orgadb distribution',
argv => [qw/App-orgadb latest-1/],
test => 0,
'x.doc.show_result' => 0,
},
],
};
sub download_metacpan_release {
my %args = @_;
my $res = list_metacpan_releases(
distribution => $args{distribution},
fields => [qw/version date author download_url/],
);
return $res unless $res->[0] == 200;
#use DD; dd $res;
my $rels = [sort {version->parse($b->{version}) <=> version->parse($a->{version})} @{$res->[2]}];
#use DD; dd $rels;
require Module::Release::Select;
my $rel = Module::Release::Select::select_release(
{detail=>1}, $args{version}, $rels);
#use DD; dd $rel;
return [404, "Version $args{version} of distribution $args{distribution} not found in releases"] unless $rel;
my $url = $rel->{download_url};
(my $filename = $url) =~ s!.+/!!;
return [412, "File '$filename' already exists, not overwriting (use -O to overwrite)"]
if (-f $filename) && !$args{overwrite};
open my $fh, ">", $filename
or return [500, "Can't open $filename for writing: $!"];
require HTTP::Tiny::Plugin;
log_trace "Downloading %s ...", $url;
my $dlres = HTTP::Tiny::Plugin->new->get($url);
return [500, "Can't download $url: $dlres->{status} - $dlres->{reason}"]
unless $dlres->{success};
print $fh $dlres->{content};
close $fh or return [500, "Can't write $filename: $!"];
[200, "OK", undef, {
'func.filename' => $filename,
'func.url' => $url,
'func.version' => $rel->{version},
}];
}
$SPEC{diff_metacpan_releases} = {
v => 1.1,
summary => 'Diff two release tarballs',
args => {
distribution => {
schema => 'perl::distname*',
req => 1,
pos => 0,
},
version1 => {
schema => 'perl::module::release::version',
req => 1,
pos => 1,
},
version2 => {
schema => 'perl::module::release::version',
req => 1,
pos => 2,
},
},
examples => [
{
summary => 'What changed between App-orgadb 0.014 and 0.015?',
argv => [qw/App-orgadb 0.014 0.015/],
test => 0,
'x.doc.show_result' => 0,
},
{
summary => 'What changed in the latest version of App-orgadb?',
argv => [qw/App-orgadb latest-1 latest/],
test => 0,
'x.doc.show_result' => 0,
},
],
'x.envs' => {
( run in 1.625 second using v1.01-cache-2.11-cpan-39bf76dae61 )