[PATCH V3] templater: introduce word function

Ryan McElroy ryanmce at gmail.com
Mon Jul 7 18:10:08 CDT 2014


Thanks Pierre-Yves! I'll do better next time.

~Ryan (mobile)

> On Jul 7, 2014, at 3:27 PM, Pierre-Yves David <pierre-yves.david at ens-lyon.org> wrote:
> 
> 
> 
>> 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