pretty: add support for "valueonly" option in %(trailers)

With the new "key=" option to %(trailers) it often makes little sense to show the key, as it by definition already is knows which trailer is printed there. This new "valueonly" option makes it omit the key when printing trailers. E.g.: $ git show -s --pretty='%s%n%(trailers:key=Signed-off-by,valueonly)' aaaa88182 will show: > upload-pack: fix broken if/else chain in config callback > Jeff King <peff@peff.net> > Junio C Hamano <gitster@pobox.com> Signed-off-by: Anders Waldenborg <anders@0x63.nu> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Anders Waldenborg committed Jan 28, 2019 at 22:33 UTC d9b936db5226ed4b87d42a2c91324adc50c768b6
5 files changed +15 -3
Documentation/pretty-formats.txt
+2
@@ -243,6 +243,8 @@ endif::git-rev-list[]
243 option was given. In same way as to for `only` it can be followed
244 by an equal sign and explicit value. E.g.,
245 `%(trailers:only,unfold=true)` unfolds and shows all trailer lines.
246 +** 'valueonly[=val]': skip over the key part of the trailer line and only
247 + show the value part. Also this optionally allows explicit value.
248
249 NOTE: Some placeholders may depend on other options given to the
250 revision traversal engine. For example, the `%g*` reflog options will
pretty.c
+2 -1
@@ -1391,7 +1391,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
1391 opts.filter_data = &filter_list;
1392 opts.only_trailers = 1;
1393 } else if (!match_placeholder_bool_arg(arg, "only", &arg, &opts.only_trailers) &&
1394 - !match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold))
1394 + !match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold) &&
1395 + !match_placeholder_bool_arg(arg, "valueonly", &arg, &opts.value_only))
1396 break;
1397 }
1398 }
t/t4205-log-pretty-formats.sh
+6
@@ -673,6 +673,12 @@ test_expect_success '%(trailers:key) without value is error' '
673 test_cmp expect actual
674 '
675
676 +test_expect_success '%(trailers:key=foo,valueonly) shows only value' '
677 + git log --no-walk --pretty="format:%(trailers:key=Acked-by,valueonly)" >actual &&
678 + echo "A U Thor <author@example.com>" >expect &&
679 + test_cmp expect actual
680 +'
681 +
682 test_expect_success 'trailer parsing not fooled by --- line' '
683 git commit --allow-empty -F - <<-\EOF &&
684 this is the subject
trailer.c
+4 -2
@@ -1150,8 +1150,10 @@ static void format_trailer_info(struct strbuf *out,
1150 if (!opts->filter || opts->filter(&tok, opts->filter_data)) {
1151 if (opts->unfold)
1152 unfold_value(&val);
1153 -
1154 - strbuf_addf(out, "%s: %s\n", tok.buf, val.buf);
1153 + if (!opts->value_only)
1154 + strbuf_addf(out, "%s: ", tok.buf);
1155 + strbuf_addbuf(out, &val);
1156 + strbuf_addch(out, '\n');
1157 }
1158 strbuf_release(&tok);
1159 strbuf_release(&val);
trailer.h
+1
@@ -72,6 +72,7 @@ struct process_trailer_options {
72 int only_input;
73 int unfold;
74 int no_divider;
75 + int value_only;
76 int (*filter)(const struct strbuf *, void *);
77 void *filter_data;
78 };