git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] parse-opt: bring PARSE_OPT_HIDDEN to git-rev-parse --parseopt
@ 2008-03-02  8:21 Pierre Habouzit
  2008-03-02 10:35 ` [PATCH 2/3] parse-options: bring PARSE_OPT_NONEG " Pierre Habouzit
  2008-03-02 10:35 ` [PATCH 3/3] parse-options: new option type to treat an option-like parameter as an argument Pierre Habouzit
  0 siblings, 2 replies; 3+ messages in thread
From: Pierre Habouzit @ 2008-03-02  8:21 UTC (permalink / raw)
  To: Git ML, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 2454 bytes --]

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
---
 Documentation/git-rev-parse.txt |   15 ++++++++++-----
 builtin-rev-parse.c             |   25 ++++++++++++++-----------
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index f02f6bb..e961c20 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -325,7 +325,7 @@ The lines after the separator describe the options.
 Each line of options has this format:
 
 ------------
-<opt_spec><arg_spec>? SP+ help LF
+<opt_spec><flags>? SP+ help LF
 ------------
 
 `<opt_spec>`::
@@ -334,10 +334,15 @@ Each line of options has this format:
 	is necessary. `h,help`, `dry-run` and `f` are all three correct
 	`<opt_spec>`.
 
-`<arg_spec>`::
-	an `<arg_spec>` tells the option parser if the option has an argument
-	(`=`), an optional one (`?` though its use is discouraged) or none
-	(no `<arg_spec>` in that case).
+`<flags>`::
+	`<flags>` are any suite of `*`, `=` or `?`.
+	* Use `=` if the option take an argument.
+
+	* Use `?` to mean that the option is optional (though its use is discouraged).
+
+	* Use `*` to mean that this option should not be listed in the usage
+	  generated for the `-h` argument. It's shown for `--help-all` as
+	  documented in linkgit:gitcli[5].
 
 The remainder of the line, after stripping the spaces, is used
 as the help associated to the option.
diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c
index 90dbb9d..d1ea73a 100644
--- a/builtin-rev-parse.c
+++ b/builtin-rev-parse.c
@@ -322,18 +322,21 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
 		o->type = OPTION_CALLBACK;
 		o->help = xstrdup(skipspaces(s));
 		o->value = &parsed;
+		o->flags = PARSE_OPT_NOARG;
 		o->callback = &parseopt_dump;
-		switch (s[-1]) {
-		case '=':
-			s--;
-			break;
-		case '?':
-			o->flags = PARSE_OPT_OPTARG;
-			s--;
-			break;
-		default:
-			o->flags = PARSE_OPT_NOARG;
-			break;
+		while (s > sb.buf && strchr("*=?", s[-1])) {
+			switch (*--s) {
+			case '=':
+				o->flags &= ~PARSE_OPT_NOARG;
+				break;
+			case '?':
+				o->flags &= ~PARSE_OPT_NOARG;
+				o->flags |= PARSE_OPT_OPTARG;
+				break;
+			case '*':
+				o->flags |= PARSE_OPT_HIDDEN;
+				break;
+			}
 		}
 
 		if (s - sb.buf == 1) /* short option only */
-- 
1.5.4.3.343.g6846

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/3] parse-options: bring PARSE_OPT_NONEG to git-rev-parse --parseopt.
  2008-03-02  8:21 [PATCH] parse-opt: bring PARSE_OPT_HIDDEN to git-rev-parse --parseopt Pierre Habouzit
@ 2008-03-02 10:35 ` Pierre Habouzit
  2008-03-02 10:35 ` [PATCH 3/3] parse-options: new option type to treat an option-like parameter as an argument Pierre Habouzit
  1 sibling, 0 replies; 3+ messages in thread
From: Pierre Habouzit @ 2008-03-02 10:35 UTC (permalink / raw)
  To: Git ML, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 2273 bytes --]

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
---

  While we're at it, this one could probably be squashed on top of the
  previous one.

 Documentation/git-rev-parse.txt |    8 +++++---
 builtin-rev-parse.c             |    5 ++++-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index e961c20..6513c2e 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -325,7 +325,7 @@ The lines after the separator describe the options.
 Each line of options has this format:
 
 ------------
-<opt_spec><flags>? SP+ help LF
+<opt_spec><flags>* SP+ help LF
 ------------
 
 `<opt_spec>`::
@@ -335,8 +335,8 @@ Each line of options has this format:
 	`<opt_spec>`.
 
 `<flags>`::
-	`<flags>` are any suite of `*`, `=` or `?`.
-	* Use `=` if the option take an argument.
+	`<flags>` are of `*`, `=`, `?` or `!`.
+	* Use `=` if the option takes an argument.
 
 	* Use `?` to mean that the option is optional (though its use is discouraged).
 
@@ -344,6 +344,8 @@ Each line of options has this format:
 	  generated for the `-h` argument. It's shown for `--help-all` as
 	  documented in linkgit:gitcli[5].
 
+	* Use `!` to not make the corresponding negated long option available.
+
 The remainder of the line, after stripping the spaces, is used
 as the help associated to the option.
 
diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c
index d1ea73a..0351d54 100644
--- a/builtin-rev-parse.c
+++ b/builtin-rev-parse.c
@@ -324,7 +324,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
 		o->value = &parsed;
 		o->flags = PARSE_OPT_NOARG;
 		o->callback = &parseopt_dump;
-		while (s > sb.buf && strchr("*=?", s[-1])) {
+		while (s > sb.buf && strchr("*=?!", s[-1])) {
 			switch (*--s) {
 			case '=':
 				o->flags &= ~PARSE_OPT_NOARG;
@@ -333,6 +333,9 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
 				o->flags &= ~PARSE_OPT_NOARG;
 				o->flags |= PARSE_OPT_OPTARG;
 				break;
+			case '!':
+				o->flags |= PARSE_OPT_NONEG;
+				break;
 			case '*':
 				o->flags |= PARSE_OPT_HIDDEN;
 				break;
-- 
1.5.4.3.471.ga96e8.dirty


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 3/3] parse-options: new option type to treat an option-like parameter as an argument.
  2008-03-02  8:21 [PATCH] parse-opt: bring PARSE_OPT_HIDDEN to git-rev-parse --parseopt Pierre Habouzit
  2008-03-02 10:35 ` [PATCH 2/3] parse-options: bring PARSE_OPT_NONEG " Pierre Habouzit
@ 2008-03-02 10:35 ` Pierre Habouzit
  1 sibling, 0 replies; 3+ messages in thread
From: Pierre Habouzit @ 2008-03-02 10:35 UTC (permalink / raw)
  To: Git ML, Junio C Hamano

This is meant to be used to keep --not and --all during revision parsing.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
---
 parse-options.c          |   26 +++++++++++++++++++-------
 parse-options.h          |    2 ++
 t/t0040-parse-options.sh |   16 ++++++++++++++++
 test-parse-options.c     |    2 ++
 4 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/parse-options.c b/parse-options.c
index be35785..8e64316 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -6,7 +6,8 @@
 
 struct optparse_t {
 	const char **argv;
-	int argc;
+	const char **out;
+	int argc, cpidx;
 	const char *opt;
 };
 
@@ -159,6 +160,16 @@ static int parse_long_opt(struct optparse_t *p, const char *arg,
 			continue;
 
 		rest = skip_prefix(arg, options->long_name);
+		if (options->type == OPTION_ARGUMENT) {
+			if (!rest)
+				continue;
+			if (*rest == '=')
+				return opterror(options, "takes no value", flags);
+			if (*rest)
+				continue;
+			p->out[p->cpidx++] = arg - 2;
+			return 0;
+		}
 		if (!rest) {
 			/* abbreviated? */
 			if (!strncmp(options->long_name, arg, arg_end - arg)) {
@@ -242,8 +253,7 @@ static NORETURN void usage_with_options_internal(const char * const *,
 int parse_options(int argc, const char **argv, const struct option *options,
                   const char * const usagestr[], int flags)
 {
-	struct optparse_t args = { argv + 1, argc - 1, NULL };
-	int j = 0;
+	struct optparse_t args = { argv + 1, argv, argc - 1, 0, NULL };
 
 	for (; args.argc; args.argc--, args.argv++) {
 		const char *arg = args.argv[0];
@@ -251,7 +261,7 @@ int parse_options(int argc, const char **argv, const struct option *options,
 		if (*arg != '-' || !arg[1]) {
 			if (flags & PARSE_OPT_STOP_AT_NON_OPTION)
 				break;
-			argv[j++] = args.argv[0];
+			args.out[args.cpidx++] = args.argv[0];
 			continue;
 		}
 
@@ -288,9 +298,9 @@ int parse_options(int argc, const char **argv, const struct option *options,
 			usage_with_options(usagestr, options);
 	}
 
-	memmove(argv + j, args.argv, args.argc * sizeof(*argv));
-	argv[j + args.argc] = NULL;
-	return j + args.argc;
+	memmove(args.out + args.cpidx, args.argv, args.argc * sizeof(*args.out));
+	args.out[args.cpidx + args.argc] = NULL;
+	return args.cpidx + args.argc;
 }
 
 #define USAGE_OPTS_WIDTH 24
@@ -330,6 +340,8 @@ void usage_with_options_internal(const char * const *usagestr,
 			pos += fprintf(stderr, "--%s", opts->long_name);
 
 		switch (opts->type) {
+		case OPTION_ARGUMENT:
+			break;
 		case OPTION_INTEGER:
 			if (opts->flags & PARSE_OPT_OPTARG)
 				pos += fprintf(stderr, " [<n>]");
diff --git a/parse-options.h b/parse-options.h
index 0d40cd2..1af62b0 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -4,6 +4,7 @@
 enum parse_opt_type {
 	/* special types */
 	OPTION_END,
+	OPTION_ARGUMENT,
 	OPTION_GROUP,
 	/* options with no arguments */
 	OPTION_BIT,
@@ -85,6 +86,7 @@ struct option {
 };
 
 #define OPT_END()                   { OPTION_END }
+#define OPT_ARGUMENT(l, h)          { OPTION_ARGUMENT, 0, (l), NULL, NULL, (h) }
 #define OPT_GROUP(h)                { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
 #define OPT_BIT(s, l, v, h, b)      { OPTION_BIT, (s), (l), (v), NULL, (h), 0, NULL, (b) }
 #define OPT_BOOLEAN(s, l, v, h)     { OPTION_BOOLEAN, (s), (l), (v), NULL, (h) }
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index 0e2933a..c23f0ac 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -21,6 +21,9 @@ string options
     --st <st>             get another string (pervert ordering)
     -o <str>              get another string
 
+magic arguments
+    --quux                means --quux
+
 EOF
 
 test_expect_success 'test help' '
@@ -114,4 +117,17 @@ test_expect_success 'detect possible typos' '
 	git diff expect.err output.err
 '
 
+cat > expect <<EOF
+boolean: 0
+integer: 0
+string: (not set)
+arg 00: --quux
+EOF
+
+test_expect_success 'keep some options as arguments' '
+	test-parse-options --quux > output 2> output.err &&
+        test ! -s output.err &&
+        git diff expect output
+'
+
 test_done
diff --git a/test-parse-options.c b/test-parse-options.c
index eed8a02..73360d7 100644
--- a/test-parse-options.c
+++ b/test-parse-options.c
@@ -20,6 +20,8 @@ int main(int argc, const char **argv)
 		OPT_STRING(0, "string2", &string, "str", "get another string"),
 		OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
 		OPT_STRING('o', NULL, &string, "str", "get another string"),
+		OPT_GROUP("magic arguments"),
+		OPT_ARGUMENT("quux", "means --quux"),
 		OPT_END(),
 	};
 	int i;
-- 
1.5.4.3.471.ga96e8.dirty

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-03-02 10:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-02  8:21 [PATCH] parse-opt: bring PARSE_OPT_HIDDEN to git-rev-parse --parseopt Pierre Habouzit
2008-03-02 10:35 ` [PATCH 2/3] parse-options: bring PARSE_OPT_NONEG " Pierre Habouzit
2008-03-02 10:35 ` [PATCH 3/3] parse-options: new option type to treat an option-like parameter as an argument Pierre Habouzit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).