+ my $to_path = "$dir/received/$file";
+ mkbasedir $to_path;
+
+ warn "SEND $from_path -> $to_path\n";
+ unlink $to_path if -e $to_path; # FIXME why we need this?
+ $sent_files->{$to} += link $from_path, $to_path;
+ # FIXME cross-shard
+ my $md5 = $self->md5sum($data)->get( $from_dir . $file ) || warn "no md5 for $from_dir$file";
+ $self->md5sum({login => $to})->put( "/received/$file" => $md5 );
+ }
+
+ warn "SENT ",dump $sent_files;
+
+ return 0; # skip dedup
+ } elsif ( $data->{file} =~ m{^(.*/)?.sync/pending/([^/]+)$} ) {
+ my $from_dir = $1;
+ warn "PENDIG $2 from $from_dir";
+ open(my $pend, '<', $self->blob_path($data) );
+ while(<$pend>) {
+ s/[\n\r]+$//;
+
+ if ( m/^DELETED\#(.+)$/ ) {
+ my $path = $self->blob_path($data => $from_dir . $1 );
+ if ( -e $path ) {
+ warn "UNLINK $path";
+ -d $path ? rmdir $path : unlink $path || warn "ERROR: unlink $path $!";
+ next;
+ } else {
+ warn "MISSING $path to unlink";
+ next;
+ }
+ } elsif ( ! /^(MOVED|RENAMED)\#/ ) {
+ warn "skip $_\n";
+ next;
+ }
+
+ my ( undef, $from, $to ) = split(/\#/,$_,3);
+
+ my ( $from_path, $to_path ) = map {
+ my $tmp = $data;
+ $tmp->{file} = $from_dir . $_;
+ $self->blob_path($tmp);
+ } ( $from, $to );
+
+ if ( ! -e $from_path ) {
+ warn "SKIPPED $from_path: $!";
+ next;
+ }
+
+ warn "MV $from_path -> $to_path";
+ mkbasedir $to_path;
+ rename $from_path, $to_path;
+
+ my $md5 = $self->md5sum($data)->get( $from_dir . $from );
+ if ( ! $md5 ) {
+ warn "ERROR: no md5sum $from_dir $from " unless $md5;
+ next;
+ }
+
+ $self->md5sum($data)->out( $from_dir . $from );
+ $self->md5sum($data)->put( $from_dir . $to => $md5 );
+ $self->md5sum_close($data);
+
+ warn "$md5 moved to $from_dir $to";
+ }
+
+ return 0; # skip dedup
+ }
+
+=cut
+
+ if ( $data->{file} =~ m{^(.*/)?.sync/} ) {
+ # ignore .sync/ files from client
+ return 0;
+ }
+
+ #return $file->{size} > 4096 ? 1 : 0; # FIXME
+ return 1; # dedup