App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
my $target = shift;
my $cache = shift;
foreach my $prereq ( _target_prereqs( $target, $cache ) )
{
_target_prereqs_were_installed( $prereq, $cache );
if ( !$prereq->{prereqs_was_installed} || !$prereq->{was_installed} )
{
return $target->{prereqs_was_installed} = 0;
}
}
return $target->{prereqs_was_installed} = 1;
}
sub _search_metacpan
{
my $src = shift;
my $constraint = shift;
state %seen;
return $seen{$src}->{$constraint}
if exists $seen{$src}->{$constraint};
# TODO mirrors
my $dnld = 'https://fastapi.metacpan.org/download_url/' . _escape($src);
if ( defined $constraint )
{
$dnld .= '?version=' . _escape($constraint);
}
my $json_info = '';
fetch_file( $dnld => \$json_info );
my $result = JSON::PP::decode_json($json_info);
$seen{$src}->{$constraint} = $result;
return $result;
}
sub _get_targz
{
my $target = shift;
my $src = $target->{src_name};
if ( -e -f $src )
{
return $src;
}
my $url;
# git
if ( $src =~ git_re )
{
my $min_git_ver = min_git_ver;
croak "System has git version < $min_git_ver, cannot retrieve git URL"
unless has_updated_git;
croak "System does not have git, cannot retrieve git URL"
unless has_git;
my ( $git_url, $commit ) = $src =~ git_extract_re;
my ($descr) = $git_url =~ m{ ([^/]*) $}xms;
my $dir = humane_tmpdir($descr);
my $fh = humane_tmpfile($descr);
my $file = $fh->filename;
run( 'git', 'clone', '--bare', $git_url, $dir );
run(
$fh, 'git', 'archive', '--format=tar.gz', "--remote=$dir",
$commit || 'master'
);
close $fh;
return $fh;
}
# URL
if ( $src =~ url_re )
{
$url = $src;
}
# PAUSE
if ( $src =~ $pause_re )
{
my $author = $1;
my $package = $2;
$url = join(
'/',
'https://cpan.metacpan.org/authors/id',
substr( $author, 0, 1 ),
substr( $author, 0, 2 ),
$author,
$package,
);
$target->{is_cpan} = 1;
}
# Module Name
if ( !defined $url )
{
my $json_data = _search_metacpan( $src, $target->{constraint} );
$url = $json_data->{download_url};
$target->{is_cpan} = 1;
$target->{version} = version->parse( $json_data->{version} );
}
if ( defined $url )
{
# if it's pause like, parse out the distibution's version name
if ( $url =~ $full_pause_re )
{
my $package = $3;
( run in 0.643 second using v1.01-cache-2.11-cpan-39bf76dae61 )