Stephen Boyd <bebarino@xxxxxxxxx> 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? > ---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@xxxxxxxxx> > --- > 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html