D1201: dirstate: clean up when restoring identical backups

mbthomas (Mark Thomas) phabricator at mercurial-scm.org
Fri Oct 20 12:57:36 UTC 2017


mbthomas created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  When a dirstate backup is restored, it is possible that no actual changes to
  the dirstate have been made.  In this case, the backup is still a hardlink
  to the original dirstate.
  
  Unfortunately, `os.rename` silently fails (nothing happens, and no error
  occurs) when `src` and `dst` are hardlinks to the same file.  As a result,
  the backup is left lying around.  Over time, these files accumulate.
  
  When restoring dirstate backups, check if the backup and the dirstate are
  the same file, and if so, just delete the backup.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1201

AFFECTED FILES
  mercurial/dirstate.py
  tests/test-dirstate-backup.t

CHANGE DETAILS

diff --git a/tests/test-dirstate-backup.t b/tests/test-dirstate-backup.t
--- a/tests/test-dirstate-backup.t
+++ b/tests/test-dirstate-backup.t
@@ -11,9 +11,8 @@
   abort: stdin: no diffs found
   [255]
 
-A dirstate backup is left behind
+No dirstate backups are left behind
 
   $ ls .hg/dirstate* | sort
   .hg/dirstate
-  .hg/dirstate.backup.import.* (glob)
 
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -1189,7 +1189,11 @@
         # changes of dirstate out after restoring from backup file
         self.invalidate()
         filename = self._actualfilename(tr)
-        self._opener.rename(backupname, filename, checkambig=True)
+        o = self._opener
+        if util.samefile(o.join(backupname), o.join(filename)):
+            o.unlink(backupname)
+        else:
+            o.rename(backupname, filename, checkambig=True)
 
     def clearbackup(self, tr, backupname):
         '''Clear backup file'''



To: mbthomas, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list