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