parse-options: new option type to treat an option-like parameter as an argument.

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

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff --git a/parse-options.c b/parse-options.c
index d9562ba..b32c9ea 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 @@
 			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,14 +253,13 @@
 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];
 
 		if (*arg != '-' || !arg[1]) {
-			argv[j++] = args.argv[0];
+			args.out[args.cpidx++] = args.argv[0];
 			continue;
 		}
 
@@ -286,9 +296,9 @@
 			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
@@ -328,6 +338,8 @@
 			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>]");