[PATCH 4 of 9] add filteropener abstraction for store openers

Dan Villiom Podlaski Christiansen danchr at gmail.com
Sun Dec 26 05:51:20 CST 2010


# HG changeset patch
# User Dan Villiom Podlaski Christiansen <danchr at gmail.com>
# Date 1293279582 -3600
# Node ID 43f605f94f8570b15d768a58179dd43620520a4c
# Parent  39338cacd4f04935cd7f2d1b5639fd7ce8ca71a6
add filteropener abstraction for store openers

diff --git a/mercurial/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -175,7 +175,7 @@ class basicstore(object):
         self.createmode = _calcmode(path)
         op = opener(self.path)
         op.createmode = self.createmode
-        self.opener = lambda f, *args, **kw: op(encodedir(f), *args, **kw)
+        self.opener = util.filteropener(op, encodedir)
 
     def join(self, f):
         return self.pathjoiner(self.path, encodedir(f))
@@ -220,7 +220,7 @@ class encodedstore(basicstore):
         self.createmode = _calcmode(self.path)
         op = opener(self.path)
         op.createmode = self.createmode
-        self.opener = lambda f, *args, **kw: op(encodefilename(f), *args, **kw)
+        self.opener = util.filteropener(op, encodefilename)
 
     def datafiles(self):
         for a, b, size in self._walk('data', True):
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -943,6 +943,16 @@ class opener(object):
             f.close()
             self._fixfilemode(dst)
 
+class filteropener(object):
+    '''Wrapper opener for filtering filenames with a function.'''
+
+    def __init__(self, opener, filter):
+        self._filter = filter
+        self._orig = opener
+
+    def __call__(self, path, *args, **kwargs):
+        return self.orig(self._filter(path), *args, **kwargs)
+
 class chunkbuffer(object):
     """Allow arbitrary sized chunks of data to be efficiently read from an
     iterator over chunks of arbitrary size."""


More information about the Mercurial-devel mailing list