CPAN-Mini
view release on metacpan or search on metacpan
lib/CPAN/Mini.pm view on Meta::CPAN
}
#pod =method new
#pod
#pod my $minicpan = CPAN::Mini->new;
#pod
#pod This method constructs a new CPAN::Mini object. Its parameters are described
#pod above, under C<update_mirror>.
#pod
#pod =cut
sub new {
my $class = shift;
my %defaults = (
changes_made => 0,
dirmode => 0711, ## no critic Zero
errors => 1,
mirrored => {},
log_level => 'info',
);
my $self = bless { %defaults, @_ } => $class;
$self->{dirmode} = $defaults{dirmode} unless defined $self->{dirmode};
$self->{recent} = {};
Carp::croak "no local mirror supplied" unless $self->{local};
substr($self->{local}, 0, 1, $class->__homedir)
if substr($self->{local}, 0, 1) eq q{~};
$self->{local} = File::Spec->rel2abs($self->{local});
Carp::croak "local mirror path exists but is not a directory"
if (-e $self->{local})
and not(-d $self->{local});
unless (-e $self->{local}) {
File::Path::mkpath(
$self->{local},
{
verbose => $self->{log_level} eq 'debug',
mode => $self->{dirmode},
},
);
}
Carp::croak "no write permission to local mirror" unless -w $self->{local};
Carp::croak "no remote mirror supplied" unless $self->{remote};
$self->{remote} = "$self->{remote}/" if substr($self->{remote}, -1) ne '/';
my $version = $class->VERSION;
$version = 'v?' unless defined $version;
$self->{__lwp} = LWP::UserAgent->new(
agent => "$class/$version",
env_proxy => 1,
($self->{no_conn_cache} ? () : (keep_alive => 5)),
($self->{timeout} ? (timeout => $self->{timeout}) : ()),
);
unless ($self->{offline}) {
my $test_uri = URI->new_abs(
'modules/02packages.details.txt.gz',
$self->{remote},
)->as_string;
Carp::croak "unable to contact the remote mirror"
unless eval { $self->__lwp->head($test_uri)->is_success };
}
return $self;
}
sub __lwp { $_[0]->{__lwp} }
#pod =method mirror_indices
#pod
#pod $minicpan->mirror_indices;
#pod
#pod This method updates the index files from the CPAN.
#pod
#pod =cut
sub _fixed_mirrors {
qw(
authors/01mailrc.txt.gz
modules/02packages.details.txt.gz
modules/03modlist.data.gz
);
}
sub _scratch_dir {
my ($self) = @_;
$self->{scratch} ||= File::Temp::tempdir(CLEANUP => 1);
return $self->{scratch};
}
sub mirror_indices {
my $self = shift;
$self->_make_index_dirs($self->_scratch_dir);
for my $path ($self->_fixed_mirrors) {
my $local_file = File::Spec->catfile($self->{local}, split m{/}, $path);
my $scratch_file = File::Spec->catfile(
$self->_scratch_dir,
split(m{/}, $path),
);
File::Copy::copy($local_file, $scratch_file);
utime((stat $local_file)[ 8, 9 ], $scratch_file);
$self->mirror_file($path, undef, { to_scratch => 1 });
}
}
( run in 0.923 second using v1.01-cache-2.11-cpan-df04353d9ac )