App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
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
my $cpan_url = 'https://cpan.metacpan.org/authors/id';
if ( $src =~ $pause_re )
{
my $author = $1;
my $package = $2;
$url = join(
'/',
$cpan_url,
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} );
$target->{sha256} = $json_data->{checksum_sha256};
}
if ( defined $url )
{
# if it's pause like, parse out the distibution's version name
if ( $url =~ $full_pause_re )
{
my $package = $3;
$target->{pathname} = "$1/$2/$3";
$target->{cpan_path} = "$1/$2";
$target->{filename} = $package;
# If CHKSIGS is enabled, we always want to check CHECKSUMS. If we have
# a sha256 from metacpan, CHECKSUMS will take precedence
if ( !$target->{sha256} || $App::MechaCPAN::CHKSIGS )
{
my $chk_url = $url;
$chk_url =~ s/$package$/CHECKSUMS/;
$target->{checksums_url} = $chk_url;
}
$package =~ s/ (.*) [.] ( tar[.](gz|z|bz2) | zip | tgz) $/$1/xmsi;
$target->{distvname} = $package;
}
my $src_tgz = fetch_file($url);
if ( my $checksums_url = $target->{checksums_url} )
{
my $filename = $target->{filename};
my $checksums = get_cpan_checksums( $checksums_url, $filename );
if ( defined $checksums )
{
my $cpan_path = $target->{cpan_path};
my $entry = $checksums->{$filename};
croak "No CHECKSUMS entry for $filename"
if !defined $entry;
croak "Mismatch 'cpan_path': $entry->{cpan_path} ne $cpan_path"
if $entry->{cpan_path} ne $cpan_path;
croak "Mismatch 'size': $entry->{size} != -s $src_tgz"
if $entry->{size} != -s $src_tgz;
$target->{sha256} = $entry->{sha256};
}
}
if ( $target->{sha256} )
{
$src_tgz = {
src => $src_tgz,
sha256 => $target->{sha256},
};
}
return $src_tgz;
}
croak "Cannot find $src\n";
}
sub _get_core_ver
{
my $module = shift;
my $ver = $Module::CoreList::version{$]}{$module};
undef $ver
if defined $Module::CoreList::deprecated{$]}{$module};
return $ver;
}
sub _get_mod_ver
{
my $module = shift;
return $]
if $module eq 'perl';
local $@;
my $ver = eval {
my $file = _installed_file_for_module($module);
MM->parse_version($file);
};
$ver = _get_core_ver($module)
if !defined $ver;
return $ver;
}
sub _load_meta
{
my $target = shift;
my $cache = shift;
my $my = shift;
my $prefix = $my ? 'MYMETA' : 'META';
my $meta;
foreach my $file ( "$prefix.json", "$prefix.yml" )
{
$meta = eval { CPAN::Meta->load_file($file) };
( run in 2.990 seconds using v1.01-cache-2.11-cpan-7fcb06a456a )