summaryrefslogtreecommitdiff
path: root/trailer.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-08-15 10:23:29 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-08-15 18:13:58 (GMT)
commit000023961a0c02d6e21dc51ea3484ff71abf1c74 (patch)
tree3841d0ea5869f5aa6472279e25dcde48fb454aaf /trailer.c
parentfdbdb64f49959f9c83329554080934895f02ae59 (diff)
downloadgit-000023961a0c02d6e21dc51ea3484ff71abf1c74.zip
git-000023961a0c02d6e21dc51ea3484ff71abf1c74.tar.gz
git-000023961a0c02d6e21dc51ea3484ff71abf1c74.tar.bz2
interpret-trailers: add an option to unfold values
The point of "--only-trailers" is to give a caller an output that's easy for them to parse. Getting rid of the non-trailer material helps, but we still may see more complicated syntax like whitespace continuation. Let's add an option to unfold any continuation, giving the output as a single "key: value" line per trailer. As a bonus, this could be used even without --only-trailers to clean up unusual formatting in the incoming data. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'trailer.c')
-rw-r--r--trailer.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/trailer.c b/trailer.c
index 847417e..e63f432 100644
--- a/trailer.c
+++ b/trailer.c
@@ -886,6 +886,33 @@ static int ends_with_blank_line(const char *buf, size_t len)
return is_blank_line(buf + ll);
}
+static void unfold_value(struct strbuf *val)
+{
+ struct strbuf out = STRBUF_INIT;
+ size_t i;
+
+ strbuf_grow(&out, val->len);
+ i = 0;
+ while (i < val->len) {
+ char c = val->buf[i++];
+ if (c == '\n') {
+ /* Collapse continuation down to a single space. */
+ while (i < val->len && isspace(val->buf[i]))
+ i++;
+ strbuf_addch(&out, ' ');
+ } else {
+ strbuf_addch(&out, c);
+ }
+ }
+
+ /* Empty lines may have left us with whitespace cruft at the edges */
+ strbuf_trim(&out);
+
+ /* output goes back to val as if we modified it in-place */
+ strbuf_swap(&out, val);
+ strbuf_release(&out);
+}
+
static int process_input_file(FILE *outfile,
const char *str,
struct list_head *head,
@@ -914,6 +941,8 @@ static int process_input_file(FILE *outfile,
if (separator_pos >= 1) {
parse_trailer(&tok, &val, NULL, trailer,
separator_pos);
+ if (opts->unfold)
+ unfold_value(&val);
add_trailer_item(head,
strbuf_detach(&tok, NULL),
strbuf_detach(&val, NULL));