Patchwork [V3] templater: add count template filter, plus tests

login
register
mail settings
Submitter Anton Shestakov
Date Oct. 2, 2014, 9:27 a.m.
Message ID <ae9c8259c3f62e088070.1412242060@inspiron>
Download mbox | patch
Permalink /patch/6082/
State Accepted
Headers show

Comments

Anton Shestakov - Oct. 2, 2014, 9:27 a.m.
# HG changeset patch
# User Anton Shestakov <engored@ya.ru>
# Date 1410268453 -32400
#      Tue Sep 09 22:14:13 2014 +0900
# Node ID ae9c8259c3f62e0880709bc16c057df1b2d4c375
# Parent  4a00110fd8708373ed8e69f96367383b2dd10661
templater: add count template filter, plus tests

Previously there was no way of telling how much children or bookmarks or tags a
certain changeset has in a template. It was possible to tell if a changeset has
either 0 or not 0 bookmarks, but not 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.

(The previous version of this patch had an incorrect email subject and was
apparently lost - patchwork says the patch has been accepted, but it's not so.
The changes between that and this patch are minimal: now the filter does not
disturb the alphabetical order of function definitions and dict keys.)
Augie Fackler - Oct. 2, 2014, 6:41 p.m.
On Thu, Oct 02, 2014 at 06:27:40PM +0900, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <engored@ya.ru>
> # Date 1410268453 -32400
> #      Tue Sep 09 22:14:13 2014 +0900
> # Node ID ae9c8259c3f62e0880709bc16c057df1b2d4c375
> # Parent  4a00110fd8708373ed8e69f96367383b2dd10661
> templater: add count template filter, plus tests

very nice, queued, thanks

>
> Previously there was no way of telling how much children or bookmarks or tags a
> certain changeset has in a template. It was possible to tell if a changeset has
> either 0 or not 0 bookmarks, but not 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.
>
> (The previous version of this patch had an incorrect email subject and was
> apparently lost - patchwork says the patch has been accepted, but it's not so.
> The changes between that and this patch are minimal: now the filter does not
> disturb the alphabetical order of function definitions and dict keys.)
>
> diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
> --- a/mercurial/templatefilters.py
> +++ b/mercurial/templatefilters.py
> @@ -66,6 +66,10 @@
>      """
>      return os.path.basename(path)
>
> +def count(i):
> +    """:count: List or text. Returns the length as an integer."""
> +    return len(i)
> +
>  def datefilter(text):
>      """:date: Date. Returns a date in a Unix date format, including the
>      timezone: "Mon Sep 04 15:13:13 2006 0700".
> @@ -366,6 +370,7 @@
>      "addbreaks": addbreaks,
>      "age": age,
>      "basename": basename,
> +    "count": count,
>      "date": datefilter,
>      "domain": domain,
>      "email": email,
> 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
> @@ -1762,6 +1762,38 @@
>    $ 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@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
--- a/mercurial/templatefilters.py
+++ b/mercurial/templatefilters.py
@@ -66,6 +66,10 @@ 
     """
     return os.path.basename(path)
 
+def count(i):
+    """:count: List or text. Returns the length as an integer."""
+    return len(i)
+
 def datefilter(text):
     """:date: Date. Returns a date in a Unix date format, including the
     timezone: "Mon Sep 04 15:13:13 2006 0700".
@@ -366,6 +370,7 @@ 
     "addbreaks": addbreaks,
     "age": age,
     "basename": basename,
+    "count": count,
     "date": datefilter,
     "domain": domain,
     "email": email,
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
@@ -1762,6 +1762,38 @@ 
   $ 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