diff: use match.intersectmatchers()
authorMartin von Zweigbergk <martinvonz@google.com>
Thu, 31 Jan 2019 16:32:54 -0800
changeset 41498 a02c8b605d31
parent 41497 3028b4073be1
child 41499 a5d8824483ba
diff: use match.intersectmatchers() Differential Revision: https://phab.mercurial-scm.org/D5789
mercurial/patch.py
--- a/mercurial/patch.py	Fri Feb 01 09:13:39 2019 -0800
+++ b/mercurial/patch.py	Thu Jan 31 16:32:54 2019 -0800
@@ -32,6 +32,7 @@
     encoding,
     error,
     mail,
+    match as matchmod,
     mdiff,
     pathutil,
     pycompat,
@@ -2319,12 +2320,9 @@
     ctx1 = repo[node1]
     ctx2 = repo[node2]
 
-    relfiltered = False
-    if relroot != '' and match.always():
-        # as a special case, create a new matcher with just the relroot
-        pats = [relroot]
-        match = scmutil.match(ctx2, pats, default='path')
-        relfiltered = True
+    if relroot:
+        relrootmatch = scmutil.match(ctx2, pats=[relroot], default='path')
+        match = matchmod.intersectmatchers(match, relrootmatch)
 
     if not changes:
         changes = ctx1.status(ctx2, match=match)
@@ -2344,16 +2342,7 @@
         if opts.git or opts.upgrade:
             copy = copies.pathcopies(ctx1, ctx2, match=match)
 
-    if relroot is not None:
-        if not relfiltered:
-            # XXX this would ideally be done in the matcher, but that is
-            # generally meant to 'or' patterns, not 'and' them. In this case we
-            # need to 'and' all the patterns from the matcher with relroot.
-            def filterrel(l):
-                return [f for f in l if f.startswith(relroot)]
-            modified = filterrel(modified)
-            added = filterrel(added)
-            removed = filterrel(removed)
+    if relroot:
         # filter out copies where either side isn't inside the relative root
         copy = dict(((dst, src) for (dst, src) in copy.iteritems()
                      if dst.startswith(relroot)