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
;
}
};
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
;
}
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'
;
print
STDERR
"[INFO] Not adding $package in $archive_file\n"
;
print
STDERR
"[INFO] Existing version $orig_ver is greater than $version\n"
;
return
;
}
}
$self
->
index
->{
$package
} = [
$version
,
$archive_file
];
}
sub
as_string {
my
(
$self
,
$opts
) =
@_
;
$opts
||= +{};
my
$simple
=
$opts
->{simple} || 0;
my
@buf
;
push
@buf
,
(
'File: 02packages.details.txt'
,
'Description: DarkPAN'
,
'Columns: package name, version, path'
,
'Intended-For: Automated fetch routines, namespace documentation.'
,
$simple
? ()
: (
"Written-By: OrePAN2 $OrePAN2::VERSION"
,
"Line-Count: @{[ scalar(keys %{$self->index}) ]}"
,
"Last-Updated: @{[ scalar localtime ]}"
,
),
q{}
,
);
for
my
$pkg
(
$self
->packages ) {
my
$entry
=
$self
->
index
->{
$pkg
};
push
@buf
,
sprintf
'%-22s %-22s %s'
,
$pkg
,
$entry
->[0] ||
'undef'
,
$entry
->[1];
}
return
join
(
"\n"
,
@buf
) .
"\n"
;
}
1;