revset: port extra() to support keyword arguments
This is an example to show how keyword arguments are processed.
--- a/mercurial/revset.py Sat Jun 27 17:25:01 2015 +0900
+++ b/mercurial/revset.py Sun Jun 28 22:57:33 2015 +0900
@@ -840,16 +840,19 @@
a regular expression. To match a value that actually starts with `re:`,
use the prefix `literal:`.
"""
-
- # i18n: "extra" is a keyword
- l = getargs(x, 1, 2, _('extra takes at least 1 and at most 2 arguments'))
+ args = getkwargs(x, 'extra', 'label value')
+ if 'label' not in args:
+ # i18n: "extra" is a keyword
+ raise error.ParseError(_('extra takes at least 1 argument'))
# i18n: "extra" is a keyword
- label = getstring(l[0], _('first argument to extra must be a string'))
+ label = getstring(args['label'], _('first argument to extra must be '
+ 'a string'))
value = None
- if len(l) > 1:
+ if 'value' in args:
# i18n: "extra" is a keyword
- value = getstring(l[1], _('second argument to extra must be a string'))
+ value = getstring(args['value'], _('second argument to extra must be '
+ 'a string'))
kind, value, matcher = _stringmatcher(value)
def _matchvalue(r):
--- a/tests/test-revset.t Sat Jun 27 17:25:01 2015 +0900
+++ b/tests/test-revset.t Sun Jun 28 22:57:33 2015 +0900
@@ -324,6 +324,25 @@
keyword arguments
+ $ log 'extra(branch, value=a)'
+ 0
+
+ $ log 'extra(branch, a, b)'
+ hg: parse error: extra takes at most 2 arguments
+ [255]
+ $ log 'extra(a, label=b)'
+ hg: parse error: extra got multiple values for keyword argument 'label'
+ [255]
+ $ log 'extra(label=branch, default)'
+ hg: parse error: extra got an invalid argument
+ [255]
+ $ log 'extra(branch, foo+bar=baz)'
+ hg: parse error: extra got an invalid argument
+ [255]
+ $ log 'extra(unknown=branch)'
+ hg: parse error: extra got an unexpected keyword argument 'unknown'
+ [255]
+
$ try 'foo=bar|baz'
(keyvalue
('symbol', 'foo')