vfs: use checkambigatclosing in checkambig=True but atomictemp=False case
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Thu, 22 Sep 2016 21:51:57 +0900
changeset 29996 9766d88c2465
parent 29995 57830bd0e787
child 29997 b5e5ddf48bd2
vfs: use checkambigatclosing in checkambig=True but atomictemp=False case In Mercurial source tree, opening a file in "a"/"a+" mode like below doesn't specify atomictemp=True for vfs, and this avoids file stat ambiguity check by atomictempfile. - writing changes out in revlog layer uses "a+" mode - truncation in repair.strip() uses "a" mode - truncation in transaction._playback() uses "a" mode If steps below occurs at "the same time in sec", all of mtime, ctime and size are same between (1) and (3). 1. append data to revlog-style file (and close transaction) 2. discard appended data by truncation (strip or rollback) 3. append same size but different data to revlog-style file again Therefore, cache validation doesn't work after (3) as expected. This patch uses checkambigatclosing in checkambig=True but atomictemp=False case, to check (and get rid of) file stat ambiguity at closing. This is a part of ExactCacheValidationPlan. https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
mercurial/scmutil.py
--- a/mercurial/scmutil.py	Thu Sep 22 21:51:57 2016 +0900
+++ b/mercurial/scmutil.py	Thu Sep 22 21:51:57 2016 +0900
@@ -587,6 +587,12 @@
         if nlink == 0:
             self._fixfilemode(f)
 
+        if checkambig:
+            if mode in ('r', 'rb'):
+                raise error.Abort(_('implementation error: mode %s is not'
+                                    ' valid for checkambig=True') % mode)
+            fp = checkambigatclosing(fp)
+
         if backgroundclose:
             if not self._backgroundfilecloser:
                 raise error.Abort(_('backgroundclose can only be used when a '