changeset 33448:04be8aec44a8

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
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 11 Jul 2017 10:46:10 -0700
parents 6f4e5e5940a5
children 5747967e257c
files mercurial/match.py
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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)