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

Re: [PATCH 1/6] parse-options: sanity check PARSE_OPT_NOARG flag

From
Junio C Hamano <gitster@pobox.com>
Date
Dec 1, 2010, 23:01 UTC
Message-ID
<7v7hftt7vy.fsf@alter.siamese.dyndns.org>
In-Reply-To
<4CF4B21B.5030401@gmail.com>
Stephen Boyd <bebarino@gmail.com> writes:
> Looks like parse_options_check() is being called for each
> parse_options_step(). Here's a patch to fix that. Junio, this can
> probably be applied to maint.
Looks correct, but why is it a maint material?
Show 103 quoted lines
> ---8<------>8-----
> Subject: [PATCH] parse-options: Don't call parse_options_check() so much
>
> parse_options_check() is being called for each invocation of
> parse_options_step() which can be quite a bit for some commands. The
> commit introducing this function cb9d398 (parse-options: add
> parse_options_check to validate option specs., 2009-06-09) had the
> correct motivation and explicitly states that parse_options_check()
> should be called from parse_options_start(). However, the implementation
> differs from the motivation. Fix it.
>
> Signed-off-by: Stephen Boyd <bebarino@gmail.com>
> ---
>  builtin/blame.c    |    2 +-
>  builtin/shortlog.c |    2 +-
>  parse-options.c    |    7 +++----
>  parse-options.h    |    2 +-
>  4 files changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/builtin/blame.c b/builtin/blame.c
> index f5fccc1..19a2ebf 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -2310,7 +2310,7 @@ int cmd_blame(int argc, const char **argv, const
> char *prefix)
>  	dashdash_pos = 0;
>
>  	parse_options_start(&ctx, argc, argv, prefix, PARSE_OPT_KEEP_DASHDASH |
> -			    PARSE_OPT_KEEP_ARGV0);
> +			    PARSE_OPT_KEEP_ARGV0, options);
>  	for (;;) {
>  		switch (parse_options_step(&ctx, options, blame_opt_usage)) {
>  		case PARSE_OPT_HELP:
> diff --git a/builtin/shortlog.c b/builtin/shortlog.c
> index 2135b0d..8473391 100644
> --- a/builtin/shortlog.c
> +++ b/builtin/shortlog.c
> @@ -269,7 +269,7 @@ int cmd_shortlog(int argc, const char **argv, const
> char *prefix)
>  	shortlog_init(&log);
>  	init_revisions(&rev, prefix);
>  	parse_options_start(&ctx, argc, argv, prefix, PARSE_OPT_KEEP_DASHDASH |
> -			    PARSE_OPT_KEEP_ARGV0);
> +			    PARSE_OPT_KEEP_ARGV0, options);
>
>  	for (;;) {
>  		switch (parse_options_step(&ctx, options, shortlog_usage)) {
> diff --git a/parse-options.c b/parse-options.c
> index 0fa79bc..196ba71 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -338,7 +338,7 @@ static void parse_options_check(const struct option
> *opts)
>
>  void parse_options_start(struct parse_opt_ctx_t *ctx,
>  			 int argc, const char **argv, const char *prefix,
> -			 int flags)
> +			 int flags, const struct option *options)
>  {
>  	memset(ctx, 0, sizeof(*ctx));
>  	ctx->argc = argc - 1;
> @@ -350,6 +350,7 @@ void parse_options_start(struct parse_opt_ctx_t *ctx,
>  	if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
>  	    (flags & PARSE_OPT_STOP_AT_NON_OPTION))
>  		die("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
> +	parse_options_check(options);
>  }
>
>  static int usage_with_options_internal(struct parse_opt_ctx_t *,
> @@ -362,8 +363,6 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
>  {
>  	int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
>
> -	parse_options_check(options);
> -
>  	/* we must reset ->opt, unknown short option leave it dangling */
>  	ctx->opt = NULL;
>
> @@ -452,7 +451,7 @@ int parse_options(int argc, const char **argv, const
> char *prefix,
>  {
>  	struct parse_opt_ctx_t ctx;
>
> -	parse_options_start(&ctx, argc, argv, prefix, flags);
> +	parse_options_start(&ctx, argc, argv, prefix, flags, options);
>  	switch (parse_options_step(&ctx, options, usagestr)) {
>  	case PARSE_OPT_HELP:
>  		exit(129);
> diff --git a/parse-options.h b/parse-options.h
> index ae8647d..828c056 100644
> --- a/parse-options.h
> +++ b/parse-options.h
> @@ -180,7 +180,7 @@ struct parse_opt_ctx_t {
>
>  extern void parse_options_start(struct parse_opt_ctx_t *ctx,
>  				int argc, const char **argv, const char *prefix,
> -				int flags);
> +				int flags, const struct option *options);
>
>  extern int parse_options_step(struct parse_opt_ctx_t *ctx,
>  			      const struct option *options,
> -- 
> 1.7.3.2.614.g03864
Previous: Stephen BoydNext: Stephen Boyd
Message 25 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.