Usage: $0 link-dir
Hashes a NUL-separated list of files on stdin into link-dir.
-Version: 0.20100514
+Version: 0.20100518
USAGE
}
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";
}
# 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";