From: "Linus Arver via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Christian Couder [ ]" <chriscool@tuxfamily.org>,
"Junio C Hamano [ ]" <gitster@pobox.com>,
"Emily Shaffer [ ]" <nasamuffin@google.com>,
"Josh Steadmon [ ]" <steadmon@google.com>,
"Randall S. Becker [ ]" <rsbecker@nexbridge.com>,
"Christian Couder [ ]" <christian.couder@gmail.com>,
Kristoffer Haugsbakk
<"[code@khaugsbakk.name]"@web.codeaurora.org>,
Linus Arver <linusa@google.com>, Linus Arver <linusa@google.com>
Subject: [PATCH 4/5] trailer: begin formatting unification
Date: Fri, 15 Mar 2024 06:55:04 +0000 [thread overview]
Message-ID: <f8b102a5b8c898100d24e50d197ef0a24b17a247.1710485706.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1694.git.1710485706.gitgitgadget@gmail.com>
From: Linus Arver <linusa@google.com>
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>
---
builtin/interpret-trailers.c | 2 +-
trailer.c | 54 ++++++++++++------------------------
trailer.h | 2 +-
3 files changed, 19 insertions(+), 39 deletions(-)
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
index 11f4ce9e4a2..f57af0db37b 100644
--- a/builtin/interpret-trailers.c
+++ b/builtin/interpret-trailers.c
@@ -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);
diff --git a/trailer.c b/trailer.c
index fe8b0819d55..43d5baef9ce 100644
--- a/trailer.c
+++ b/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);
diff --git a/trailer.h b/trailer.h
index 1d106b6dd40..3c13006a4c1 100644
--- a/trailer.h
+++ b/trailer.h
@@ -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 *);
--
gitgitgadget
next prev parent reply other threads:[~2024-03-15 7:22 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-15 6:55 [PATCH 0/5] Unify trailer formatting functions Linus Arver via GitGitGadget
2024-03-15 6:55 ` [PATCH 1/5] format_trailer_info(): use trailer_item objects Linus Arver via GitGitGadget
2024-03-15 6:55 ` [PATCH 2/5] format_trailer_info(): drop redundant unfold_value() Linus Arver via GitGitGadget
2024-03-15 6:55 ` [PATCH 3/5] format_trailer_info(): append newline for non-trailer lines Linus Arver via GitGitGadget
2024-03-15 17:22 ` Junio C Hamano
2024-03-15 6:55 ` Linus Arver via GitGitGadget [this message]
2024-03-15 6:55 ` [PATCH 5/5] trailer: finish formatting unification Linus Arver via GitGitGadget
2024-03-15 17:20 ` [PATCH 0/5] Unify trailer formatting functions Junio C Hamano
2024-03-15 18:26 ` Kristoffer Haugsbakk
2024-03-15 19:10 ` Junio C Hamano
2024-03-15 21:36 ` Linus Arver
2024-03-15 21:43 ` Junio C Hamano
2024-03-26 21:57 ` Junio C Hamano
2024-04-02 0:27 ` Linus Arver
2024-04-15 21:02 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f8b102a5b8c898100d24e50d197ef0a24b17a247.1710485706.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc="[code@khaugsbakk.name]"@web.codeaurora.org \
--cc=chriscool@tuxfamily.org \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=linusa@google.com \
--cc=nasamuffin@google.com \
--cc=rsbecker@nexbridge.com \
--cc=steadmon@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).