Thread (25 messages) flat view 25 messages, 3 authors, 2016-06-15

Re: [PATCH v3 01/13] parse-options: stop when encounter a non-option

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:49:07

Bo Yang [off-list ref] writes:
Subject: Re: [PATCH v3 01/13] parse-options: stop when encounter a non-option

We support the syntax like:
-L n1,m1 pathspec1 -L n2,m2 pathspec2.

Make the parse-options API not stop when encounter a
non-option argument, report the status and go on parsing
the remain options.
-ECANTPARSE

Read the above again and wonder...

Does it stop, like the subject line says, or does it not stop???

Perhaps you meant to say something like this...

  Subject: [PATCH v3 01/13] parse-options: enhance STOP_AT_NON_OPTION

  Make parse_options_step() report PARSE_OPT_NON_OPTION, instead of
  PARSE_OPT_DONE, to the caller, when it sees a non-option argument.  

  This will help implementing a nonstandard option syntax that takes more
  than one parameters to an option, e.g.

      -L n1,m1 pathspec1 -L n2,m2 pathspec2

  by directly calling parse_options_step().  The parse_options() API only
  calls parse_options_step() once, and its callers are not affected by
  this change.

  Thanks-to: Jonathan Nieder [off-list ref]
  Signed-off-by: Bo Yang [off-list ref]

Currently blame and shortlog seems to use parse_options_step() but neither
of them uses STOP_AT_NON_OPTION, so this change shouldn't break them.
quoted hunk ↗ jump to hunk
Thanks-to: Jonathan Nieder [off-list ref]
Signed-off-by: Bo Yang <redacted>
---
 parse-options.c |    3 ++-
 parse-options.h |    3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 0fa79bc..cbb49d3 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -374,7 +374,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
 			if (parse_nodash_opt(ctx, arg, options) == 0)
 				continue;
 			if (ctx->flags & PARSE_OPT_STOP_AT_NON_OPTION)
-				break;
+				return PARSE_OPT_NON_OPTION;
 			ctx->out[ctx->cpidx++] = ctx->argv[0];
 			continue;
 		}
@@ -456,6 +456,7 @@ int parse_options(int argc, const char **argv, const char *prefix,
 	switch (parse_options_step(&ctx, options, usagestr)) {
 	case PARSE_OPT_HELP:
 		exit(129);
+	case PARSE_OPT_NON_OPTION:
 	case PARSE_OPT_DONE:
 		break;
 	default: /* PARSE_OPT_UNKNOWN */
diff --git a/parse-options.h b/parse-options.h
index 7435cdb..407697a 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -161,7 +161,8 @@ extern NORETURN void usage_msg_opt(const char *msg,
 enum {
 	PARSE_OPT_HELP = -1,
 	PARSE_OPT_DONE,
-	PARSE_OPT_UNKNOWN
+	PARSE_OPT_NON_OPTION,
+	PARSE_OPT_UNKNOWN,
 };
 
 /*
-- 
1.7.0.2.273.gc2413.dirty
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help