mirror of
https://github.com/git/git.git
synced 2025-01-26 17:33:34 +08:00
pretty.c: rework describe options parsing for better extensibility
It contains option arguments only, not options. We would like to add option support here too, but to do that we need to distinguish between different types of options. Lay out the groundwork for distinguishing between bools, strings, etc. and move the central logic (validating values and pushing new arguments to *args) into the successful match, because that will be fairly conditional on what type of argument is being parsed. Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
9d530dc002
commit
3c6eb4ec50
31
pretty.c
31
pretty.c
@ -1216,28 +1216,39 @@ 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_STRING,
|
||||
} type;
|
||||
} option[] = {
|
||||
{ "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 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_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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user