Beagle
view release on metacpan or search on metacpan
lib/Beagle/Cmd/Command/att.pm view on Meta::CPAN
die "beagle att --add --parent foo /path/to/a.txt [...]"
if $self->add && !$self->parent && !$self->info;
die "--parent and --info can't coexist" if $self->parent && $self->info;
die "beagle att --delete 3 [...]" if $self->delete && !@$args;
my @bh;
if ( $self->all ) {
@bh = values %{handles()};
}
elsif ( $self->names ) {
my $handles = handles();
my $names = to_array( $self->names );
for my $name ( @$names ) {
die "invalid name: $name" unless $handles->{$name};
push @bh, $handles->{$name};
}
}
else {
@bh = current_handle or die "please specify beagle by --name or --root";
}
if ( $self->prune ) {
my $pruned;
for my $bh (@bh) {
for my $p ( keys %{ $bh->attachments_map } ) {
unless ( $bh->map->{$p} ) {
my $dir = catdir( 'attachments', split_id($p) );
if ( -e catdir( $bh->root, $dir ) ) {
$bh->backend->delete(
undef,
path => $dir,
message => "prune $dir"
) or die "failed to delete $dir: $!";
$pruned = 1;
}
}
}
}
if ( $pruned ) {
puts 'pruned.';
}
else {
puts 'no orphans found.';
}
return;
}
my $bh;
my $pid;
if ( $self->info ) {
$bh = current_handle();
$pid = $bh->info->id;
}
elsif ( $self->parent ) {
my @ret = resolve_entry( $self->parent, handle => current_handle() || undef );
unless (@ret) {
@ret = resolve_entry($pid) or die_entry_not_found($pid);
}
die_entry_ambiguous( $pid, @ret ) unless @ret == 1;
$pid = $ret[0]->{id};
$bh = $ret[0]->{handle};
}
if ( $self->add ) {
my @added;
for my $file (@$args) {
if ( -f $file ) {
require File::Basename;
my $basename = decode_utf8 File::Basename::basename $file;
my $att = Beagle::Model::Attachment->new(
name => $basename,
content_file => $file,
parent_id => $pid,
);
if ( $bh->create_attachment( $att, message => $self->message ) ) {
push @added, $basename;
}
else {
die "failed to create attachment $file.";
}
}
else {
die "$file is not a file or doesn't exist";
}
}
if (@added) {
puts 'added ', join( ', ', @added ), '.';
}
return;
}
my %handle_map;
my @att;
if ($pid) {
my $map = $bh->attachments_map->{$pid};
@att = sort values %$map;
}
else {
for my $bh (@bh) {
$handle_map{ $bh->root } = $bh;
for my $p ( keys %{ $bh->attachments_map } ) {
warn "$p doesn't exist, use 'att --prune' to clean"
unless $bh->map->{$p};
}
for my $entry (
sort {
$bh->map->{$a}
? $bh->map->{$b}
? $bh->map->{$b}->created <=> $bh->map->{$a}->created
: -1
: 1
}
sort keys %{ $bh->attachments_map }
( run in 1.172 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )