App-perlbrew
view release on metacpan or search on metacpan
lib/App/perlbrew.pm view on Meta::CPAN
for (@sections) {
my ( $header, $method ) = @$_;
print "# $header\n";
my $perls = $self->$method;
# sort the keys of Perl installation (Randal to the rescue!)
my @sorted_perls = $self->sort_perl_versions( keys %$perls );
for my $available (@sorted_perls) {
my $url = $perls->{$available};
my $ctime;
for my $installed (@installed) {
my $name = $installed->{name};
my $cur = $installed->{is_current};
if ( $available eq $installed->{name} ) {
$ctime = $installed->{ctime};
last;
}
}
printf "%1s %12s %s %s\n", $ctime ? 'i' : '', $available,
(
$is_verbose
? $ctime
? "INSTALLED on $ctime via"
: 'available from '
: ''
),
( $is_verbose ? "<$url>" : '' );
}
print "\n\n";
}
return;
}
sub available_perls {
my ($self) = @_;
my %dists = ( %{ $self->available_perl_distributions } );
return $self->sort_perl_versions( keys %dists );
}
# -> Map[ NameVersion => URL ]
sub available_perl_distributions {
my ($self) = @_;
my $perls = {};
my @perllist;
# we got impatient waiting for cpan.org to get updated to show 5.28...
# So, we also fetch from metacpan for anything that looks perlish,
# and we do our own processing to filter out the development
# releases and minor versions when needed (using
# filter_perl_available)
my $json = http_get('https://fastapi.metacpan.org/v1/release/versions/perl')
or die "\nERROR: Unable to retrieve list of perls from Metacpan.\n\n";
my $decoded = decode_json($json);
for my $release ( @{ $decoded->{releases} } ) {
next
if !$release->{authorized};
push @perllist, [$release->{name}, $release->{download_url}];
}
foreach my $perl ( $self->filter_perl_available( \@perllist ) ) {
$perls->{ $perl->[0] } = $perl->[1];
}
return $perls;
}
# $perllist is an arrayref of arrayrefs. The inner arrayrefs are of the
# format: [ <perl_name>, <perl_url> ]
# perl_name = something like perl-5.28.0
# perl_url = URL the Perl is available from.
#
# If $self->{all} is true, this just returns a list of the contents of
# the list referenced by $perllist
#
# Otherwise, this looks for even middle numbers in the version and no
# suffix (like -RC1) following the URL, and returns the list of
# arrayrefs that so match
#
# If any "newest" Perl has a
sub filter_perl_available {
my ( $self, $perllist ) = @_;
if ( $self->{all} ) { return @$perllist; }
my %max_release;
foreach my $perl (@$perllist) {
my $ver = $perl->[0];
if ( $ver !~ m/^perl-5\.[0-9]*[02468]\.[0-9]+$/ ) { next; } # most likely TRIAL or RC, or a DEV release
my ( $release_line, $minor ) = $ver =~ m/^perl-5\.([0-9]+)\.([0-9]+)/;
if ( exists $max_release{$release_line} ) {
if ( $max_release{$release_line}->[0] > $minor ) { next; } # We have a newer release
}
$max_release{$release_line} = [$minor, $perl];
}
return map { $_->[1] } values %max_release;
}
sub perl_release {
my ( $self, $version ) = @_;
my $mirror = $self->cpan_mirror();
# try CPAN::Perl::Releases
my $tarballs = CPAN::Perl::Releases::perl_tarballs($version);
my $x = ( values %$tarballs )[0];
if ($x) {
my $dist_tarball = ( split( "/", $x ) )[-1];
my $dist_tarball_url = "$mirror/authors/id/$x";
return ( $dist_tarball, $dist_tarball_url );
}
# try src/5.0 symlinks, either perl-5.X or perl5.X; favor .tar.bz2 over .tar.gz
( run in 1.071 second using v1.01-cache-2.11-cpan-9581c071862 )