[PATCH 12 of 14] vfs: add the possibility to have a "ward" to check vfs usage

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sat Jul 1 22:56:37 EDT 2017


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1470323266 -7200
#      Thu Aug 04 17:07:46 2016 +0200
# Node ID ebf81efdd6d7ff15c64683933635616c00475688
# Parent  34b8be7f0420b07d0f7b71379c6055e5b26223d5
# EXP-Topic vfs.ward
# Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
#              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r ebf81efdd6d7
vfs: add the possibility to have a "ward" to check vfs usage

The function will be called anytime we open a file. The first usage of this
'ward' will be to check that lock are properly taken before accessing file.
Later we might use it to ensure we use the right vfs to access files, allowing
more vfs to be introduced.

The feature has some similarity with the 'pathauditor', but further digging
show it make more sense to keep them separated. The path auditor is fairly
autonomous (create from vfs.__init__ without any extra information), and check
very generic details. On the other hand, the wards will have deeper knownledge
of the Mercurial logic and is created at the local repository level. Mixing the
two would add much complexity for no real gains.

We currently only apply the ward on 'open' operation. We will extend this to
other operations like copy, creation and removal later. The current readonlyvfs
seems to have the same shortcoming.

diff --git a/mercurial/vfs.py b/mercurial/vfs.py
--- a/mercurial/vfs.py
+++ b/mercurial/vfs.py
@@ -284,7 +284,7 @@ class vfs(abstractvfs):
     This class is used to hide the details of COW semantics and
     remote file access from higher level code.
     '''
-    def __init__(self, base, expandpath=False, realpath=False):
+    def __init__(self, base, expandpath=False, realpath=False, ward=None):
         if expandpath:
             base = util.expandpath(base)
         if realpath:
@@ -293,6 +293,11 @@ class vfs(abstractvfs):
         self.audit = pathutil.pathauditor(self.base)
         self.createmode = None
         self._trustnlink = None
+        # optional function to validate operation on file
+        # intended to be user for developer checks.
+        #
+        # XXX should be call for other things than 'open'
+        self._ward = ward
 
     @util.propertycache
     def _cansymlink(self):
@@ -343,6 +348,9 @@ class vfs(abstractvfs):
         if not text and "b" not in mode:
             mode += "b" # for that other OS
 
+        if self._ward is not None:
+            self._ward(f, mode, atomictemp)
+
         nlink = -1
         if mode not in ('r', 'rb'):
             dirname, basename = util.split(f)


More information about the Mercurial-devel mailing list