From: Christian Couder <christian.couder@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Patrick Steinhardt <ps@pks.im>, Elijah Newren <newren@gmail.com>,
Jeff King <peff@peff.net>,
"brian m . carlson" <sandals@crustytoothpaste.net>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Justin Tobler <jltobler@gmail.com>,
Christian Couder <christian.couder@gmail.com>
Subject: [PATCH v2 1/3] parse-options: add parse_options_takes_argument()
Date: Wed, 23 Sep 2026 10:09:26 +0200 [thread overview]
Message-ID: <20260923080928.1534413-2-christian.couder@gmail.com> (raw)
In-Reply-To: <20260923080928.1534413-1-christian.couder@gmail.com>
Whether an option takes a value, and therefore consumes the next
argument when that value is not stuck to it with an '=', is decided by
its type and its flags. That rule is currently open-coded in
show_gitcomp(), which needs it to decide if it should append an '=' to
the option it completes.
A following commit will need the same rule to find out which options an
early scan of the command line has to skip along with their value.
So let's factor that rule out into a new parse_options_takes_argument()
function, and let's use it in show_gitcomp().
Note that an option with PARSE_OPT_LASTARG_DEFAULT only consumes the
next argument when it isn't the last one, so it is not considered as
taking a value, which is what show_gitcomp() already did.
Signed-off-by: Christian Couder <christian.couder@gmail.com>
---
parse-options.c | 35 ++++++++++++++++++++++-------------
parse-options.h | 10 ++++++++++
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 4519ead9dc..a132c1ea12 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -841,6 +841,26 @@ static void show_negated_gitcomp(const struct option *opts, int show_all,
}
}
+int parse_options_takes_argument(const struct option *opt)
+{
+ switch (opt->type) {
+ case OPTION_STRING:
+ case OPTION_FILENAME:
+ case OPTION_INTEGER:
+ case OPTION_UNSIGNED:
+ case OPTION_CALLBACK:
+ break;
+ default:
+ return 0;
+ }
+
+ if (opt->flags & (PARSE_OPT_NOARG | PARSE_OPT_OPTARG |
+ PARSE_OPT_LASTARG_DEFAULT))
+ return 0;
+
+ return 1;
+}
+
static int show_gitcomp(const struct option *opts, int show_all)
{
const struct option *original_opts = opts;
@@ -862,20 +882,9 @@ static int show_gitcomp(const struct option *opts, int show_all)
break;
case OPTION_GROUP:
continue;
- case OPTION_STRING:
- case OPTION_FILENAME:
- case OPTION_INTEGER:
- case OPTION_UNSIGNED:
- case OPTION_CALLBACK:
- if (opts->flags & PARSE_OPT_NOARG)
- break;
- if (opts->flags & PARSE_OPT_OPTARG)
- break;
- if (opts->flags & PARSE_OPT_LASTARG_DEFAULT)
- break;
- suffix = "=";
- break;
default:
+ if (parse_options_takes_argument(opts))
+ suffix = "=";
break;
}
if (opts->flags & PARSE_OPT_COMP_ARG)
diff --git a/parse-options.h b/parse-options.h
index d7f896a933..f29e73f85c 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -420,6 +420,16 @@ int parse_options(int argc, const char **argv, const char *prefix,
const char * const usagestr[],
enum parse_opt_flags flags);
+/*
+ * Return non-zero if `opt` takes a value, which means that it consumes
+ * the next argument when that value is not stuck to it with an '='.
+ *
+ * Note that an option with PARSE_OPT_LASTARG_DEFAULT only consumes the
+ * next argument when it isn't the last one, so it is not considered as
+ * taking a value here.
+ */
+int parse_options_takes_argument(const struct option *opt);
+
NORETURN void usage_with_options(const char * const *usagestr,
const struct option *options);
--
2.56.0.rc2
next prev parent reply other threads:[~2026-09-23 8:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 16:10 [PATCH 0/6] Standardize early option scanning to fix argument parsing bugs Christian Couder
2026-09-02 16:10 ` [PATCH 1/6] parse-options: add early_scan_options() Christian Couder
2026-09-02 22:11 ` Junio C Hamano
2026-09-23 8:10 ` Christian Couder
2026-09-23 17:25 ` Junio C Hamano
2026-09-02 16:10 ` [PATCH 2/6] bisect: fix "--" detection when a term name is "--" Christian Couder
2026-09-02 22:30 ` Junio C Hamano
2026-09-23 8:11 ` Christian Couder
2026-09-23 17:27 ` Junio C Hamano
2026-09-02 16:10 ` [PATCH 3/6] rev-parse: fix "--" detection when it is an option value Christian Couder
2026-09-02 16:10 ` [PATCH 4/6] parse-options: add parse_options_takes_argument() Christian Couder
2026-09-02 16:10 ` [PATCH 5/6] parse-options: build early scan options from a struct option array Christian Couder
2026-09-02 16:10 ` [PATCH 6/6] fast-import: use early_scan_options() for --allow-unsafe-features Christian Couder
2026-09-04 3:38 ` Junio C Hamano
2026-09-02 18:52 ` [PATCH 0/6] Standardize early option scanning to fix argument parsing bugs Junio C Hamano
2026-09-23 8:10 ` Christian Couder
2026-09-23 8:09 ` [PATCH v2 0/3] Standardize early option scanning Christian Couder
2026-09-23 8:09 ` Christian Couder [this message]
2026-09-23 8:09 ` [PATCH v2 2/3] parse-options: add early_scan_options() Christian Couder
2026-09-23 8:09 ` [PATCH v2 3/3] fast-import: use early_scan_options() for --allow-unsafe-features Christian Couder
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=20260923080928.1534413-2-christian.couder@gmail.com \
--to=christian.couder@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=sandals@crustytoothpaste.net \
/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.