[PATCH V3] templater: introduce word function

Pierre-Yves David pierre-yves.david at ens-lyon.org
Mon Jul 7 22:27:43 UTC 2014



On 07/06/2014 07:24 PM, Ryan McElroy wrote:
> # HG changeset patch
> # User Ryan McElroy <rmcelroy at fb.com>
> # Date 1402621343 25200
> #      Thu Jun 12 18:02:23 2014 -0700
> # Node ID 5efbb2b98205e1951e0a9e68bfdd8b5c226ed0c8
> # Parent  61b333b982ea7baab198a188306fc05fb2850179
> templater: introduce word function
>
> This function allows returning only the nth "word" from a string. By default
> a string is split as by Python's split() function default, but an optional
> third parameter can also override what string the string is split by.
>
> diff -r 61b333b982ea -r 5efbb2b98205 mercurial/help/templates.txt
> --- a/mercurial/help/templates.txt	Fri Jun 13 15:59:18 2014 -0700
> +++ b/mercurial/help/templates.txt	Thu Jun 12 18:02:23 2014 -0700
> @@ -72,6 +72,8 @@
>
>   - sub(pat, repl, expr)
>
> +- word(number, text[, separator])
> +
>   Also, for any expression that returns a list, there is a list operator:
>
>   - expr % "{template}"
> @@ -130,3 +132,7 @@
>   - Show only commit descriptions that start with "template"::
>
>      $ hg log --template "{startswith(\"template\", firstline(desc))}\n"
> +
> +- Print the first word of each line of a commit message::
> +
> +   $ hg log --template "{word(\"0\", desc)}\n"
> diff -r 61b333b982ea -r 5efbb2b98205 mercurial/templater.py
> --- a/mercurial/templater.py	Fri Jun 13 15:59:18 2014 -0700
> +++ b/mercurial/templater.py	Thu Jun 12 18:02:23 2014 -0700
> @@ -477,6 +477,25 @@
>       return ''
>
>
> +def word(context, mapping, args):
> +    """return nth word from a string"""
> +    if not (2 <= len(args) <= 3):
> +        raise error.ParseError(
> +                _("word expects two or three arguments, got %d" % len(args)))

1. Content should be aligned with opening bracket.
2. Substitution should be done outside the i18n
    _("bla %i") % 6

    This was friendly pointed by test-check-code-hg.t if you had run it ☺

I fixed thoses and pushed the updated patches to the clowncopter.

Thanks!


> +
> +    num = int(stringify(args[0][0](context, mapping, args[0][1])))
> +    text = stringify(args[1][0](context, mapping, args[1][1]))
> +    if len(args) == 3:
> +        splitter = stringify(args[2][0](context, mapping, args[2][1]))
> +    else:
> +        splitter = None
> +
> +    tokens = text.split(splitter)
> +    if num >= len(tokens):
> +        return ''
> +    else:
> +        return tokens[num]
> +
>   methods = {
>       "string": lambda e, c: (runstring, e[1]),
>       "rawstring": lambda e, c: (runrawstring, e[1]),
> @@ -504,6 +523,7 @@
>       "startswith": startswith,
>       "strip": strip,
>       "sub": sub,
> +    "word": word,
>   }
>
>   # template engine
> diff -r 61b333b982ea -r 5efbb2b98205 tests/test-command-template.t
> --- a/tests/test-command-template.t	Fri Jun 13 15:59:18 2014 -0700
> +++ b/tests/test-command-template.t	Thu Jun 12 18:02:23 2014 -0700
> @@ -1917,3 +1917,61 @@
>     $ hg log -Gv -R a --template '{desc|user()}'
>     hg: parse error: expected a symbol, got 'func'
>     [255]
> +
> +Test word function (including index out of bounds graceful failure)
> +
> +  $ hg log -Gv -R a --template "{word('1', desc)}"
> +  @
> +  |
> +  o
> +  |
> +  o
> +
> +  o
> +  |\
> +  | o  head
> +  | |
> +  o |  branch
> +  |/
> +  o  user,
> +  |
> +  o  person
> +  |
> +  o  1
> +  |
> +  o  1
> +
> +
> +Test word third parameter used as splitter
> +
> +  $ hg log -Gv -R a --template "{word('0', desc, 'o')}"
> +  @  future
> +  |
> +  o  third
> +  |
> +  o  sec
> +
> +  o    merge
> +  |\
> +  | o  new head
> +  | |
> +  o |  new branch
> +  |/
> +  o  n
> +  |
> +  o  n
> +  |
> +  o
> +  |
> +  o  line 1
> +     line 2
> +
> +Test word error messages for not enough and too many arguments
> +
> +  $ hg log -Gv -R a --template "{word('0')}"
> +  hg: parse error: word expects two or three arguments, got 1
> +  [255]
> +
> +  $ hg log -Gv -R a --template "{word('0', desc, 'o', 'h', 'b', 'o', 'y')}"
> +  hg: parse error: word expects two or three arguments, got 7
> +  [255]
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list