Skip to content

Commit 058761f

Browse files
avargitster
authored andcommitted
pretty format %(trailers): add a "key_value_separator"
Add a "key_value_separator" option to the "%(trailers)" pretty format, to go along with the existing "separator" argument. In combination these two options make it trivial to produce machine-readable (e.g. \0 and \0\0-delimited) format output. As elaborated on in a previous commit which added "keyonly" it was needlessly tedious to extract structured data from "%(trailers)" before the addition of this "key_value_separator" option. As seen by the test being added here extracting this data now becomes trivial. Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9d87d5a commit 058761f

File tree

5 files changed

+55
-3
lines changed

5 files changed

+55
-3
lines changed

Documentation/pretty-formats.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ option is given with no value, it's enabled.
284284
`%(trailers:only,unfold=true)` unfolds and shows all trailer lines.
285285
** 'keyonly[=<BOOL>]': only show the key part of the trailer.
286286
** 'valueonly[=<BOOL>]': only show the value part of the trailer.
287+
** 'key_value_separator=<SEP>': specify a separator inserted between
288+
trailer lines. When this option is not given each trailer key-value
289+
pair is separated by ": ". Otherwise it shares the same semantics
290+
as 'separator=<SEP>' above.
287291

288292
NOTE: Some placeholders may depend on other options given to the
289293
revision traversal engine. For example, the `%g*` reflog options will

pretty.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,6 +1418,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
14181418
struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
14191419
struct string_list filter_list = STRING_LIST_INIT_NODUP;
14201420
struct strbuf sepbuf = STRBUF_INIT;
1421+
struct strbuf kvsepbuf = STRBUF_INIT;
14211422
size_t ret = 0;
14221423

14231424
opts.no_divider = 1;
@@ -1449,6 +1450,14 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
14491450
strbuf_expand(&sepbuf, fmt, strbuf_expand_literal_cb, NULL);
14501451
free(fmt);
14511452
opts.separator = &sepbuf;
1453+
} else if (match_placeholder_arg_value(arg, "key_value_separator", &arg, &argval, &arglen)) {
1454+
char *fmt;
1455+
1456+
strbuf_reset(&kvsepbuf);
1457+
fmt = xstrndup(argval, arglen);
1458+
strbuf_expand(&kvsepbuf, fmt, strbuf_expand_literal_cb, NULL);
1459+
free(fmt);
1460+
opts.key_value_separator = &kvsepbuf;
14521461
} else if (!match_placeholder_bool_arg(arg, "only", &arg, &opts.only_trailers) &&
14531462
!match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold) &&
14541463
!match_placeholder_bool_arg(arg, "keyonly", &arg, &opts.key_only) &&

t/t4205-log-pretty-formats.sh

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,39 @@ test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separa
776776
test_cmp expect actual
777777
'
778778

779+
test_expect_success 'pretty format %(trailers:key_value_separator) changes key-value separator' '
780+
git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00)X" >actual &&
781+
(
782+
printf "XSigned-off-by\0A U Thor <[email protected]>\n" &&
783+
printf "Acked-by\0A U Thor <[email protected]>\n" &&
784+
printf "[ v2 updated patch description ]\n" &&
785+
printf "Signed-off-by\0A U Thor\n <[email protected]>\nX"
786+
) >expect &&
787+
test_cmp expect actual
788+
'
789+
790+
test_expect_success 'pretty format %(trailers:key_value_separator,unfold) changes key-value separator' '
791+
git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00,unfold)X" >actual &&
792+
(
793+
printf "XSigned-off-by\0A U Thor <[email protected]>\n" &&
794+
printf "Acked-by\0A U Thor <[email protected]>\n" &&
795+
printf "[ v2 updated patch description ]\n" &&
796+
printf "Signed-off-by\0A U Thor <[email protected]>\nX"
797+
) >expect &&
798+
test_cmp expect actual
799+
'
800+
801+
test_expect_success 'pretty format %(trailers:separator,key_value_separator) changes both separators' '
802+
git log --no-walk --pretty=format:"%(trailers:separator=%x00,key_value_separator=%x00%x00,unfold)" >actual &&
803+
(
804+
printf "Signed-off-by\0\0A U Thor <[email protected]>\0" &&
805+
printf "Acked-by\0\0A U Thor <[email protected]>\0" &&
806+
printf "[ v2 updated patch description ]\0" &&
807+
printf "Signed-off-by\0\0A U Thor <[email protected]>"
808+
) >expect &&
809+
test_cmp expect actual
810+
'
811+
779812
test_expect_success 'pretty format %(trailers) combining separator/key/keyonly/valueonly' '
780813
git commit --allow-empty -F - <<-\EOF &&
781814
Important fix

trailer.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,8 @@ static void format_trailer_info(struct strbuf *out,
11321132

11331133
/* If we want the whole block untouched, we can take the fast path. */
11341134
if (!opts->only_trailers && !opts->unfold && !opts->filter &&
1135-
!opts->separator && !opts->key_only && !opts->value_only) {
1135+
!opts->separator && !opts->key_only && !opts->value_only &&
1136+
!opts->key_value_separator) {
11361137
strbuf_add(out, info->trailer_start,
11371138
info->trailer_end - info->trailer_start);
11381139
return;
@@ -1155,8 +1156,12 @@ static void format_trailer_info(struct strbuf *out,
11551156
strbuf_addbuf(out, opts->separator);
11561157
if (!opts->value_only)
11571158
strbuf_addbuf(out, &tok);
1158-
if (!opts->key_only && !opts->value_only)
1159-
strbuf_addstr(out, ": ");
1159+
if (!opts->key_only && !opts->value_only) {
1160+
if (opts->key_value_separator)
1161+
strbuf_addbuf(out, opts->key_value_separator);
1162+
else
1163+
strbuf_addstr(out, ": ");
1164+
}
11601165
if (!opts->key_only)
11611166
strbuf_addbuf(out, &val);
11621167
if (!opts->separator)

trailer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct process_trailer_options {
7474
int key_only;
7575
int value_only;
7676
const struct strbuf *separator;
77+
const struct strbuf *key_value_separator;
7778
int (*filter)(const struct strbuf *, void *);
7879
void *filter_data;
7980
};

0 commit comments

Comments
 (0)