match: make unionmatcher a proper matcher
authorMartin von Zweigbergk <martinvonz@google.com>
Tue, 11 Jul 2017 10:46:10 -0700
changeset 33448 04be8aec44a8
parent 33447 6f4e5e5940a5
child 33449 5747967e257c
match: make unionmatcher a proper matcher unionmatcher is currently used where only a limited subset of its functions will be called. Specifically, visitdir() is never called. The next patch will pass it to dirstate.walk() where it will matter that visitdir() is correctly implemented, so let's fix that. Also add the explicitdir etc that will also be assumed by dirstate.walk() to exist on a matcher. Differential Revision: https://phab.mercurial-scm.org/D58
mercurial/match.py
--- a/mercurial/match.py	Fri Jul 07 14:39:59 2017 -0700
+++ b/mercurial/match.py	Tue Jul 11 10:46:10 2017 -0700
@@ -648,8 +648,17 @@
                 (self._path, self._matcher))
 
 class unionmatcher(basematcher):
-    """A matcher that is the union of several matchers."""
+    """A matcher that is the union of several matchers.
+
+    The non-matching-attributes (root, cwd, bad, explicitdir, traversedir) are
+    taken from the first matcher.
+    """
+
     def __init__(self, matchers):
+        m1 = matchers[0]
+        super(unionmatcher, self).__init__(m1._root, m1._cwd)
+        self.explicitdir = m1.explicitdir
+        self.traversedir = m1.traversedir
         self._matchers = matchers
 
     def matchfn(self, f):
@@ -658,6 +667,15 @@
                 return True
         return False
 
+    def visitdir(self, dir):
+        r = False
+        for m in self._matchers:
+            v = m.visitdir(dir)
+            if v == 'all':
+                return v
+            r |= v
+        return r
+
     def __repr__(self):
         return ('<unionmatcher matchers=%r>' % self._matchers)