Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/fileset.py @ 17365:8a0513bf030a stable
fileset: exclude deleted files from matchctx.existing()
Running:
$ hg debugfileset 'binary()'
would traceback if there were one deleted file in the working directory.
It happened because matchctx.existing() was filtering files against the
ctx.__contains__() but deleted files are still considered part of
workingctx.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Wed, 15 Aug 2012 21:44:00 +0200 |
parents | 5d9e2031c0b1 |
children | 04c65cb59467 |
comparison
equal
deleted
inserted
replaced
17364:0c41fb2d972a | 17365:8a0513bf030a |
---|---|
428 def matcher(self, patterns): | 428 def matcher(self, patterns): |
429 return self.ctx.match(patterns) | 429 return self.ctx.match(patterns) |
430 def filter(self, files): | 430 def filter(self, files): |
431 return [f for f in files if f in self.subset] | 431 return [f for f in files if f in self.subset] |
432 def existing(self): | 432 def existing(self): |
433 return (f for f in self.subset if f in self.ctx) | 433 if self._status is not None: |
434 removed = set(self._status[3]) | |
435 else: | |
436 removed = set() | |
437 return (f for f in self.subset | |
438 if f in self.ctx and f not in removed) | |
434 def narrow(self, files): | 439 def narrow(self, files): |
435 return matchctx(self.ctx, self.filter(files), self._status) | 440 return matchctx(self.ctx, self.filter(files), self._status) |
436 | 441 |
437 def _intree(funcs, tree): | 442 def _intree(funcs, tree): |
438 if isinstance(tree, tuple): | 443 if isinstance(tree, tuple): |
442 for s in tree[1:]: | 447 for s in tree[1:]: |
443 if _intree(funcs, s): | 448 if _intree(funcs, s): |
444 return True | 449 return True |
445 return False | 450 return False |
446 | 451 |
452 # filesets using matchctx.existing() | |
453 _existingcallers = [ | |
454 'binary', | |
455 'exec', | |
456 'grep', | |
457 'size', | |
458 'symlink', | |
459 ] | |
460 | |
447 def getfileset(ctx, expr): | 461 def getfileset(ctx, expr): |
448 tree, pos = parse(expr) | 462 tree, pos = parse(expr) |
449 if (pos != len(expr)): | 463 if (pos != len(expr)): |
450 raise error.ParseError(_("invalid token"), pos) | 464 raise error.ParseError(_("invalid token"), pos) |
451 | 465 |
452 # do we need status info? | 466 # do we need status info? |
453 if _intree(['modified', 'added', 'removed', 'deleted', | 467 if (_intree(['modified', 'added', 'removed', 'deleted', |
454 'unknown', 'ignored', 'clean'], tree): | 468 'unknown', 'ignored', 'clean'], tree) or |
469 # Using matchctx.existing() on a workingctx requires us to check | |
470 # for deleted files. | |
471 (ctx.rev() is None and _intree(_existingcallers, tree))): | |
455 unknown = _intree(['unknown'], tree) | 472 unknown = _intree(['unknown'], tree) |
456 ignored = _intree(['ignored'], tree) | 473 ignored = _intree(['ignored'], tree) |
457 | 474 |
458 r = ctx._repo | 475 r = ctx._repo |
459 status = r.status(ctx.p1(), ctx, | 476 status = r.status(ctx.p1(), ctx, |