Merge branch 'es/pretty-describe-more'

Extend "git log --format=%(describe)" placeholder to allow passing
selected command-line options to the underlying "git describe"
command.

* es/pretty-describe-more:
  pretty: add abbrev option to %(describe)
  pretty: add tag option to %(describe)
  pretty.c: rework describe options parsing for better extensibility
This commit is contained in:
Junio C Hamano
2021-12-15 09:39:48 -08:00
3 changed files with 75 additions and 15 deletions

View File

@ -1275,28 +1275,66 @@ int format_set_trailers_options(struct process_trailer_options *opts,
static size_t parse_describe_args(const char *start, struct strvec *args)
{
const char *options[] = { "match", "exclude" };
struct {
char *name;
enum {
DESCRIBE_ARG_BOOL,
DESCRIBE_ARG_INTEGER,
DESCRIBE_ARG_STRING,
} type;
} option[] = {
{ "tags", DESCRIBE_ARG_BOOL},
{ "abbrev", DESCRIBE_ARG_INTEGER },
{ "exclude", DESCRIBE_ARG_STRING },
{ "match", DESCRIBE_ARG_STRING },
};
const char *arg = start;
for (;;) {
const char *matched = NULL;
int found = 0;
const char *argval;
size_t arglen = 0;
int optval = 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];
for (i = 0; !found && i < ARRAY_SIZE(option); i++) {
switch (option[i].type) {
case DESCRIBE_ARG_BOOL:
if (match_placeholder_bool_arg(arg, option[i].name, &arg, &optval)) {
if (optval)
strvec_pushf(args, "--%s", option[i].name);
else
strvec_pushf(args, "--no-%s", option[i].name);
found = 1;
}
break;
case DESCRIBE_ARG_INTEGER:
if (match_placeholder_arg_value(arg, option[i].name, &arg,
&argval, &arglen)) {
char *endptr;
if (!arglen)
return 0;
strtol(argval, &endptr, 10);
if (endptr - argval != arglen)
return 0;
strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
found = 1;
}
break;
case DESCRIBE_ARG_STRING:
if (match_placeholder_arg_value(arg, option[i].name, &arg,
&argval, &arglen)) {
if (!arglen)
return 0;
strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
found = 1;
}
break;
}
}
if (!matched)
if (!found)
break;
if (!arglen)
return 0;
strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
}
return arg - start;
}