dirstate: make restoring from backup avoid ambiguity of file stat

File .hg/dirstate is restored by renaming from backup in failure
inside scopes below. If renaming keeps ctime, mtime and size of a
file, restoring is overlooked, and old contents cached before
restoring isn't invalidated as expected.

  - dirstateguard scope (from '.hg/dirstate.SUFFIX')
  - transaction scope (from '.hg/journal.dirstate')

To avoid ambiguity of file stat at restoring, this patch invokes
vfs.rename() with checkambig=True.

This patch is a part of "Exact Cache Validation Plan":

    https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
This commit is contained in:
FUJIWARA Katsunori 2016-06-13 05:11:56 +09:00
parent b3d7ea5cb8
commit 19907e427c

View File

@ -1243,7 +1243,8 @@ class dirstate(object):
self.invalidate()
filename = self._actualfilename(tr)
# using self._filename to avoid having "pending" in the backup filename
self._opener.rename(prefix + self._filename + suffix, filename)
self._opener.rename(prefix + self._filename + suffix, filename,
checkambig=True)
def clearbackup(self, tr, suffix='', prefix=''):
'''Clear backup file with suffix'''