Skip to content

Commit 8b966a0

Browse files
avargitster
authored andcommitted
pretty-format %(trailers): fix broken standalone "valueonly"
Fix %(trailers:valueonly) being a noop due to on overly eager optimization in format_trailer_info() which skips custom formatting if no custom options are given. When "valueonly" was added in d9b936d (pretty: add support for "valueonly" option in %(trailers), 2019-01-28) we forgot to add it to the list of options that optimization checks for. See e.g. the addition of "key" in 250bea0 (pretty: allow showing specific trailers, 2019-01-28) for a similar change where this wasn't missed. Thus the "valueonly" option in "%(trailers:valueonly)" was a noop and the output was equivalent to that of a plain "%(trailers)". This wasn't caught because the tests for it always combined it with other options. Fix the bug by adding !opts->value_only to the list. I initially attempted to make this more future-proof by setting a flag if we got to ":" in "%(trailers:" in format_commit_one() in pretty.c. However, "%(trailers:" is also parsed in trailers_atom_parser() in ref-filter.c. There is an outstanding patch[1] unify those two, and such a fix, or other future-proofing, such as changing "process_trailer_options" flags into a bitfield, would conflict with that effort. Let's instead do the bare minimum here as this aspect of trailers is being actively worked on by another series. Let's also test for a plain "valueonly" without any other options, as well as "separator". All the other existing options on the pretty.c path had tests where they were the only option provided. I'm also keeping a sanity test for "%(trailers:)" being the same as "%(trailers)". There's no reason to suspect it wouldn't be in the current implementation, but let's keep it in the interest of black box testing. 1. https://lore.kernel.org/git/[email protected]/ Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2762e17 commit 8b966a0

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

t/t4205-log-pretty-formats.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,12 @@ test_expect_success 'pretty format %(trailers) shows trailers' '
605605
test_cmp expect actual
606606
'
607607

608+
test_expect_success 'pretty format %(trailers:) enables no options' '
609+
git log --no-walk --pretty="%(trailers:)" >actual &&
610+
# "expect" the same as the test above
611+
test_cmp expect actual
612+
'
613+
608614
test_expect_success '%(trailers:only) shows only "key: value" trailers' '
609615
git log --no-walk --pretty="%(trailers:only)" >actual &&
610616
{
@@ -715,7 +721,29 @@ test_expect_success '%(trailers:key=foo,valueonly) shows only value' '
715721
test_cmp expect actual
716722
'
717723

724+
test_expect_success '%(trailers:valueonly) shows only values' '
725+
git log --no-walk --pretty="format:%(trailers:valueonly)" >actual &&
726+
test_write_lines \
727+
"A U Thor <[email protected]>" \
728+
"A U Thor <[email protected]>" \
729+
"[ v2 updated patch description ]" \
730+
"A U Thor" \
731+
" <[email protected]>" >expect &&
732+
test_cmp expect actual
733+
'
734+
718735
test_expect_success 'pretty format %(trailers:separator) changes separator' '
736+
git log --no-walk --pretty=format:"X%(trailers:separator=%x00)X" >actual &&
737+
(
738+
printf "XSigned-off-by: A U Thor <[email protected]>\0" &&
739+
printf "Acked-by: A U Thor <[email protected]>\0" &&
740+
printf "[ v2 updated patch description ]\0" &&
741+
printf "Signed-off-by: A U Thor\n <[email protected]>X"
742+
) >expect &&
743+
test_cmp expect actual
744+
'
745+
746+
test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separator' '
719747
git log --no-walk --pretty=format:"X%(trailers:separator=%x00,unfold)X" >actual &&
720748
(
721749
printf "XSigned-off-by: A U Thor <[email protected]>\0" &&

trailer.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,8 @@ static void format_trailer_info(struct strbuf *out,
11311131
size_t i;
11321132

11331133
/* If we want the whole block untouched, we can take the fast path. */
1134-
if (!opts->only_trailers && !opts->unfold && !opts->filter && !opts->separator) {
1134+
if (!opts->only_trailers && !opts->unfold && !opts->filter &&
1135+
!opts->separator && !opts->value_only) {
11351136
strbuf_add(out, info->trailer_start,
11361137
info->trailer_end - info->trailer_start);
11371138
return;

0 commit comments

Comments
 (0)