[PATCH 2 of 7] scmutil: add the remappedvfs class

Angel Ezquerra angel.ezquerra at gmail.com
Tue Nov 24 18:22:26 CST 2015


# HG changeset patch
# User Angel Ezquerra <angel.ezquerra at gmail.com>
# Date 1445731304 -3600
#      Sun Oct 25 01:01:44 2015 +0100
# Node ID d7b08e9f7782fdc21663dff41149c054862276f5
# Parent  6b3bf294c85ce407f2bf2f6f18eb07a85aa3ab54
scmutil: add the remappedvfs class

The remappedvfs class is derived from the regular vfs class. It lets you
customize the vfs join.method which in turn lets you, for example, map certain
files to alternative paths.

This class will be used in follow up patches which will introduce a "full share"
mode for the share extension. It will make it possible to create a vfs object
that accesses the files on the shared repository path except for the limited set
of files that must be accessed from the share target repository.

diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -543,6 +543,30 @@
         else:
             return self.base
 
+class remappedvfs(vfs):
+    """vfs subclass that lets you customize its join function
+
+    This can be used, for example to remap files to alternative paths"""
+    def __init__(self, *args, **kwargs):
+        # This class' __init__ method adds a joinfn keyword argument on top of
+        # the regular vfs class __init__ method arguments.
+        # This new joinfn argument lets you provide a custom join function which
+        # which will be used instead of the regular vfs class join method.
+        # The custom join function can fall back to the default join method
+        # by returning None.
+        self._defaultjoinfn = super(remappedvfs, self).join
+        self._joinfn = kwargs.get('joinfn', self._defaultjoinfn)
+        # remove the joinfn argument before calling the parent's constructor
+        if 'joinfn' in kwargs:
+            del kwargs['joinfn']
+        super(remappedvfs, self).__init__(*args, **kwargs)
+
+    def join(self, path):
+        joinedpath = self._joinfn(path)
+        if joinedpath is not None:
+            return joinedpath
+        return self._defaultjoinfn(path)
+
 opener = vfs
 
 class auditvfs(object):


More information about the Mercurial-devel mailing list