comparison mercurial/fileset.py @ 38684:07b551a4df44

fileset: add helpers to make predicatematcher and nevermatcher These functions will be used to compose a tree of matchers from a fileset expression.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 10 Jun 2018 20:02:53 +0900
parents 5cbcbe51d38d
children 80466fd85ac9
comparison
equal deleted inserted replaced
38683:ddd2165438cd 38684:07b551a4df44
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import absolute_import 8 from __future__ import absolute_import
9 9
10 import errno
10 import re 11 import re
11 12
12 from .i18n import _ 13 from .i18n import _
13 from . import ( 14 from . import (
14 error, 15 error,
561 self._status = status 562 self._status = status
562 self._badfn = badfn 563 self._badfn = badfn
563 self._existingenabled = False 564 self._existingenabled = False
564 def status(self): 565 def status(self):
565 return self._status 566 return self._status
567
566 def matcher(self, patterns): 568 def matcher(self, patterns):
567 return self.ctx.match(patterns, badfn=self._badfn) 569 return self.ctx.match(patterns, badfn=self._badfn)
570
571 def predicate(self, predfn, predrepr=None, cache=False):
572 """Create a matcher to select files by predfn(filename)"""
573 if cache:
574 predfn = util.cachefunc(predfn)
575 repo = self.ctx.repo()
576 return matchmod.predicatematcher(repo.root, repo.getcwd(), predfn,
577 predrepr=predrepr, badfn=self._badfn)
578
579 def fpredicate(self, predfn, predrepr=None, cache=False):
580 """Create a matcher to select files by predfn(fctx) at the current
581 revision
582
583 Missing files are ignored.
584 """
585 ctx = self.ctx
586 if ctx.rev() is None:
587 def fctxpredfn(f):
588 try:
589 fctx = ctx[f]
590 except error.LookupError:
591 return False
592 try:
593 fctx.audit()
594 except error.Abort:
595 return False
596 try:
597 return predfn(fctx)
598 except (IOError, OSError) as e:
599 if e.errno in (errno.ENOENT, errno.ENOTDIR, errno.EISDIR):
600 return False
601 raise
602 else:
603 def fctxpredfn(f):
604 try:
605 fctx = ctx[f]
606 except error.LookupError:
607 return False
608 return predfn(fctx)
609 return self.predicate(fctxpredfn, predrepr=predrepr, cache=cache)
610
611 def never(self):
612 """Create a matcher to select nothing"""
613 repo = self.ctx.repo()
614 return matchmod.nevermatcher(repo.root, repo.getcwd(),
615 badfn=self._badfn)
616
568 def filter(self, files): 617 def filter(self, files):
569 return [f for f in files if f in self.subset] 618 return [f for f in files if f in self.subset]
570 def existing(self): 619 def existing(self):
571 if not self._existingenabled: 620 if not self._existingenabled:
572 raise error.ProgrammingError('unexpected existing() invocation') 621 raise error.ProgrammingError('unexpected existing() invocation')