[PATCH 1/4] parse-options: allow git commands to invent new option types
From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:49:52
Subsystem:
the rest · Maintainer:
Linus Torvalds
parse-options provides a variety of option behaviors, including OPTION_CALLBACK, which should take care of just about any sane behavior. All supported behaviors obey the following constraint: A --foo option can only accept (and base its behavior on) one argument, which would be the following command-line argument in the "unsticked" form. Alas, some existing git commands have options that do not obey that constraint. For example, update-index --cacheinfo takes three arguments, and update-index --resolve takes all later parameters as arguments. Introduce a new option type (OPTION_LOWLEVEL_CALLBACK) to support such unusual options. parse_options() callers can implement an arbitrary custom get_value() function to override the usual one and pass it through the callback field for options of interest. Signed-off-by: Jonathan Nieder <redacted> --- parse-options.c | 6 +++--- parse-options.h | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 0fa79bc..7907306 100644
--- a/parse-options.c
+++ b/parse-options.c@@ -8,9 +8,6 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx, const char * const *usagestr, const struct option *opts, int err); -#define OPT_SHORT 1 -#define OPT_UNSET 2 - static int opterror(const struct option *opt, const char *reason, int flags) { if (flags & OPT_SHORT)
@@ -51,6 +48,9 @@ static int get_value(struct parse_opt_ctx_t *p, const int unset = flags & OPT_UNSET; int err; + if (opt->type == OPTION_LOWLEVEL_CALLBACK) + return (*(parse_opt_ll_cb *)opt->callback)(p, opt, flags); + if (unset && p->opt) return opterror(opt, "takes no value", flags); if (unset && (opt->flags & PARSE_OPT_NONEG))
diff --git a/parse-options.h b/parse-options.h
index d982f0f..fa400da 100644
--- a/parse-options.h
+++ b/parse-options.h@@ -17,6 +17,7 @@ enum parse_opt_type { OPTION_STRING, OPTION_INTEGER, OPTION_CALLBACK, + OPTION_LOWLEVEL_CALLBACK, OPTION_FILENAME };
@@ -40,8 +41,16 @@ enum parse_opt_option_flags { PARSE_OPT_SHELL_EVAL = 256 }; +enum parse_opt_ll_flags { + OPT_SHORT = 1, + OPT_UNSET = 2 +}; + struct option; +struct parse_opt_ctx_t; typedef int parse_opt_cb(const struct option *, const char *arg, int unset); +typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx, + const struct option *opt, int flags); /* * `type`::
--
1.7.2.3