From: Stephen Boyd <bebarino@gmail.com>
To: Jonathan Nieder <jrnieder@gmail.com>, Junio C Hamano <gitster@pobox.com>
Cc: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
git@vger.kernel.org, "Pierre Habouzit" <madcoder@debian.org>
Subject: Re: [PATCH 1/6] parse-options: sanity check PARSE_OPT_NOARG flag
Date: Tue, 30 Nov 2010 00:13:15 -0800 [thread overview]
Message-ID: <4CF4B21B.5030401@gmail.com> (raw)
In-Reply-To: <20101130025551.GB5326@burratino>
On 11/29/10 18:55, Jonathan Nieder wrote:
> +static void check_flags(const struct option *opt)
> +{
> + switch (opt->type) {
> + case OPTION_BOOLEAN:
> + case OPTION_BIT:
> + case OPTION_NEGBIT:
> + case OPTION_SET_INT:
> + case OPTION_SET_PTR:
> + case OPTION_NUMBER:
> + break;
> + default: /* (usually accepts an argument) */
> + return;
> + }
> + if ((opt->flags & (PARSE_OPT_OPTARG | PARSE_OPT_NOARG)) == PARSE_OPT_NOARG)
> + return;
> + die("BUG: option '-%c%s' should not accept an argument",
> + !opt->short_name ? '-' : opt->short_name,
> + !opt->short_name ? opt->long_name : "");
> +}
> +
This check should probably go into parse_options_check() and be run once
for each invocation of parse_options_start()... Oh that isn't good.
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.
---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
next prev parent reply other threads:[~2010-11-30 8:13 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-20 3:11 [PATCH v2 1/4] setup_git_env: print the true $GIT_DIR for debugging Nguyễn Thái Ngọc Duy
2010-10-20 3:11 ` [PATCH v2 2/4] run_builtin(): save "-h" detection result for later use Nguyễn Thái Ngọc Duy
2010-10-21 22:57 ` Junio C Hamano
2010-10-22 1:47 ` Nguyen Thai Ngoc Duy
2010-10-20 3:11 ` [PATCH v2 3/4] builtins: utilize startup_info->help where possible Nguyễn Thái Ngọc Duy
2010-10-20 3:12 ` [PATCH v2 4/4] builtins: check for startup_info->help, print and exit early Nguyễn Thái Ngọc Duy
2010-10-22 6:38 ` [PATCH en/and-cascade-tests 0/7] Jonathan Nieder
2010-10-22 6:42 ` [PATCH 1/7] branch -h: show usage even in an invalid repository Jonathan Nieder
2010-10-22 18:30 ` Junio C Hamano
2010-10-24 7:20 ` Jonathan Nieder
2010-10-24 8:13 ` [RFC/PATCH 0/4] update-index: migrate to parse-options API Jonathan Nieder
2010-10-24 8:15 ` [PATCH 1/4] parse-options: allow git commands to invent new option types Jonathan Nieder
2010-10-25 10:31 ` Stephen Boyd
2010-11-29 4:03 ` Jonathan Nieder
2010-10-24 8:15 ` [PATCH 2/4] parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION Jonathan Nieder
2010-10-24 8:16 ` [PATCH 3/4] setup: save prefix (original cwd relative to toplevel) in startup_info Jonathan Nieder
2010-10-24 8:18 ` [PATCH 4/4] update-index: migrate to parse-options API Jonathan Nieder
2010-10-25 10:30 ` Stephen Boyd
2010-11-30 2:34 ` Jonathan Nieder
2010-10-24 12:50 ` [RFC/PATCH 0/4] " Nguyen Thai Ngoc Duy
2010-10-27 4:19 ` Junio C Hamano
2010-11-30 2:52 ` [PATCH/RFCv2 0/6] " Jonathan Nieder
2010-11-30 2:55 ` [PATCH 1/6] parse-options: sanity check PARSE_OPT_NOARG flag Jonathan Nieder
2010-11-30 8:13 ` Stephen Boyd [this message]
2010-12-01 23:01 ` Junio C Hamano
2010-12-03 7:35 ` Stephen Boyd
2010-12-01 23:36 ` Junio C Hamano
2010-11-30 3:04 ` [PATCH 2/6] parse-options: do not infer PARSE_OPT_NOARG from option type Jonathan Nieder
2010-11-30 8:13 ` Stephen Boyd
2010-11-30 3:08 ` [PATCH 3/6] parse-options: allow git commands to invent new option types Jonathan Nieder
2010-11-30 3:09 ` [PATCH 4/6] parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION Jonathan Nieder
2010-11-30 3:10 ` [PATCH 5/6] setup: save prefix (original cwd relative to toplevel) in startup_info Jonathan Nieder
2010-11-30 3:15 ` [PATCH 6/6] update-index: migrate to parse-options API Jonathan Nieder
2010-11-30 8:13 ` Stephen Boyd
2010-11-30 16:00 ` [PATCH] parse-options: always show arghelp when LITERAL_ARGHELP is set Jonathan Nieder
2010-10-22 6:44 ` [PATCH 2/7] checkout-index -h: show usage even in an invalid repository Jonathan Nieder
2010-10-22 6:45 ` [PATCH 3/7] commit/status -h: show usage even with broken configuration Jonathan Nieder
2010-10-22 6:47 ` [PATCH 4/7] gc " Jonathan Nieder
2010-10-22 6:48 ` [PATCH 5/7] ls-files -h: show usage even with corrupt index Jonathan Nieder
2010-10-22 18:30 ` Junio C Hamano
2010-10-22 6:49 ` [PATCH 6/7] merge " Jonathan Nieder
2010-10-22 18:31 ` Junio C Hamano
2010-10-22 6:51 ` [PATCH 7/7] update-index " Jonathan Nieder
2010-10-22 6:55 ` [PATCH en/and-cascade-tests 0/7] avoid repository access during "git <foo> -h" Jonathan Nieder
2010-10-22 11:23 ` [PATCH en/and-cascade-tests 0/7] Nguyen Thai Ngoc Duy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CF4B21B.5030401@gmail.com \
--to=bebarino@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=madcoder@debian.org \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.