ref-filter: align: introduce long-form syntax
authorKarthik Nayak <karthik.188@gmail.com>
Wed, 17 Feb 2016 18:06:16 +0000 (23:36 +0530)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Feb 2016 22:06:45 +0000 (14:06 -0800)
Introduce optional prefixes "width=" and "position=" for the align atom
so that the atom can be used as "%(align:width=<width>,position=<position>)".

Add Documentation and tests for the same.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
Reviewed-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-for-each-ref.txt
ref-filter.c
t/t6302-for-each-ref-filter.sh
index d5e1781db71a8a993fc282034138ba16f77aaf48..89b6300478ec9a50673e28cd86f5eed79ab8f230 100644 (file)
@@ -133,14 +133,18 @@ color::
 
 align::
        Left-, middle-, or right-align the content between
-       %(align:...) and %(end). The "align:" is followed by `<width>`
-       and `<position>` in any order separated by a comma, where the
-       `<position>` is either left, right or middle, default being
-       left and `<width>` is the total length of the content with
-       alignment. If the contents length is more than the width then
-       no alignment is performed. If used with '--quote' everything
-       in between %(align:...) and %(end) is quoted, but if nested
-       then only the topmost level performs quoting.
+       %(align:...) and %(end). The "align:" is followed by
+       `width=<width>` and `position=<position>` in any order
+       separated by a comma, where the `<position>` is either left,
+       right or middle, default being left and `<width>` is the total
+       length of the content with alignment. For brevity, the
+       "width=" and/or "position=" prefixes may be omitted, and bare
+       <width> and <position> used instead.  For instance,
+       `%(align:<width>,<position>)`. If the contents length is more
+       than the width then no alignment is performed. If used with
+       '--quote' everything in between %(align:...) and %(end) is
+       quoted, but if nested then only the topmost level performs
+       quoting.
 
 In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
index 797f9fe2d883d9568259507e394cfe290fc4adde..2255dcc6c58bd7ac216a66bd3c15baa6167810c5 100644 (file)
@@ -78,7 +78,15 @@ static void align_atom_parser(struct used_atom *atom, const char *arg)
                const char *s = params.items[i].string;
                int position;
 
-               if (!strtoul_ui(s, 10, &width))
+               if (skip_prefix(s, "position=", &s)) {
+                       position = parse_align_position(s);
+                       if (position < 0)
+                               die(_("unrecognized position:%s"), s);
+                       align->position = position;
+               } else if (skip_prefix(s, "width=", &s)) {
+                       if (strtoul_ui(s, 10, &width))
+                               die(_("unrecognized width:%s"), s);
+               } else if (!strtoul_ui(s, 10, &width))
                        ;
                else if ((position = parse_align_position(s)) >= 0)
                        align->position = position;
index fe4796cc9c8b91210f98af8703f1b58e32e757c3..bcf472bf51999f3fd1a043b5d44601156d5c8049 100755 (executable)
@@ -133,6 +133,48 @@ test_expect_success 'right alignment' '
        test_cmp expect actual
 '
 
+cat >expect <<-\EOF
+|       refname is refs/heads/master       |refs/heads/master
+|        refname is refs/heads/side        |refs/heads/side
+|         refname is refs/odd/spot         |refs/odd/spot
+|     refname is refs/tags/double-tag      |refs/tags/double-tag
+|        refname is refs/tags/four         |refs/tags/four
+|         refname is refs/tags/one         |refs/tags/one
+|     refname is refs/tags/signed-tag      |refs/tags/signed-tag
+|        refname is refs/tags/three        |refs/tags/three
+|         refname is refs/tags/two         |refs/tags/two
+EOF
+
+test_align_permutations() {
+       while read -r option
+       do
+               test_expect_success "align:$option" '
+                       git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual &&
+                       test_cmp expect actual
+               '
+       done
+}
+
+test_align_permutations <<-\EOF
+       middle,42
+       42,middle
+       position=middle,42
+       42,position=middle
+       middle,width=42
+       width=42,middle
+       position=middle,width=42
+       width=42,position=middle
+EOF
+
+# Last one wins (silently) when multiple arguments of the same type are given
+
+test_align_permutations <<-\EOF
+       32,width=42,middle
+       width=30,42,middle
+       width=42,position=right,middle
+       42,right,position=middle
+EOF
+
 # Individual atoms inside %(align:...) and %(end) must not be quoted.
 
 test_expect_success 'alignment with format quote' "