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