summaryrefslogtreecommitdiff
path: root/trailer.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-08-15 10:23:21 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-08-15 18:13:58 (GMT)
commit56c493ed1b9c067813fb95ff7cd4f69c7c1d2e36 (patch)
tree44ddaa8efbb61e13812138830ea2137de66304ea /trailer.c
parent8abc89800c09cda7910c2211ebbbbb95a3008b63 (diff)
downloadgit-56c493ed1b9c067813fb95ff7cd4f69c7c1d2e36.zip
git-56c493ed1b9c067813fb95ff7cd4f69c7c1d2e36.tar.gz
git-56c493ed1b9c067813fb95ff7cd4f69c7c1d2e36.tar.bz2
interpret-trailers: add an option to show only the trailers
In theory it's easy for any reader who wants to parse trailers to do so. But there are a lot of subtle corner cases around what counts as a trailer, when the trailer block begins and ends, etc. Since interpret-trailers already has our parsing logic, let's let callers ask it to just output the trailers. They still have to parse the "key: value" lines, but at least they can ignore all of the other corner cases. 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.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/trailer.c b/trailer.c
index 9bcd54e..83225c6 100644
--- a/trailer.c
+++ b/trailer.c
@@ -163,13 +163,15 @@ static void print_tok_val(FILE *outfile, const char *tok, const char *val)
fprintf(outfile, "%s%c %s\n", tok, separators[0], val);
}
-static void print_all(FILE *outfile, struct list_head *head, int trim_empty)
+static void print_all(FILE *outfile, struct list_head *head,
+ const struct process_trailer_options *opts)
{
struct list_head *pos;
struct trailer_item *item;
list_for_each(pos, head) {
item = list_entry(pos, struct trailer_item, list);
- if (!trim_empty || strlen(item->value) > 0)
+ if ((!opts->trim_empty || strlen(item->value) > 0) &&
+ (!opts->only_trailers || item->token))
print_tok_val(outfile, item->token, item->value);
}
}
@@ -886,7 +888,8 @@ static int ends_with_blank_line(const char *buf, size_t len)
static int process_input_file(FILE *outfile,
const char *str,
- struct list_head *head)
+ struct list_head *head,
+ const struct process_trailer_options *opts)
{
struct trailer_info info;
struct strbuf tok = STRBUF_INIT;
@@ -896,9 +899,10 @@ static int process_input_file(FILE *outfile,
trailer_info_get(&info, str);
/* Print lines before the trailers as is */
- fwrite(str, 1, info.trailer_start - str, outfile);
+ if (!opts->only_trailers)
+ fwrite(str, 1, info.trailer_start - str, outfile);
- if (!info.blank_line_before_trailer)
+ if (!opts->only_trailers && !info.blank_line_before_trailer)
fprintf(outfile, "\n");
for (i = 0; i < info.trailer_nr; i++) {
@@ -913,7 +917,7 @@ static int process_input_file(FILE *outfile,
add_trailer_item(head,
strbuf_detach(&tok, NULL),
strbuf_detach(&val, NULL));
- } else {
+ } else if (!opts->only_trailers) {
strbuf_addstr(&val, trailer);
strbuf_strip_suffix(&val, "\n");
add_trailer_item(head,
@@ -985,18 +989,19 @@ void process_trailers(const char *file,
outfile = create_in_place_tempfile(file);
/* Print the lines before the trailers */
- trailer_end = process_input_file(outfile, sb.buf, &head);
+ trailer_end = process_input_file(outfile, sb.buf, &head, opts);
process_command_line_args(&arg_head, trailers);
process_trailers_lists(&head, &arg_head);
- print_all(outfile, &head, opts->trim_empty);
+ print_all(outfile, &head, opts);
free_all(&head);
/* Print the lines after the trailers as is */
- fwrite(sb.buf + trailer_end, 1, sb.len - trailer_end, outfile);
+ if (!opts->only_trailers)
+ fwrite(sb.buf + trailer_end, 1, sb.len - trailer_end, outfile);
if (opts->in_place)
if (rename_tempfile(&trailers_tempfile, file))