Cache-Repository
view release on metacpan or search on metacpan
lib/Cache/Repository/Filesys.pm view on Meta::CPAN
my $path = $self->_dir($opts{tag});
rmtree([glob ($path . '*')]);
}
=item add_symlink
=cut
sub add_symlink
{
my $self = shift;
my %opts = @_;
return 0 unless $self->_is_filename_ok($opts{filename});
my $dir = $self->_dir($opts{tag});
my $dstfile = File::Spec->catdir($dir, $opts{filename});
mkpath(dirname($dstfile));
if (symlink($opts{target}, $dstfile))
{
$self->_add_file(%opts);
return 1;
}
undef;
}
=item add_files
=item add_filehandle
=cut
sub add_filehandle
{
my $self = shift;
my %opts = @_;
my $dir = $self->_dir($opts{tag});
return 0 unless $self->_is_filename_ok($opts{filename});
my $dstfile = File::Spec->catdir($dir, $opts{filename});
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};
( run in 0.389 second using v1.01-cache-2.11-cpan-71847e10f99 )