1 package CloudStore::dedup;
7 use File::Path qw(make_path);
8 use Data::Dump qw(dump);
11 my ( $path, $md5 ) = @_;
13 my $pool = 'md5'; # FIXME sharding?
14 mkdir $pool unless -e $pool;
16 if ( -e "$pool/$md5" ) {
17 warn "dedup hit $md5 $path\n";
18 my $dedup = $path . '.dedup';
20 link "$pool/$md5", $path;
23 link $path, "$pool/$md5";
30 my $deleted = CloudStore::JSON::file_data( $path );
32 my $md5_path = "md5/$deleted->{md5}";
34 my ( undef, undef, undef, $nlink ) = stat $md5_path;
36 warn "path_remove $path $nlink ",dump $deleted;
37 open(my $fh, '>>', 'var/dedup.log');
38 print $fh join(' ', $md5_path, $nlink, @_), $/;
42 my $empty_md5 = " " x 32;
47 my $blob = "users/$data->{login}/blob";
48 my $path = "$blob/$data->{file}";
52 if ( $data->{file} =~ /^(.+\/)?md5sum$/ ) {
55 warn "$path import\n";
56 open(my $md5sum, '<', $path);
59 my ( $md5, $file ) = split(/\s+/,$_,2);
60 if ( ! -e "md5/$md5" ) {
61 warn "MISSING $md5 $file\n";
64 my $new = "users/$data->{login}/blob/$dir$file";
66 # create path from md5sum file
67 my $dir = $1 if $new =~ m{^(.+)/[^/]+$};
68 make_path $dir unless -d $dir;
69 $imported += link "md5/$md5", $new;
71 path_md5 $new => $md5;
74 print "INFO: $path imported $imported files\n";
77 if ( $data->{md5} ne $empty_md5 ) {
78 path_md5 $path => $data->{md5};
80 path_remove $path, $data->{timestamp};