]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'rs/pretty-describe'
authorJunio C Hamano <gitster@pobox.com>
Mon, 22 Mar 2021 21:00:24 +0000 (14:00 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 Mar 2021 21:00:24 +0000 (14:00 -0700)
"git log --format='...'" learned "%(describe)" placeholder.

* rs/pretty-describe:
  archive: expand only a single %(describe) per archive
  pretty: document multiple %(describe) being inconsistent
  t4205: assert %(describe) test coverage
  pretty: add merge and exclude options to %(describe)
  pretty: add %(describe)

1  2 
pretty.c
pretty.h
t/t4205-log-pretty-formats.sh

diff --cc pretty.c
index d5efd00e219163068b4312d68e54ce36d3610922,032e89cd4e2a2319751cf004c183141a95d70a5a..e5b33ba034bd600b343ea146b0c38f992d1b462e
+++ b/pretty.c
@@@ -1149,63 -1150,34 +1150,91 @@@ static int format_trailer_match_cb(cons
        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 parse_describe_args(const char *start, struct strvec *args)
+ {
+       const char *options[] = { "match", "exclude" };
+       const char *arg = start;
+       for (;;) {
+               const char *matched = NULL;
+               const char *argval;
+               size_t arglen = 0;
+               int i;
+               for (i = 0; i < ARRAY_SIZE(options); i++) {
+                       if (match_placeholder_arg_value(arg, options[i], &arg,
+                                                       &argval, &arglen)) {
+                               matched = options[i];
+                               break;
+                       }
+               }
+               if (!matched)
+                       break;
+               if (!arglen)
+                       return 0;
+               strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
+       }
+       return arg - start;
+ }
  static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                                const char *placeholder,
                                void *context)
diff --cc pretty.h
Simple merge
Simple merge