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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---

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

--
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


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]