diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -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''' 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)