ref-filter: align: introduce long-form syntax

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>
This commit is contained in:
Karthik Nayak 2016-02-17 23:36:16 +05:30 committed by Junio C Hamano
parent 5bd881d998
commit 395fb8f9f4
3 changed files with 63 additions and 9 deletions

View File

@ -133,14 +133,18 @@ color::
align:: align::
Left-, middle-, or right-align the content between Left-, middle-, or right-align the content between
%(align:...) and %(end). The "align:" is followed by `<width>` %(align:...) and %(end). The "align:" is followed by
and `<position>` in any order separated by a comma, where the `width=<width>` and `position=<position>` in any order
`<position>` is either left, right or middle, default being separated by a comma, where the `<position>` is either left,
left and `<width>` is the total length of the content with right or middle, default being left and `<width>` is the total
alignment. If the contents length is more than the width then length of the content with alignment. For brevity, the
no alignment is performed. If used with '--quote' everything "width=" and/or "position=" prefixes may be omitted, and bare
in between %(align:...) and %(end) is quoted, but if nested <width> and <position> used instead. For instance,
then only the topmost level performs quoting. `%(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 In addition to the above, for commit and tag objects, the header
field names (`tree`, `parent`, `object`, `type`, and `tag`) can field names (`tree`, `parent`, `object`, `type`, and `tag`) can

View File

@ -78,7 +78,15 @@ static void align_atom_parser(struct used_atom *atom, const char *arg)
const char *s = params.items[i].string; const char *s = params.items[i].string;
int position; 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) else if ((position = parse_align_position(s)) >= 0)
align->position = position; align->position = position;

View File

@ -133,6 +133,48 @@ test_expect_success 'right alignment' '
test_cmp expect actual 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. # Individual atoms inside %(align:...) and %(end) must not be quoted.
test_expect_success 'alignment with format quote' " test_expect_success 'alignment with format quote' "