changeset 12165:b7fbf24c8a93

match: add narrowmatcher class This class can be used to adapt an existing match object to a new match object that only cares about paths within a certain subdirectory.
author Martin Geisler <mg@lazybytes.net>
date Fri, 03 Sep 2010 12:58:51 +0200
parents 1849b6147831
children 441a74b8def1
files mercurial/match.py tests/test-doctest.py
diffstat 2 files changed, 34 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/match.py	Fri Sep 03 12:58:51 2010 +0200
+++ b/mercurial/match.py	Fri Sep 03 12:58:51 2010 +0200
@@ -110,6 +110,37 @@
     def __init__(self, root, cwd):
         match.__init__(self, root, cwd, [])
 
+class narrowmatcher(match):
+    """Adapt a matcher to work on a subdirectory only.
+
+    The paths are remapped to remove/insert the path as needed:
+
+    >>> m1 = match('root', '', ['a.txt', 'sub/b.txt'])
+    >>> m2 = narrowmatcher('sub', m1)
+    >>> bool(m2('a.txt'))
+    False
+    >>> bool(m2('b.txt'))
+    True
+    >>> bool(m2.matchfn('a.txt'))
+    False
+    >>> bool(m2.matchfn('b.txt'))
+    True
+    >>> m2.files()
+    ['b.txt']
+    >>> m2.exact('b.txt')
+    True
+    """
+
+    def __init__(self, path, matcher):
+        self._path = path
+        self._matcher = matcher
+
+        self._files = [f[len(path) + 1:] for f in matcher._files
+                       if f.startswith(path + "/")]
+        self._anypats = matcher._anypats
+        self.matchfn = lambda fn: matcher.matchfn(self._path + "/" + fn)
+        self._fmap = set(self._files)
+
 def patkind(pat):
     return _patsplit(pat, None)[0]
 
--- a/tests/test-doctest.py	Fri Sep 03 12:58:51 2010 +0200
+++ b/tests/test-doctest.py	Fri Sep 03 12:58:51 2010 +0200
@@ -15,6 +15,9 @@
 import mercurial.util
 doctest.testmod(mercurial.util)
 
+import mercurial.match
+doctest.testmod(mercurial.match)
+
 import mercurial.dagparser
 doctest.testmod(mercurial.dagparser, optionflags=doctest.NORMALIZE_WHITESPACE)