trailer: begin formatting unification
Now that the preparatory refactors are over, we can replace the call to format_trailers() in interpret-trailers with format_trailer_info(). This unifies the trailer formatting machinery In order to avoid breakages in t7502 and t7513, we have to steal the features present in format_trailers(). Namely, we have to teach format_trailer_info() as follows: (1) make it aware of opts->trim_empty, and (2) make it avoid hardcoding ": " as the separator and space (which can result in double-printing these characters). For (2), make it only print the separator and space if we cannot find any recognized separator somewhere in the key (yes, keys may have a trailing separator in it --- we will eventually fix this design but not now). Do so by copying the code out of print_tok_val(), and deleting the same function. Helped-by: Junio C Hamano <gitster@pobox.com> Helped-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Linus Arver <linusa@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
9f0c9702de
commit
676c1db76e
@ -171,7 +171,7 @@ static void interpret_trailers(const struct process_trailer_options *opts,
|
||||
}
|
||||
|
||||
/* Print trailer block. */
|
||||
format_trailers(opts, &head, &trailer_block);
|
||||
format_trailer_info(opts, &head, &trailer_block);
|
||||
free_trailers(&head);
|
||||
fwrite(trailer_block.buf, 1, trailer_block.len, outfile);
|
||||
strbuf_release(&trailer_block);
|
||||
|
54
trailer.c
54
trailer.c
@ -144,38 +144,6 @@ static char last_non_space_char(const char *s)
|
||||
return '\0';
|
||||
}
|
||||
|
||||
static void print_tok_val(struct strbuf *out, const char *tok, const char *val)
|
||||
{
|
||||
char c;
|
||||
|
||||
if (!tok) {
|
||||
strbuf_addf(out, "%s\n", val);
|
||||
return;
|
||||
}
|
||||
|
||||
c = last_non_space_char(tok);
|
||||
if (!c)
|
||||
return;
|
||||
if (strchr(separators, c))
|
||||
strbuf_addf(out, "%s%s\n", tok, val);
|
||||
else
|
||||
strbuf_addf(out, "%s%c %s\n", tok, separators[0], val);
|
||||
}
|
||||
|
||||
void format_trailers(const struct process_trailer_options *opts,
|
||||
struct list_head *trailers,
|
||||
struct strbuf *out)
|
||||
{
|
||||
struct list_head *pos;
|
||||
struct trailer_item *item;
|
||||
list_for_each(pos, trailers) {
|
||||
item = list_entry(pos, struct trailer_item, list);
|
||||
if ((!opts->trim_empty || strlen(item->value) > 0) &&
|
||||
(!opts->only_trailers || item->token))
|
||||
print_tok_val(out, item->token, item->value);
|
||||
}
|
||||
}
|
||||
|
||||
static struct trailer_item *trailer_from_arg(struct arg_item *arg_tok)
|
||||
{
|
||||
struct trailer_item *new_item = xcalloc(1, sizeof(*new_item));
|
||||
@ -1084,9 +1052,9 @@ void trailer_info_release(struct trailer_info *info)
|
||||
free(info->trailers);
|
||||
}
|
||||
|
||||
static void format_trailer_info(const struct process_trailer_options *opts,
|
||||
struct list_head *trailers,
|
||||
struct strbuf *out)
|
||||
void format_trailer_info(const struct process_trailer_options *opts,
|
||||
struct list_head *trailers,
|
||||
struct strbuf *out)
|
||||
{
|
||||
size_t origlen = out->len;
|
||||
struct list_head *pos;
|
||||
@ -1100,6 +1068,15 @@ static void format_trailer_info(const struct process_trailer_options *opts,
|
||||
strbuf_addstr(&tok, item->token);
|
||||
strbuf_addstr(&val, item->value);
|
||||
|
||||
/*
|
||||
* Skip key/value pairs where the value was empty. This
|
||||
* can happen from trailers specified without a
|
||||
* separator, like `--trailer "Reviewed-by"` (no
|
||||
* corresponding value).
|
||||
*/
|
||||
if (opts->trim_empty && !strlen(item->value))
|
||||
continue;
|
||||
|
||||
if (!opts->filter || opts->filter(&tok, opts->filter_data)) {
|
||||
if (opts->separator && out->len != origlen)
|
||||
strbuf_addbuf(out, opts->separator);
|
||||
@ -1108,8 +1085,11 @@ static void format_trailer_info(const struct process_trailer_options *opts,
|
||||
if (!opts->key_only && !opts->value_only) {
|
||||
if (opts->key_value_separator)
|
||||
strbuf_addbuf(out, opts->key_value_separator);
|
||||
else
|
||||
strbuf_addstr(out, ": ");
|
||||
else {
|
||||
char c = last_non_space_char(tok.buf);
|
||||
if (c && !strchr(separators, c))
|
||||
strbuf_addf(out, "%c ", separators[0]);
|
||||
}
|
||||
}
|
||||
if (!opts->key_only)
|
||||
strbuf_addbuf(out, &val);
|
||||
|
@ -101,7 +101,7 @@ void trailer_info_get(const struct process_trailer_options *,
|
||||
void trailer_info_release(struct trailer_info *info);
|
||||
|
||||
void trailer_config_init(void);
|
||||
void format_trailers(const struct process_trailer_options *,
|
||||
void format_trailer_info(const struct process_trailer_options *,
|
||||
struct list_head *trailers,
|
||||
struct strbuf *out);
|
||||
void free_trailers(struct list_head *);
|
||||
|
Reference in New Issue
Block a user