summaryrefslogtreecommitdiff
path: root/trailer.c
diff options
context:
space:
mode:
authorAnders Waldenborg <anders@0x63.nu>2019-01-28 21:33:37 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-01-29 18:03:32 (GMT)
commit0b691d8685131c2c10e1a2cf2acc9b8920c5365f (patch)
tree079331c3d3161055e104a523ecc4b1aba6c183d8 /trailer.c
parentfd2015b323d283c73346d70d2285a927650bb60a (diff)
downloadgit-0b691d8685131c2c10e1a2cf2acc9b8920c5365f.zip
git-0b691d8685131c2c10e1a2cf2acc9b8920c5365f.tar.gz
git-0b691d8685131c2c10e1a2cf2acc9b8920c5365f.tar.bz2
pretty: add support for separator option in %(trailers)
By default trailer lines are terminated by linebreaks ('\n'). By specifying the new 'separator' option they will instead be separated by user provided string and have separator semantics rather than terminator semantics. The separator string can contain the literal formatting codes %n and %xNN allowing it to be things that are otherwise hard to type such as %x00, or comma and end-parenthesis which would break parsing. E.g: $ git log --pretty='%(trailers:key=Reviewed-by,valueonly,separator=%x00)' Signed-off-by: Anders Waldenborg <anders@0x63.nu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'trailer.c')
-rw-r--r--trailer.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/trailer.c b/trailer.c
index d0d9e91..0c414f2 100644
--- a/trailer.c
+++ b/trailer.c
@@ -1129,10 +1129,11 @@ static void format_trailer_info(struct strbuf *out,
const struct trailer_info *info,
const struct process_trailer_options *opts)
{
+ size_t origlen = out->len;
size_t i;
/* If we want the whole block untouched, we can take the fast path. */
- if (!opts->only_trailers && !opts->unfold && !opts->filter) {
+ if (!opts->only_trailers && !opts->unfold && !opts->filter && !opts->separator) {
strbuf_add(out, info->trailer_start,
info->trailer_end - info->trailer_start);
return;
@@ -1150,16 +1151,26 @@ static void format_trailer_info(struct strbuf *out,
if (!opts->filter || opts->filter(&tok, opts->filter_data)) {
if (opts->unfold)
unfold_value(&val);
+
+ if (opts->separator && out->len != origlen)
+ strbuf_addbuf(out, opts->separator);
if (!opts->value_only)
strbuf_addf(out, "%s: ", tok.buf);
strbuf_addbuf(out, &val);
- strbuf_addch(out, '\n');
+ if (!opts->separator)
+ strbuf_addch(out, '\n');
}
strbuf_release(&tok);
strbuf_release(&val);
} else if (!opts->only_trailers) {
+ if (opts->separator && out->len != origlen) {
+ strbuf_addbuf(out, opts->separator);
+ }
strbuf_addstr(out, trailer);
+ if (opts->separator) {
+ strbuf_rtrim(out);
+ }
}
}