Cache-Repository
view release on metacpan or search on metacpan
lib/Cache/Repository/Filesys.pm view on Meta::CPAN
mkpath(dirname($dstfile));
#my $rc = copy($opts{filehandle}, $dstfile);
my $rc = 0;
{
local $/ = \32768;
local $_;
if (open my $dst_h, '>', $dstfile)
{
binmode $dst_h;
my $in_h = $opts{filehandle};
print $dst_h $_ while <$in_h>;
$rc = 1;
}
}
chmod $opts{mode}, $dstfile if exists $opts{mode};
chown $opts{owner}, $opts{group}, $dstfile
if exists $opts{owner} and exists $opts{group};
if ($rc)
{
$self->_add_file(%opts);
}
$rc;
}
=item retrieve_with_callback
=cut
sub retrieve_with_callback
{
my $self = shift;
my %opts = @_;
my $callback = $opts{callback};
my @files_to_extract;
my $repos_dir = $self->_dir($opts{tag});
return undef unless -d $repos_dir;
if (exists $opts{files})
{
@files_to_extract = ref $opts{files} ? @{$opts{files}} : ($opts{files});
}
else
{
@files_to_extract = $self->list_files(%opts);
}
foreach my $file (@files_to_extract)
{
my $srcname = File::Spec->catfile($repos_dir, $file);
my $s = stat($srcname);
return 0 unless $s;
my %cb_opts = (
mode => $s->mode(),
owner => $s->uid(),
group => $s->gid(),
filename => $file,
start => 1,
);
if (-l $srcname)
{
$callback->(%cb_opts, target => readlink($srcname)) or return 0;
}
else
{
my $fh = IO::File->new($srcname, 'r') or return 0;
binmode $fh;
my $buf;
while (my $r = sysread($fh, $buf, 32 * 1024))
{
$callback->(%cb_opts, data => $buf) or return 0;
delete $cb_opts{start};
}
$buf = undef;
$callback->(%cb_opts, data => undef, end => 1) or return 0;
}
}
return 1;
}
=item get_size
=cut
sub get_size
{
my $self = shift;
my %opts = @_;
my $repos_dir = $self->_dir($opts{tag});
return 0 unless -d $repos_dir;
my @files;
if (exists $opts{files})
{
@files = ref $opts{files} ? @{$opts{files}} : ($opts{files});
}
else
{
@files = $self->list_files(%opts);
}
my $size;
my $dir = $self->_dir($opts{tag});
foreach my $f (@files)
{
my $s;
my $fullname = File::Spec->catdir($dir, $f);
if (-l $fullname)
{
$s = 1024;
}
else
{
( run in 0.603 second using v1.01-cache-2.11-cpan-5735350b133 )