@@ -31,6 +31,7 @@ from . import (
error,
extensions,
fancyopts,
+ fileset,
hg,
hook,
revset,
@@ -753,6 +754,7 @@ def _checkshellalias(lui, ui, args, prec
# extraobj) arguments
extraloaders = [
('cmdtable', commands, 'loadcmdtable'),
+ ('filesetpredicate', fileset, 'loadpredicate'),
('revsetpredicate', revset, 'loadpredicate'),
]
@@ -560,5 +560,15 @@ def getfileset(ctx, expr):
def prettyformat(tree):
return parser.prettyformat(tree, ('string', 'symbol'))
+def loadpredicate(ui, extname, registrarobj):
+ """Load fileset predicates from specified registrarobj
+ """
+ for name, func in registrarobj._table.iteritems():
+ symbols[name] = func
+ if func._callstatus:
+ _statuscallers.add(name)
+ if func._callexisting:
+ _existingcallers.add(name)
+
# tell hggettext to extract docstrings from these functions:
i18nfunctions = symbols.values()
@@ -122,3 +122,42 @@ class revsetpredicate(_funcregistrarbase
def _extrasetup(self, name, func, safe=False):
func._safe = safe
+
+class filesetpredicate(_funcregistrarbase):
+ """Decorator to register fileset predicate
+
+ Usage::
+
+ filesetpredicate = registrar.filesetpredicate()
+
+ @filesetpredicate('mypredicate()')
+ def mypredicatefunc(mctx, x):
+ '''Explanation of this fileset predicate ....
+ '''
+ pass
+
+ The first string argument is used also in online help.
+
+ Optional argument 'callstatus' indicates whether a predicate
+ implies 'matchctx.status()' at runtime or not (False, by
+ default).
+
+ Optional argument 'callexisting' indicates whether a predicate
+ implies 'matchctx.existing()' at runtime or not (False, by
+ default).
+
+ 'filesetpredicate' instance in example above can be used to
+ decorate multiple functions.
+
+ Decorated functions are registered automatically at loading
+ extension, if an instance named as 'filesetpredicate' is used for
+ decorating in extension.
+
+ Otherwise, explicit 'fileset.loadpredicate()' is needed.
+ """
+ _getname = _funcregistrarbase._parsefuncdecl
+ _docformat = "``%s``\n %s"
+
+ def _extrasetup(self, name, func, callstatus=False, callexisting=False):
+ func._callstatus = callstatus
+ func._callexisting = callexisting
@@ -351,9 +351,10 @@ Test safety of 'encoding' on removed fil
Test detection of unintentional 'matchctx.existing()' invocation
$ cat > $TESTTMP/existingcaller.py <<EOF
- > from mercurial import fileset
+ > from mercurial import registrar
>
- > @fileset.predicate('existingcaller()', callexisting=False)
+ > filesetpredicate = registrar.filesetpredicate()
+ > @filesetpredicate('existingcaller()', callexisting=False)
> def existingcaller(mctx, x):
> # this 'mctx.existing()' invocation is unintentional
> return [f for f in mctx.existing()]