mercurial/revset.py
branchstable
changeset 35816 f6ca1e11d8b4
parent 35673 134ef400cb11
child 35892 00a56c83ab64
--- a/mercurial/revset.py	Wed Jan 31 23:01:44 2018 -0500
+++ b/mercurial/revset.py	Sun Jan 28 14:08:59 2018 -0500
@@ -1065,7 +1065,9 @@
             if rev is not None:
                 raise error.ParseError('_matchfiles expected at most one '
                                        'revision')
-            if value != '': # empty means working directory; leave rev as None
+            if value == '': # empty means working directory
+                rev = node.wdirrev
+            else:
                 rev = value
         elif prefix == 'd:':
             if default is not None:
@@ -1076,9 +1078,9 @@
             raise error.ParseError('invalid _matchfiles prefix: %s' % prefix)
     if not default:
         default = 'glob'
+    hasset = any(matchmod.patkind(p) == 'set' for p in pats + inc + exc)
 
-    m = matchmod.match(repo.root, repo.getcwd(), pats, include=inc,
-                       exclude=exc, ctx=repo[rev], default=default)
+    mcache = [None]
 
     # This directly read the changelog data as creating changectx for all
     # revisions is quite expensive.
@@ -1089,6 +1091,14 @@
             files = repo[x].files()
         else:
             files = getfiles(x)
+
+        if not mcache[0] or (hasset and rev is None):
+            r = x if rev is None else rev
+            mcache[0] = matchmod.match(repo.root, repo.getcwd(), pats,
+                                       include=inc, exclude=exc, ctx=repo[r],
+                                       default=default)
+        m = mcache[0]
+
         for f in files:
             if m(f):
                 return True