Mercurial > hg
changeset 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 | ddd2165438cd |
children | 80466fd85ac9 |
files | mercurial/fileset.py |
diffstat | 1 files changed, 49 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/fileset.py Sat Jul 14 13:21:49 2018 +0900 +++ b/mercurial/fileset.py Sun Jun 10 20:02:53 2018 +0900 @@ -7,6 +7,7 @@ from __future__ import absolute_import +import errno import re from .i18n import _ @@ -563,8 +564,56 @@ self._existingenabled = False def status(self): return self._status + def matcher(self, patterns): return self.ctx.match(patterns, badfn=self._badfn) + + def predicate(self, predfn, predrepr=None, cache=False): + """Create a matcher to select files by predfn(filename)""" + if cache: + predfn = util.cachefunc(predfn) + repo = self.ctx.repo() + return matchmod.predicatematcher(repo.root, repo.getcwd(), predfn, + predrepr=predrepr, badfn=self._badfn) + + def fpredicate(self, predfn, predrepr=None, cache=False): + """Create a matcher to select files by predfn(fctx) at the current + revision + + Missing files are ignored. + """ + ctx = self.ctx + if ctx.rev() is None: + def fctxpredfn(f): + try: + fctx = ctx[f] + except error.LookupError: + return False + try: + fctx.audit() + except error.Abort: + return False + try: + return predfn(fctx) + except (IOError, OSError) as e: + if e.errno in (errno.ENOENT, errno.ENOTDIR, errno.EISDIR): + return False + raise + else: + def fctxpredfn(f): + try: + fctx = ctx[f] + except error.LookupError: + return False + return predfn(fctx) + return self.predicate(fctxpredfn, predrepr=predrepr, cache=cache) + + def never(self): + """Create a matcher to select nothing""" + repo = self.ctx.repo() + return matchmod.nevermatcher(repo.root, repo.getcwd(), + badfn=self._badfn) + def filter(self, files): return [f for f in files if f in self.subset] def existing(self):