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

[PATCH 1/2] parse-options: Add support for dumping out long options

From
Stephen Boyd <bebarino@gmail.com>
Date
Apr 11, 2012, 10:29 UTC
Message-ID
<1334140165-24958-2-git-send-email-bebarino@gmail.com>
In-Reply-To
<1334140165-24958-1-git-send-email-bebarino@gmail.com>

The bash completion script wants to know what the long options are for a certain command at runtime. Add a magical long option that nobody could possibly ever use (--dump-raw-long-options) to get this information.

Some example output:
 $ git clone --dump-raw-long-options
 --no-verbose --no-quiet --progress --no-progress --no-checkout
 --checkout --bare --no-bare --mirror --no-mirror --local --no-local
 --no-hardlinks --hardlinks --shared --no-shared --recursive
 --no-recursive --recurse-submodules --no-recurse-submodules --template=
 --no-template --reference= --no-reference --origin= --no-origin
 --branch= --no-branch --upload-pack= --no-upload-pack --depth=
 --no-depth --single-branch --no-single-branch --separate-git-dir=
 --no-separate-git-dir --config= --no-config
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
---
The name can be anything. This seemed sufficiently obscure.
 parse-options.c |   41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
diff --git a/parse-options.c b/parse-options.c
index 850cfa7..6c37497 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -364,6 +364,45 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *,
 				       const char * const *,
 				       const struct option *, int, int);
 
+static int parse_options_raw(const struct option *opts)
+{
+	for (; opts->type != OPTION_END; opts++) {
+		if (opts->flags & PARSE_OPT_HIDDEN)
+			continue;
+		if (!opts->long_name)
+			continue;
+		switch (opts->type) {
+		case OPTION_BIT:
+		case OPTION_NEGBIT:
+		case OPTION_COUNTUP:
+		case OPTION_SET_INT:
+		case OPTION_SET_PTR:
+			fprintf(stdout, "--%s ", opts->long_name);
+			break;
+		case OPTION_LOWLEVEL_CALLBACK:
+		case OPTION_STRING:
+		case OPTION_FILENAME:
+		case OPTION_INTEGER:
+		case OPTION_CALLBACK:
+			if (opts->flags & PARSE_OPT_OPTARG)
+				fprintf(stdout, "--%s ", opts->long_name);
+			else if (!(opts->flags & PARSE_OPT_NOARG))
+				fprintf(stdout, "--%s= ", opts->long_name);
+			break;
+		default:
+			continue;
+		}
+		if (!(opts->flags & PARSE_OPT_NONEG)) {
+			if (!prefixcmp(opts->long_name, "no-"))
+				fprintf(stdout, "--%s ", opts->long_name + 3);
+			else
+				fprintf(stdout, "--no-%s ", opts->long_name);
+		}
+	}
+
+	return PARSE_OPT_HELP;
+}
+
 int parse_options_step(struct parse_opt_ctx_t *ctx,
 		       const struct option *options,
 		       const char * const usagestr[])
@@ -431,6 +470,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
 			return usage_with_options_internal(ctx, usagestr, options, 1, 0);
 		if (internal_help && !strcmp(arg + 2, "help"))
 			return parse_options_usage(ctx, usagestr, options, 0);
+		if (!strcmp(arg + 2, "dump-raw-long-options"))
+			return parse_options_raw(options);
 		switch (parse_long_opt(ctx, arg + 2, options)) {
 		case -1:
 			return parse_options_usage(ctx, usagestr, options, 1);
-- 
1.7.10.128.g7945c.dirty
Previous: Stephen BoydNext: Felipe Contreras
Message 2 of 14 in “Dynamic long options for bash completion”
  1. 0/2 Dynamic long options for bash completionStephen Boyd, Apr 11, 2012
  2. 1/2 parse-options: Add support for dumping out long optionsStephen Boyd, Apr 11, 2012
  3. Felipe ContrerasApr 11, 2012
  4. Stephen BoydApr 12, 2012
  5. Jonathan NiederApr 11, 2012
  6. Stephen BoydApr 12, 2012
  7. SZEDER GáborApr 11, 2012
  8. Stephen BoydApr 12, 2012
  9. SZEDER GáborApr 15, 2012
  10. Junio C HamanoApr 15, 2012
  11. 2/2 completion: Use parse-options raw output for simple long optionsStephen Boyd, Apr 11, 2012
  12. Jonathan NiederApr 11, 2012
  13. SZEDER GáborApr 11, 2012
  14. SZEDER GáborApr 17, 2012

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.