dm6: Detect when rename fails to clean up $tmp_to
[dupemerge] / dm6
diff --git a/dm6 b/dm6
index a8541ff6246d16db02a61f8461c2f49818e3cf30..8638e28c55e8d76e9772dde939a22d60af98616e 100755 (executable)
--- a/dm6
+++ b/dm6
@@ -9,7 +9,7 @@ use File::Temp;
 use File::stat;
 use MIME::Base64;
 
-# Copyright (C) 2010 Zygo Blaxell <dm5@mailtoo.hungrycats.org>
+# Copyright (C) 2010 Zygo Blaxell <dupemerge@mailtoo.hungrycats.org>
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -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 (<STDIN>) {
                        $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) {