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 )