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