match: allow unioning arbitrary match functions
authorDurham Goode <durham@fb.com>
Sat, 16 May 2015 16:16:18 -0700
changeset 25239 714f612f2afc
parent 25238 5a55ad6e8e24
child 25240 a415e94fd34f
match: allow unioning arbitrary match functions A future patch will be allowing nested matchers. To support that, let's refactor _buildmatch to build a list of matchers then return True if any match. We were already doing that for filesets + regex patterns, but this way will be more generic.
mercurial/match.py
--- a/mercurial/match.py	Sat May 16 16:12:00 2015 -0700
+++ b/mercurial/match.py	Sat May 16 16:16:18 2015 -0700
@@ -479,14 +479,21 @@
 def _buildmatch(ctx, kindpats, globsuffix, listsubrepos, root):
     '''Return regexp string and a matcher function for kindpats.
     globsuffix is appended to the regexp of globs.'''
+    matchfuncs = []
+
     fset, kindpats = _expandsets(kindpats, ctx, listsubrepos)
-    if not kindpats:
-        return "", fset.__contains__
+    if fset:
+        matchfuncs.append(fset.__contains__)
 
-    regex, mf = _buildregexmatch(kindpats, globsuffix)
-    if fset:
-        return regex, lambda f: f in fset or mf(f)
-    return regex, mf
+    regex = ''
+    if kindpats:
+        regex, mf = _buildregexmatch(kindpats, globsuffix)
+        matchfuncs.append(mf)
+
+    if len(matchfuncs) == 1:
+        return regex, matchfuncs[0]
+    else:
+        return regex, lambda f: any(mf(f) for mf in matchfuncs)
 
 def _buildregexmatch(kindpats, globsuffix):
     """Build a match function from a list of kinds and kindpats,