Debian-Apt-PM
view release on metacpan or search on metacpan
lib/Debian/Apt/PM.pm view on Meta::CPAN
use AptPkg::Config '$_config';
use LWP::Simple 'mirror', 'RC_OK';
use Carp 'croak';
use JSON::Util;
use CPAN::Version;
use Storable 'dclone';
use List::MoreUtils 'uniq';
use File::is;
use Debian::Apt::PM::SPc;
has 'sources' => (is => 'rw', isa => 'ArrayRef', lazy => 1, default => sub { [ glob($_[0]->cachedir.'/all.index') ] });
has '_modules_index' => (is => 'rw', isa => 'HashRef', lazy => 1, default => sub { $_[0]->_create_modules_index });
has '_apt_config' => (is => 'rw', lazy => 1, default => sub { $AptPkg::Config::_config->init; $AptPkg::Config::_config; });
has 'cachedir' => (
is => 'rw',
lazy => 1,
default => sub {
Debian::Apt::PM::SPc->cachedir
.'/apt/apt-pm/deb'
.($_[0]->repo_type eq 'deb-src' ? '-src' : '' )
}
);
has 'repo_type' => (is => 'rw', lazy => 1, default => 'deb');
has 'packages_dependencies' => (is => 'rw', lazy => 1, default => sub { $_[0]->cachedir.'/../02packages.dependencies.txt' });
has 'packages_dependencies_url'
=> (is => 'rw', lazy => 1, default => 'http://pkg-perl.alioth.debian.org/cpan2deb/CPAN/02packages.dependencies.txt.gz');
sub find {
my $self = shift;
my $module = shift;
my $min_version = shift;
die 'no modules in '.$self->repo_type." index. did you add/set apt sources.list?\n"
unless scalar keys %{$self->_modules_index()};
my $versions_info = $self->_modules_index()->{$module};
return if not $versions_info;
# clone the info
$versions_info = dclone($versions_info);
# if not min then we are done
return $versions_info
if not defined $min_version;
# sort available versions and grep smaller than requested
my @versions =
sort { CPAN::Version->vcmp($a, $b) }
keys %{$versions_info}
;
$versions_info->{'max'} = $versions_info->{$versions[-1]};
@versions = grep { not CPAN::Version->vlt($_, $min_version) } @versions;
$versions_info->{'min'} = (@versions ? $versions_info->{$versions[0]} : undef);
return $versions_info;
}
sub update {
my $self = shift;
my @existing = glob($self->cachedir.'/*.bz2');
foreach my $url ($self->_etc_apt_sources) {
my $filename = $url;
$filename =~ s/[^a-zA-Z0-9\-\.]/_/gxms;
$filename = $self->cachedir.'/'.$filename;
@existing = grep { $_ ne $filename } @existing;
if (mirror($url, $filename) == RC_OK) {
my $json_filename = $filename; $json_filename =~ s/\.bz2$/.json/;
my $content;
my $bz_content = IO::Any->slurp($filename);
bunzip2 \$bz_content => \$content or die "bunzip2 failed: $Bunzip2Error\n";
JSON::Util->encode([$self->_parse_perlpackages_content($content)], $json_filename);
}
}
# remove no longer wanted indexes
foreach my $old_filename (@existing) {
my $json_filename = $old_filename; $json_filename =~ s/\.bz2$/.json/;
unlink($old_filename, $json_filename);
}
my $index_filename = File::Spec->catfile($self->cachedir, 'all.index');
my $aptpm = Debian::Apt::PM->new(
cachedir => $self->cachedir,
sources => [ glob($self->cachedir.'/*.json') ],
);
JSON::Util->encode($aptpm->_create_modules_index, [$index_filename])
if (not -f $index_filename) or File::is->older($index_filename, glob($self->cachedir.'/*.json')) or @existing;
my $package_dependencies = $self->packages_dependencies;
if ($package_dependencies =~ m/\.gz$/) {
mirror($self->packages_dependencies_url, $package_dependencies);
}
else {
mirror($self->packages_dependencies_url, $package_dependencies.'.gz');
system('gzip', '-d', '-f', $package_dependencies.'.gz');
}
}
sub clean {
my $self = shift;
foreach my $filename (glob($self->cachedir.'/*')) {
unlink($filename) or warn 'failed to remove '.$filename."\n";
}
unlink($self->packages_dependencies);
}
sub resolve_install_depends {
my $self = shift;
my $force_all = shift;
my @modules = @_;
my @depends = (
map { $_->[1] ||= 0; $_; }
map { [ split('/', $_) ] }
@modules
);
( run in 0.792 second using v1.01-cache-2.11-cpan-5a3173703d6 )