Acme-CPANAuthors
view release on metacpan or search on metacpan
lib/Acme/CPANAuthors/Utils/Packages.pm view on Meta::CPAN
my $done_preambles = 0;
while (my $line = $handle->getline) {
$line =~ s/\r?\n$//;
unless ($done_preambles) {
if ($line =~ /^\s*$/) {
$done_preambles = 1;
}
elsif (my ($key, $value) = $line =~ /^([^:]+):\s*(.*)/) {
$key =~ tr/A-Z\-/a-z_/;
$self->{preambles}{$key} = $value;
}
next;
}
my ($package, $version, $path) = split ' ', $line;
my $dist = $self->_dist_from_path($path);
my $pkg = Acme::CPANAuthors::Utils::Packages::Package->new({
package => $package,
version => $version,
distribution => $dist,
});
push @{ $dist->{packages} ||= [] }, $pkg;
$self->{packages}{$package} = $pkg;
}
}
sub _dist_from_path {
my ($self, $path) = @_;
my $dist = $self->{dists}{$path};
return $dist if $dist;
my $info = CPAN::DistnameInfo->new($path);
$dist = Acme::CPANAuthors::Utils::Packages::Distribution->new({
prefix => $path,
dist => $info->dist,
version => $info->version,
maturity => $info->maturity,
filename => $info->filename,
cpanid => $info->cpanid,
distvname => $info->distvname,
});
$self->{dists}{$path} = $dist;
return unless defined $dist->version && $dist->dist;
# see if it's latest
my $distname = $info->dist;
my $latest = $self->{latest_dists}{$distname};
unless ($latest) {
$self->{latest_dists}{$distname} = $dist;
return $dist;
}
my ($distv, $latestv);
eval {
no warnings;
$distv = version->new( $dist->version || 0 );
$latestv = version->new( $latest->version || 0 );
};
if ($distv && $latestv) {
if ($distv > $latestv) {
$self->{latest_dists}{$distname} = $dist;
}
}
else {
no warnings;
if ($dist->version > $latest->version) {
$self->{latest_dists}{$distname} = $dist;
}
}
$dist;
}
package #
Acme::CPANAuthors::Utils::Packages::Distribution;
use strict;
use warnings;
use base 'Class::Accessor::Fast';
__PACKAGE__->mk_ro_accessors(qw/
prefix
dist
version
maturity
filename
cpanid
distvname
packages
/);
*path = *prefix;
*name = *dist;
*pauseid = *cpanid;
sub contains { @{ shift->{packages} || [] } }
package #
Acme::CPANAuthors::Utils::Packages::Package;
use strict;
use warnings;
use base 'Class::Accessor::Fast';
__PACKAGE__->mk_ro_accessors(qw/
package
version
distribution
/);
*name = *package;
1;
( run in 1.346 second using v1.01-cache-2.11-cpan-ceb78f64989 )