DataStore-CAS-FS
view release on metacpan or search on metacpan
lib/DataStore/CAS/FS/Importer.pm view on Meta::CPAN
my $subdir_hint;
if (defined $hint) {
my $err;
try {
$subdir_hint= $hint->path_if_exists($attrs->{name});
$subdir_hint->resolve
if $subdir_hint;
} catch {
$err= $_;
};
$self->_handle_hint_error("Error while loading virtual path '".$hint->resolved_canonical_path.'/'.$attrs->{name}."': $err")
if defined $err;
}
$attrs->{ref}= $self->_import_directory($cas, $ent_path, $subdir_hint);
}
}
return $attrs;
}
our %_ModeToType;
# Making this a function allows other code to call it in a BEGIN block if needed
sub _build_ModeToType {
local $@;
eval { $_ModeToType{Fcntl::S_IFREG()}= 'file' };
eval { $_ModeToType{Fcntl::S_IFDIR()}= 'dir' };
eval { $_ModeToType{Fcntl::S_IFLNK()}= 'symlink' };
eval { $_ModeToType{Fcntl::S_IFBLK()}= 'blockdev' };
eval { $_ModeToType{Fcntl::S_IFCHR()}= 'chardev' };
eval { $_ModeToType{Fcntl::S_IFIFO()}= 'pipe' };
eval { $_ModeToType{Fcntl::S_IFWHT()}= 'whiteout' };
eval { $_ModeToType{Fcntl::S_IFSOCK()}= 'socket' };
}
_build_ModeToType();
sub collect_dirent_metadata {
my ($self, $path, $ent_name, $stat)= @_;
$stat ||= $self->_stat($path)
or return undef;
$ent_name= $self->_entname_from_path($path)
unless defined $ent_name;
my %attrs= (
type => ($_ModeToType{$stat->[2] & Fcntl::S_IFMT()}),
name => $ent_name,
size => $stat->[7],
modify_ts => $stat->[9],
);
if (!defined $attrs{type}) {
$self->_handle_dir_error("Type of dirent is unknown: ".($stat->[2] & Fcntl::S_IFMT()));
$attrs{type}= 'file';
}
if ($self->{flags}{collect_unix_perm}) {
$attrs{unix_mode}= ($stat->[2] & ~Fcntl::S_IFMT());
my $uid= $attrs{unix_uid}= $stat->[4];
if (my $cache= $self->unix_uid_cache) {
if (!exists $cache->{$uid}) {
my $name= getpwuid($uid);
if (!defined $name) {
$self->_handle_metadata_error("No username for UID $uid");
} elsif ($self->utf8_filenames) {
$name= DataStore::CAS::FS::InvalidUTF8->decode_utf8($name);
} else {
utf8::upgrade($name);
}
$cache->{$uid}= $name;
}
$attrs{unix_user}= $cache->{$uid}
if defined $cache->{$uid};
}
my $gid= $attrs{unix_gid}= $stat->[5];
if (my $cache= $self->unix_gid_cache) {
if (!exists $cache->{$gid}) {
my $name= getgrgid($gid);
if (!defined $name) {
$self->_handle_metadata_error("No groupname for GID $gid");
} elsif ($self->utf8_filenames) {
$name= DataStore::CAS::FS::InvalidUTF8->decode_utf8($name);
} else {
utf8::upgrade($name);
}
$cache->{$gid}= $name;
}
$attrs{unix_group}= $cache->{$gid}
if defined $cache->{$gid};
}
}
if ($self->{flags}{collect_metadata_ts}) {
$attrs{metadata_ts}= $stat->[10];
}
if ($self->{flags}{collect_access_ts}) {
$attrs{access_ts}= $stat->[8];
}
if ($self->{flags}{collect_unix_misc}) {
$attrs{unix_dev}= $stat->[0];
$attrs{unix_inode}= $stat->[1];
$attrs{unix_nlink}= $stat->[3];
$attrs{unix_blocksize}= $stat->[11];
$attrs{unix_blockcount}= $stat->[12];
}
if ($self->{flags}{collect_acl}) {
# TODO
}
if ($self->{flags}{collect_ext_attr}) {
# TODO
}
if ($attrs{type} eq 'dir') {
delete $attrs{size};
}
elsif ($attrs{type} eq 'symlink') {
$attrs{ref}= readlink $path;
}
elsif ($attrs{type} eq 'blockdev' or $attrs{type} eq 'chardev') {
$attrs{ref}= $self->_split_dev_node($stat->[6]);
}
\%attrs;
}
( run in 1.427 second using v1.01-cache-2.11-cpan-df04353d9ac )