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:
58
pretty.c
58
pretty.c
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user