OrePAN2
view release on metacpan or search on metacpan
lib/OrePAN2/Index.pm view on Meta::CPAN
package OrePAN2::Index;
use autodie;
use utf8;
use IO::Uncompress::Gunzip qw( $GunzipError );
use OrePAN2 ();
use version;
use OrePAN2::Logger;
use Moo;
with 'OrePAN2::Role::HasLogger';
use Types::Standard qw( HashRef );
use namespace::clean;
has index => ( is => 'ro', isa => HashRef, default => sub { +{} } );
sub load {
my ( $self, $fname ) = @_;
my $fh = do {
if ( $fname =~ /\.gz\z/ ) {
IO::Uncompress::Gunzip->new($fname)
or die "gzip failed: $GunzipError\n";
}
else {
open my $fh, '<', $fname;
$fh;
}
};
# skip headers
while (<$fh>) {
last unless /\S/;
}
while (<$fh>) {
if (/^(\S+)\s+(\S+)\s+(.*)$/) {
$self->add_index( $1, $2 eq 'undef' ? undef : $2, $3 );
}
}
close $fh;
}
sub lookup {
my ( $self, $package ) = @_;
if ( my $entry = $self->index->{$package} ) {
return @$entry;
}
return;
}
sub packages {
my ($self) = @_;
sort { lc $a cmp lc $b } keys %{ $self->index };
}
sub delete_index {
my ( $self, $package ) = @_;
delete $self->index->{$package};
return;
}
# Order of preference is last updated. So if some modules maintain the same
# version number across multiple uploads, we'll point to the module in the
# latest archive.
sub add_index {
my ( $self, $package, $version, $archive_file ) = @_;
if ( $self->index->{$package} ) {
my ($orig_ver) = @{ $self->index->{$package} };
if ( version->parse($orig_ver) > version->parse($version) ) {
$version //= 'undef';
( run in 2.952 seconds using v1.01-cache-2.11-cpan-98e64b0badf )