changeset 15963:042e84e39dee stable

fileset: don't attempt to check data predicates against removed files
author Matt Mackall <mpm@selenic.com>
date Fri, 20 Jan 2012 22:19:40 -0600
parents f7c8d6ee6056
children 6e37b8282aa2
files mercurial/fileset.py
diffstat 1 files changed, 8 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/fileset.py	Fri Jan 20 19:22:09 2012 -0600
+++ b/mercurial/fileset.py	Fri Jan 20 22:19:40 2012 -0600
@@ -199,7 +199,7 @@
     """
     # i18n: "binary" is a keyword
     getargs(x, 0, 0, _("binary takes no arguments"))
-    return [f for f in mctx.subset if util.binary(mctx.ctx[f].data())]
+    return [f for f in mctx.existing() if util.binary(mctx.ctx[f].data())]
 
 def exec_(mctx, x):
     """``exec()``
@@ -207,7 +207,7 @@
     """
     # i18n: "exec" is a keyword
     getargs(x, 0, 0, _("exec takes no arguments"))
-    return [f for f in mctx.subset if mctx.ctx.flags(f) == 'x']
+    return [f for f in mctx.existing() if mctx.ctx.flags(f) == 'x']
 
 def symlink(mctx, x):
     """``symlink()``
@@ -215,7 +215,7 @@
     """
     # i18n: "symlink" is a keyword
     getargs(x, 0, 0, _("symlink takes no arguments"))
-    return [f for f in mctx.subset if mctx.ctx.flags(f) == 'l']
+    return [f for f in mctx.existing() if mctx.ctx.flags(f) == 'l']
 
 def resolved(mctx, x):
     """``resolved()``
@@ -253,7 +253,7 @@
     """
     pat = getstring(x, _("grep requires a pattern"))
     r = re.compile(pat)
-    return [f for f in mctx.subset if r.search(mctx.ctx[f].data())]
+    return [f for f in mctx.existing() if r.search(mctx.ctx[f].data())]
 
 _units = dict(k=2**10, K=2**10, kB=2**10, KB=2**10,
               M=2**20, MB=2**20, G=2**30, GB=2**30)
@@ -320,7 +320,7 @@
     else:
         raise error.ParseError(_("couldn't parse size: %s") % expr)
 
-    return [f for f in mctx.subset if m(mctx.ctx[f].size())]
+    return [f for f in mctx.existing() if m(mctx.ctx[f].size())]
 
 def encoding(mctx, x):
     """``encoding(name)``
@@ -333,7 +333,7 @@
     enc = getstring(x, _("encoding requires an encoding name"))
 
     s = []
-    for f in mctx.subset:
+    for f in mctx.existing():
         d = mctx.ctx[f].data()
         try:
             d.decode(enc)
@@ -400,6 +400,8 @@
         return self.ctx.match(patterns)
     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)
     def narrow(self, files):
         return matchctx(self.ctx, self.filter(files), self._status)