* [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).