Patchwork [3,of,6] bookmarks: make writing files out avoid ambiguity of file stat

login
register
mail settings
Submitter Katsunori FUJIWARA
Date June 2, 2016, 3:47 p.m.
Message ID <da47f1b8acc26dfba759.1464882463@feefifofum>
Download mbox | patch
Permalink /patch/15360/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - June 2, 2016, 3:47 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1464882260 -32400
#      Fri Jun 03 00:44:20 2016 +0900
# Node ID da47f1b8acc26dfba7592ee051fbdb6fb519ae2a
# Parent  1a3b8c0c2808510d887270c0f2cbb7912369008d
bookmarks: make writing files out avoid ambiguity of file stat

Cached attribute repo._bookmarks uses stat of '.hg/bookmarks' and
'.hg/bookmarks.current' files to examine validity of cached
contents. If writing these files out keeps ctime, mtime and size of
them, change is overlooked, and old contents cached before change
isn't invalidated as expected.

To avoid ambiguity of file stat, this patch writes '.hg/bookmarks' and
'.hg/bookmarks.current' files out with checkambig=True.

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

    https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan

Patch

diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -117,7 +117,8 @@  class bmstore(dict):
             rbm._writeactive()
 
         with repo.wlock():
-            file_ = repo.vfs('bookmarks', 'w', atomictemp=True)
+            file_ = repo.vfs('bookmarks', 'w', atomictemp=True,
+                             checkambig=True)
             try:
                 self._write(file_)
             except: # re-raises
@@ -131,7 +132,8 @@  class bmstore(dict):
             return
         with self._repo.wlock():
             if self._active is not None:
-                f = self._repo.vfs('bookmarks.current', 'w', atomictemp=True)
+                f = self._repo.vfs('bookmarks.current', 'w', atomictemp=True,
+                                   checkambig=True)
                 try:
                     f.write(encoding.fromlocal(self._active))
                 finally: