@ -163,13 +163,15 @@ static void print_tok_val(FILE *outfile, const char *tok, const char *val)
@@ -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)
@@ -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,
@@ -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,
@@ -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,
@@ -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))