X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=dupemerge;a=blobdiff_plain;f=dm6;h=c824c0e517832fe418d3fb8fc7cec2278d1102c4;hp=a88c83e1d17ba04a21b04fcff8762b48301a66da;hb=3a2190b200435c28a3099695ef65d0d983dcf56e;hpb=de7efbca76dfc8ca745d8dabc2f9a99d9af0e4b4 diff --git a/dm6 b/dm6 index a88c83e..c824c0e 100755 --- a/dm6 +++ b/dm6 @@ -41,7 +41,7 @@ sub usage { Usage: $0 link-dir Hashes a NUL-separated list of files on stdin into link-dir. -Version: 0.20100514 +Version: 0.20100518 USAGE } @@ -58,12 +58,15 @@ sub link_files { print STDERR "\bL"; link($from, $tmp_to) or die "link: $from -> $tmp_to: $!"; print STDERR "\bR"; - unless (rename($tmp_to, $to)) { - my $saved_bang = $!; - print STDERR "\bU"; - unlink($tmp_to) or warn "unlink: $tmp_to: $!"; # Try, possibly in vain, to clean up - die "rename: $tmp_to -> $from: $saved_bang"; - } + my $saved_bang; + $saved_bang = $! unless rename($tmp_to, $to); + + # If $to exists and is a hardlink to $tmp_to (or $from), + # rename returns success but $tmp_to still exists. + print STDERR "\bU"; + unlink($tmp_to) or warn "unlink: $tmp_to: $!" if -e $tmp_to; + + die "rename: $tmp_to -> $from: $saved_bang" if $saved_bang; print STDERR "\b"; } @@ -104,7 +107,7 @@ sub prepare_parents { return "$parent/$suffix"; } -sub name_quad { +sub name_ino { my ($int64) = @_; my $packed = pack('Q>', $int64); $packed =~ s/^\0+//os; @@ -116,11 +119,6 @@ sub name_quad { return $base64_packed; } -sub name_ino { - my ($ino) = @_; - return name_quad($ino) . 'I'; -} - # ext3 cannot handle more than 32000 links to a file. Leave some headroom. # Arguably this should be configurable, but the losses are miniscule and # the coding for option support is not. @@ -176,7 +174,7 @@ while () { $digest =~ y:/:_:; # Check link to digest - my $digest_link = prepare_parents($link_dir, "${digest}D"); + my $digest_link = prepare_parents($link_dir, $digest); print STDERR 'D'; my $digest_st = lstat($digest_link); if ($digest_st) { @@ -221,8 +219,8 @@ while () { # Garbage collection print STDERR "\nGarbage collection in '$link_dir'..."; chdir($link_dir) || die "chdir: $link_dir: $!"; -print STDERR "\nRemoving files with link count < 3..."; -system("find . -type f -links -3 -print0 | xargs -0rt rm -f") and die "system: exit status $?"; +print STDERR "\nRemoving files with link count < 3 and temporary links..."; +system('find . -type f \( -links -3 -o -name ".*" \) -print0 | xargs -0rt rm -f') and die "system: exit status $?"; print STDERR "\nRemoving empty directories..."; system("find . -type d -empty -print0 | xargs -0rt rmdir -p --ignore-fail-on-non-empty") and die "system: exit status $?"; print STDERR "\nDone.\n";