diff mercurial/sparse.py @ 33447:6f4e5e5940a5

match: write forceincludematcher using unionmatcher The forceincludematcher is simply a unionmatcher of a includematcher (matching paths recursively) with the given matcher. Since the forceincludematcher is only used by sparse, move it there. I don't have a good sparse repo setup to test performance impact on. Differential Revision: https://phab.mercurial-scm.org/D57
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 07 Jul 2017 14:39:59 -0700
parents d5a38eae67e5
children 0407a51b9d8c
line wrap: on
line diff
--- a/mercurial/sparse.py	Wed Jul 12 13:57:03 2017 -0700
+++ b/mercurial/sparse.py	Fri Jul 07 14:39:59 2017 -0700
@@ -242,6 +242,13 @@
             'sparse checkout\n')
     repo.ui.status(msg % len(tempincludes))
 
+def forceincludematcher(matcher, includes):
+    """Returns a matcher that returns true for any of the forced includes
+    before testing against the actual matcher."""
+    kindpats = [('path', include, '') for include in includes]
+    includematcher = matchmod.includematcher('', '', kindpats)
+    return matchmod.unionmatcher([includematcher, matcher])
+
 def matcher(repo, revs=None, includetemp=True):
     """Obtain a matcher for sparse working directories for the given revs.
 
@@ -289,7 +296,7 @@
                                          include=includes, exclude=excludes,
                                          default='relpath')
                 if subdirs:
-                    matcher = matchmod.forceincludematcher(matcher, subdirs)
+                    matcher = forceincludematcher(matcher, subdirs)
                 matchers.append(matcher)
         except IOError:
             pass
@@ -303,7 +310,7 @@
 
     if includetemp:
         tempincludes = readtemporaryincludes(repo)
-        result = matchmod.forceincludematcher(result, tempincludes)
+        result = forceincludematcher(result, tempincludes)
 
     repo._sparsematchercache[key] = result