[PATCH 2 of 2 V2] templater: add count template filter, plus tests

Siddharth Agarwal sid at less-broken.com
Fri Sep 19 20:36:34 CDT 2014


On 09/09/2014 06:25 AM, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <engored at ya.ru>
> # Date 1410268453 -32400
> #      Tue Sep 09 22:14:13 2014 +0900
> # Node ID 698e992e50c7a11a398acb4a4b2e4ec1e6097177
> # Parent  9bb0ab35e90ac9ebf6adbd6e503f3412d9f2adb7
> templater: add count template filter, plus tests

Any updates for this patch?

>
> Currently there is no way of telling how much children or bookmarks or tags a
> certain changeset has in a template. It is possible to tell if a changeset have
> either 0 or not 0 bookmarks, but no way to tell if it has 1 or 2 of them, for
> example.
>
> This filter, simply named count, makes it possible to count the number of items
> in a list or the length of a string (or, anything that python's len can count).
> E.g.: {children|count}, {bookmarks|count}, {file_adds|count}.
>
> Testing the filter on node hash and shortened node hash is chosen because they
> both have defined length.
>
> As for lists of strings, children, tags and file_adds are used, because they
> provide some variety and also prove that what's counted is the number of string
> items in the list, and not the list stringified (they are lists of non-empty,
> multi-character strings).
>
> Additionally, revset template function is used for testing the filter, since
> the combination is very flexible and will possibly be used together a lot.
>
> diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
> --- a/mercurial/templatefilters.py
> +++ b/mercurial/templatefilters.py
> @@ -224,6 +224,10 @@ def jsonescape(s):
>           s = s.replace(k, v)
>       return ''.join(_uescape(c) for c in s)
>   
> +def count(i):
> +    """:count: List or text. Returns the length as an integer."""
> +    return len(i)
> +
>   def localdate(text):
>       """:localdate: Date. Converts a date to local date."""
>       return (util.parsedate(text)[0], util.makedate()[1])
> @@ -379,6 +383,7 @@ filters = {
>       "isodatesec": isodatesec,
>       "json": json,
>       "jsonescape": jsonescape,
> +    "count": count,
>       "localdate": localdate,
>       "nonempty": nonempty,
>       "obfuscate": obfuscate,
> diff --git a/tests/test-command-template.t b/tests/test-command-template.t
> --- a/tests/test-command-template.t
> +++ b/tests/test-command-template.t
> @@ -1413,6 +1413,38 @@ Age filter:
>     $ hg log -l1 --template '{date|age}\n'
>     7 years from now
>   
> +Count filter:
> +
> +  $ hg log -l1 --template '{node|count} {node|short|count}\n'
> +  40 12
> +
> +  $ hg log -l1 --template '{revset("null^")|count} {revset(".")|count} {revset("0::3")|count}\n'
> +  0 1 4
> +
> +  $ hg log -G --template '{rev}: children: {children|count}, \
> +  > tags: {tags|count}, file_adds: {file_adds|count}, \
> +  > ancestors: {revset("ancestors(%s)", rev)|count}'
> +  @  9: children: 0, tags: 1, file_adds: 1, ancestors: 3
> +  |
> +  o  8: children: 1, tags: 0, file_adds: 2, ancestors: 2
> +  |
> +  o  7: children: 1, tags: 0, file_adds: 1, ancestors: 1
> +
> +  o    6: children: 0, tags: 0, file_adds: 0, ancestors: 7
> +  |\
> +  | o  5: children: 1, tags: 0, file_adds: 1, ancestors: 5
> +  | |
> +  o |  4: children: 1, tags: 0, file_adds: 0, ancestors: 5
> +  |/
> +  o  3: children: 2, tags: 0, file_adds: 0, ancestors: 4
> +  |
> +  o  2: children: 1, tags: 0, file_adds: 1, ancestors: 3
> +  |
> +  o  1: children: 1, tags: 0, file_adds: 1, ancestors: 2
> +  |
> +  o  0: children: 1, tags: 0, file_adds: 1, ancestors: 1
> +
> +
>   Error on syntax:
>   
>     $ echo 'x = "f' >> t
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list