summaryrefslogtreecommitdiff
path: root/pretty.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2021-03-01 22:02:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-03-01 22:02:58 (GMT)
commit28714238c8d482345ca17e8dd98d8cc328de24a8 (patch)
tree9e6d014a41e4298f4bb8793f1a51f906e44d4728 /pretty.c
parent18aabfaee50058237829c0aea8d4c50efd8078aa (diff)
parentee82a487f68a7c86551fb59f6176812d63be61b6 (diff)
downloadgit-28714238c8d482345ca17e8dd98d8cc328de24a8.zip
git-28714238c8d482345ca17e8dd98d8cc328de24a8.tar.gz
git-28714238c8d482345ca17e8dd98d8cc328de24a8.tar.bz2
Merge branch 'hv/trailer-formatting'
The logic to handle "trailer" related placeholders in the "--format=" mechanisms in the "log" family and "for-each-ref" family is getting unified. * hv/trailer-formatting: ref-filter: use pretty.c logic for trailers pretty.c: capture invalid trailer argument pretty.c: refactor trailer logic to `format_set_trailers_options()` t6300: use function to test trailer options
Diffstat (limited to 'pretty.c')
-rw-r--r--pretty.c98
1 files changed, 59 insertions, 39 deletions
diff --git a/pretty.c b/pretty.c
index b4ff3f6..c5f5ecc 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1149,6 +1149,63 @@ static int format_trailer_match_cb(const struct strbuf *key, void *ud)
return 0;
}
+int format_set_trailers_options(struct process_trailer_options *opts,
+ struct string_list *filter_list,
+ struct strbuf *sepbuf,
+ struct strbuf *kvsepbuf,
+ const char **arg,
+ char **invalid_arg)
+{
+ for (;;) {
+ const char *argval;
+ size_t arglen;
+
+ if (**arg == ')')
+ break;
+
+ if (match_placeholder_arg_value(*arg, "key", arg, &argval, &arglen)) {
+ uintptr_t len = arglen;
+
+ if (!argval)
+ return -1;
+
+ if (len && argval[len - 1] == ':')
+ len--;
+ string_list_append(filter_list, argval)->util = (char *)len;
+
+ opts->filter = format_trailer_match_cb;
+ opts->filter_data = filter_list;
+ opts->only_trailers = 1;
+ } else if (match_placeholder_arg_value(*arg, "separator", arg, &argval, &arglen)) {
+ char *fmt;
+
+ strbuf_reset(sepbuf);
+ fmt = xstrndup(argval, arglen);
+ strbuf_expand(sepbuf, fmt, strbuf_expand_literal_cb, NULL);
+ free(fmt);
+ opts->separator = sepbuf;
+ } else if (match_placeholder_arg_value(*arg, "key_value_separator", arg, &argval, &arglen)) {
+ char *fmt;
+
+ strbuf_reset(kvsepbuf);
+ fmt = xstrndup(argval, arglen);
+ strbuf_expand(kvsepbuf, fmt, strbuf_expand_literal_cb, NULL);
+ free(fmt);
+ opts->key_value_separator = kvsepbuf;
+ } else if (!match_placeholder_bool_arg(*arg, "only", arg, &opts->only_trailers) &&
+ !match_placeholder_bool_arg(*arg, "unfold", arg, &opts->unfold) &&
+ !match_placeholder_bool_arg(*arg, "keyonly", arg, &opts->key_only) &&
+ !match_placeholder_bool_arg(*arg, "valueonly", arg, &opts->value_only)) {
+ if (invalid_arg) {
+ size_t len = strcspn(*arg, ",)");
+ *invalid_arg = xstrndup(*arg, len);
+ }
+ return -1;
+ }
+ }
+ return 0;
+}
+
static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
const char *placeholder,
void *context)
@@ -1429,45 +1486,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
if (*arg == ':') {
arg++;
- for (;;) {
- const char *argval;
- size_t arglen;
-
- if (match_placeholder_arg_value(arg, "key", &arg, &argval, &arglen)) {
- uintptr_t len = arglen;
-
- if (!argval)
- goto trailer_out;
-
- if (len && argval[len - 1] == ':')
- len--;
- string_list_append(&filter_list, argval)->util = (char *)len;
-
- opts.filter = format_trailer_match_cb;
- opts.filter_data = &filter_list;
- opts.only_trailers = 1;
- } else if (match_placeholder_arg_value(arg, "separator", &arg, &argval, &arglen)) {
- char *fmt;
-
- strbuf_reset(&sepbuf);
- fmt = xstrndup(argval, arglen);
- strbuf_expand(&sepbuf, fmt, strbuf_expand_literal_cb, NULL);
- free(fmt);
- opts.separator = &sepbuf;
- } else if (match_placeholder_arg_value(arg, "key_value_separator", &arg, &argval, &arglen)) {
- char *fmt;
-
- strbuf_reset(&kvsepbuf);
- fmt = xstrndup(argval, arglen);
- strbuf_expand(&kvsepbuf, fmt, strbuf_expand_literal_cb, NULL);
- free(fmt);
- opts.key_value_separator = &kvsepbuf;
- } else if (!match_placeholder_bool_arg(arg, "only", &arg, &opts.only_trailers) &&
- !match_placeholder_bool_arg(arg, "unfold", &arg, &opts.unfold) &&
- !match_placeholder_bool_arg(arg, "keyonly", &arg, &opts.key_only) &&
- !match_placeholder_bool_arg(arg, "valueonly", &arg, &opts.value_only))
- break;
- }
+ if (format_set_trailers_options(&opts, &filter_list, &sepbuf, &kvsepbuf, &arg, NULL))
+ goto trailer_out;
}
if (*arg == ')') {
format_trailers_from_commit(sb, msg + c->subject_off, &opts);