parse-options: clearer reporting of API misuse
The PARSE_OPT_LASTARG_DEFAULT flag is meant for options like --contains that (1) traditionally had a mandatory argument and (2) have some better behavior to use when appearing in the final position. It makes no sense to combine this with OPTARG, so ever since v1.6.4-rc0~71 (parse-options: add parse_options_check to validate option specs, 2009-07-09) this mistake is flagged with error: `--option` uses incompatible flags LASTARG_DEFAULT and OPTARG and an exit status representing an error in commandline usage. Unfortunately that which might confuse scripters calling such an erroneous program into thinking the _script_ contains an error. Clarify that it is an internal error by dying with a message beginning "error: BUG: ..." and status 128. While at it, clean up parse_options_check to prepare for more checks. Long term, it would be nicer to make such checks happen at compile time. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									9ca1169fd9
								
							
						
					
					
						commit
						1e5ce570ca
					
				|  | @ -11,6 +11,13 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx, | |||
| #define OPT_SHORT 1 | ||||
| #define OPT_UNSET 2 | ||||
|  | ||||
| static int optbug(const struct option *opt, const char *reason) | ||||
| { | ||||
| 	if (opt->long_name) | ||||
| 		return error("BUG: option '%s' %s", opt->long_name, reason); | ||||
| 	return error("BUG: switch '%c' %s", opt->short_name, reason); | ||||
| } | ||||
|  | ||||
| static int opterror(const struct option *opt, const char *reason, int flags) | ||||
| { | ||||
| 	if (flags & OPT_SHORT) | ||||
|  | @ -320,20 +327,12 @@ static void parse_options_check(const struct option *opts) | |||
|  | ||||
| 	for (; opts->type != OPTION_END; opts++) { | ||||
| 		if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) && | ||||
| 		    (opts->flags & PARSE_OPT_OPTARG)) { | ||||
| 			if (opts->long_name) { | ||||
| 				error("`--%s` uses incompatible flags " | ||||
| 				      "LASTARG_DEFAULT and OPTARG", opts->long_name); | ||||
| 			} else { | ||||
| 				error("`-%c` uses incompatible flags " | ||||
| 				      "LASTARG_DEFAULT and OPTARG", opts->short_name); | ||||
| 			} | ||||
| 			err |= 1; | ||||
| 		} | ||||
| 		    (opts->flags & PARSE_OPT_OPTARG)) | ||||
| 			err |= optbug(opts, "uses incompatible flags " | ||||
| 					"LASTARG_DEFAULT and OPTARG"); | ||||
| 	} | ||||
|  | ||||
| 	if (err) | ||||
| 		exit(129); | ||||
| 		exit(128); | ||||
| } | ||||
|  | ||||
| void parse_options_start(struct parse_opt_ctx_t *ctx, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Nieder
						Jonathan Nieder