Skip to content
Snippets Groups Projects
Commit c2b30348 authored by Mark Thomas's avatar Mark Thomas
Browse files

dirstate: clean up when restoring identical backups

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.

Differential Revision: https://phab.mercurial-scm.org/D1201
parent 2c80a864
No related branches found
No related tags found
No related merge requests found
......@@ -1187,7 +1187,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'''
......
......@@ -11,7 +11,7 @@
abort: stdin: no diffs found
[255]
A dirstate backup is left behind
No dirstate backups are left behind
$ ls .hg/dirstate* | sort
.hg/dirstate
......@@ -15,5 +15,4 @@
$ ls .hg/dirstate* | sort
.hg/dirstate
.hg/dirstate.backup.import.* (glob)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment