Patchwork [2,of,7] scmutil: add the remappedvfs class

login
register
mail settings
Submitter Angel Ezquerra
Date Nov. 25, 2015, 12:22 a.m.
Message ID <d7b08e9f7782fdc21663.1448410946@waste.org>
Download mbox | patch
Permalink /patch/11632/
State Changes Requested
Headers show

Comments

Angel Ezquerra - Nov. 25, 2015, 12:22 a.m.
# HG changeset patch
# User Angel Ezquerra <angel.ezquerra@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.
Yuya Nishihara - Nov. 29, 2015, 2:14 p.m.
On Tue, 24 Nov 2015 18:22:26 -0600, Angel Ezquerra wrote:
> # HG changeset patch
> # User Angel Ezquerra <angel.ezquerra@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)

I think if a path is redirected to outside of self.base by joinfn(), this vfs
object can't be used. For example, _cansymlink is calculated from self.base,
auditor is created for self.base, etc.

> +    def join(self, path):
> +        joinedpath = self._joinfn(path)
> +        if joinedpath is not None:
> +            return joinedpath
> +        return self._defaultjoinfn(path)

join() accepts more than one path components.

Patch

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):