git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/4] parse-options: allow git commands to invent new option types

From
Stephen Boyd <bebarino@gmail.com>
Date
Oct 25, 2010, 10:31 UTC
Message-ID
<4CC55C67.8080908@gmail.com>
In-Reply-To
<20101024081507.GB29630@burratino>
On 10/24/10 01:15, Jonathan Nieder wrote:
Show 21 quoted lines
> 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);
> +
(I read patch 4 before this one)

Being able to modify the context within a callback is nice. Having to know if the option is short or long and and checking for validity seems like something that should be handled within the parse options library itself.

Is there an actual use case where someone needs to completely override get_value()? If you move this into the case statement then we get the generic error checking of get_value() with the benefits of being able to modify the context within a callback. We could also probably use the return value of the low level callback to indicate whether or not to take some action after parsing the option. Perhaps something like quiting the option parsing loop when encountering such an option?

This reminds me, we can probably simplify that "takes no value" error path in get_value() (see below).

Show 11 quoted lines
> 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
>  };

Don't forget to document what this option does in the comments of this file and in api-parse-options.txt

Show 10 quoted lines
>  
> @@ -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
> +};
> +
I hope this isn't necessary.

Hope this pasted ok. --->8----

diff --git a/parse-options.c b/parse-options.c
index 0fa79bc..7234c11 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -56,22 +56,8 @@ static int get_value(struct parse_opt_ctx_t *p,
        if (unset && (opt->flags & PARSE_OPT_NONEG))
                return opterror(opt, "isn't available", flags);

-       if (!(flags & OPT_SHORT) && p->opt) {
-               switch (opt->type) {
-               case OPTION_CALLBACK:
-                       if (!(opt->flags & PARSE_OPT_NOARG))
-                               break;
-                       /* FALLTHROUGH */
-               case OPTION_BOOLEAN:
-               case OPTION_BIT:
-               case OPTION_NEGBIT:
-               case OPTION_SET_INT:
-               case OPTION_SET_PTR:
+       if (!(flags & OPT_SHORT) && p->opt && (opt->flags &
PARSE_OPT_NOARG))
                        return opterror(opt, "takes no value", flags);
-               default:
-                       break;
-               }
-       }

        switch (opt->type) {
        case OPTION_BIT:
Previous: Jonathan NiederNext: Jonathan Nieder
Message 13 of 45 in “setup_git_env: print the true $GIT_DIR for debugging”
  1. 1/4 setup_git_env: print the true $GIT_DIR for debuggingNguyễn Thái Ngọc Duy, Oct 20, 2010
  2. 2/4 run_builtin(): save "-h" detection result for later useNguyễn Thái Ngọc Duy, Oct 20, 2010
  3. Junio C HamanoOct 21, 2010
  4. Nguyen Thai Ngoc DuyOct 22, 2010
  5. 3/4 builtins: utilize startup_info->help where possibleNguyễn Thái Ngọc Duy, Oct 20, 2010
  6. 4/4 builtins: check for startup_info->help, print and exit earlyNguyễn Thái Ngọc Duy, Oct 20, 2010
  7. 0/7 Jonathan Nieder, Oct 22, 2010
  8. 1/7 branch -h: show usage even in an invalid repositoryJonathan Nieder, Oct 22, 2010
  9. Junio C HamanoOct 22, 2010
  10. Jonathan NiederOct 24, 2010
  11. 0/4 update-index: migrate to parse-options APIJonathan Nieder, Oct 24, 2010
  12. 1/4 parse-options: allow git commands to invent new option typesJonathan Nieder, Oct 24, 2010
  13. Stephen BoydOct 25, 2010
  14. Jonathan NiederNov 29, 2010
  15. 2/4 parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTIONJonathan Nieder, Oct 24, 2010
  16. 3/4 setup: save prefix (original cwd relative to toplevel) in startup_infoJonathan Nieder, Oct 24, 2010
  17. 4/4 update-index: migrate to parse-options APIJonathan Nieder, Oct 24, 2010
  18. Stephen BoydOct 25, 2010
  19. Jonathan NiederNov 30, 2010
  20. Nguyen Thai Ngoc DuyOct 24, 2010
  21. Junio C HamanoOct 27, 2010
  22. 0/6 update-index: migrate to parse-options APIJonathan Nieder, Nov 30, 2010
  23. 1/6 parse-options: sanity check PARSE_OPT_NOARG flagJonathan Nieder, Nov 30, 2010
  24. Stephen BoydNov 30, 2010
  25. Junio C HamanoDec 1, 2010
  26. Stephen BoydDec 3, 2010
  27. Junio C HamanoDec 1, 2010
  28. 2/6 parse-options: do not infer PARSE_OPT_NOARG from option typeJonathan Nieder, Nov 30, 2010
  29. Stephen BoydNov 30, 2010
  30. 3/6 parse-options: allow git commands to invent new option typesJonathan Nieder, Nov 30, 2010
  31. 4/6 parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTIONJonathan Nieder, Nov 30, 2010
  32. 5/6 setup: save prefix (original cwd relative to toplevel) in startup_infoJonathan Nieder, Nov 30, 2010
  33. 6/6 update-index: migrate to parse-options APIJonathan Nieder, Nov 30, 2010
  34. Stephen BoydNov 30, 2010
  35. parse-options: always show arghelp when LITERAL_ARGHELP is setJonathan Nieder, Nov 30, 2010
  36. 2/7 checkout-index -h: show usage even in an invalid repositoryJonathan Nieder, Oct 22, 2010
  37. 3/7 commit/status -h: show usage even with broken configurationJonathan Nieder, Oct 22, 2010
  38. 4/7 gc -h: show usage even with broken configurationJonathan Nieder, Oct 22, 2010
  39. 5/7 ls-files -h: show usage even with corrupt indexJonathan Nieder, Oct 22, 2010
  40. Junio C HamanoOct 22, 2010
  41. 6/7 merge -h: show usage even with corrupt indexJonathan Nieder, Oct 22, 2010
  42. Junio C HamanoOct 22, 2010
  43. 7/7 update-index -h: show usage even with corrupt indexJonathan Nieder, Oct 22, 2010
  44. 0/7 avoid repository access during "git <foo> -h"Jonathan Nieder, Oct 22, 2010
  45. Nguyen Thai Ngoc DuyOct 22, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.