mercurial/fileset.py
branchstable
changeset 17365 8a0513bf030a
parent 17363 5d9e2031c0b1
child 17366 04c65cb59467
--- a/mercurial/fileset.py	Wed Aug 15 18:04:50 2012 +0200
+++ b/mercurial/fileset.py	Wed Aug 15 21:44:00 2012 +0200
@@ -430,7 +430,12 @@
     def filter(self, files):
         return [f for f in files if f in self.subset]
     def existing(self):
-        return (f for f in self.subset if f in self.ctx)
+        if self._status is not None:
+            removed = set(self._status[3])
+        else:
+            removed = set()
+        return (f for f in self.subset
+                if f in self.ctx and f not in removed)
     def narrow(self, files):
         return matchctx(self.ctx, self.filter(files), self._status)
 
@@ -444,14 +449,26 @@
                 return True
     return False
 
+# filesets using matchctx.existing()
+_existingcallers = [
+    'binary',
+    'exec',
+    'grep',
+    'size',
+    'symlink',
+]
+
 def getfileset(ctx, expr):
     tree, pos = parse(expr)
     if (pos != len(expr)):
         raise error.ParseError(_("invalid token"), pos)
 
     # do we need status info?
-    if _intree(['modified', 'added', 'removed', 'deleted',
-                'unknown', 'ignored', 'clean'], tree):
+    if (_intree(['modified', 'added', 'removed', 'deleted',
+                 'unknown', 'ignored', 'clean'], tree) or
+        # Using matchctx.existing() on a workingctx requires us to check
+        # for deleted files.
+        (ctx.rev() is None and _intree(_existingcallers, tree))):
         unknown = _intree(['unknown'], tree)
         ignored = _intree(['ignored'], tree)