diff options
| author | René Scharfe <rene.scharfe@lsrfire.ath.cx> | 2012-02-25 20:14:54 +0100 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2012-02-26 15:32:53 -0800 | 
| commit | 0f1930c58754a821bd51087ca4676e6a69cd4d2b (patch) | |
| tree | fa499d19a52980a2a7947e5235a188b813db1287 /parse-options.c | |
| parent | b9e63ddddc8928f39db6658bf6428a9b646e5ea5 (diff) | |
| download | git-0f1930c58754a821bd51087ca4676e6a69cd4d2b.tar.gz | |
parse-options: allow positivation of options starting, with no-
Long options can be negated by adding no- right after the leading
two dashes. This is useful e.g. to override options set by aliases.
For options that are defined to start with no- already, this looks
a bit funny. Allow such options to also be negated by removing the
prefix.
The following thirteen options are affected:
	apply          --no-add
	bisect--helper --no-checkout
	checkout-index --no-create
	clone          --no-checkout --no-hardlinks
	commit         --no-verify   --no-post-rewrite
	format-patch   --no-binary
	hash-object    --no-filters
	read-tree      --no-sparse-checkout
	revert         --no-commit
	show-branch    --no-name
	update-ref     --no-deref
The following five are NOT affected because they are defined with
PARSE_OPT_NONEG or the non-negated version is defined as well:
	branch       --no-merged
	format-patch --no-stat             --no-numbered
	update-index --no-assume-unchanged --no-skip-worktree
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'parse-options.c')
| -rw-r--r-- | parse-options.c | 27 | 
1 files changed, 17 insertions, 10 deletions
| diff --git a/parse-options.c b/parse-options.c index f0098eb8ea..8906841665 100644 --- a/parse-options.c +++ b/parse-options.c @@ -193,13 +193,14 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,  		arg_end = arg + strlen(arg);  	for (; options->type != OPTION_END; options++) { -		const char *rest; -		int flags = 0; +		const char *rest, *long_name = options->long_name; +		int flags = 0, opt_flags = 0; -		if (!options->long_name) +		if (!long_name)  			continue; -		rest = skip_prefix(arg, options->long_name); +again: +		rest = skip_prefix(arg, long_name);  		if (options->type == OPTION_ARGUMENT) {  			if (!rest)  				continue; @@ -212,7 +213,7 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,  		}  		if (!rest) {  			/* abbreviated? */ -			if (!strncmp(options->long_name, arg, arg_end - arg)) { +			if (!strncmp(long_name, arg, arg_end - arg)) {  is_abbreviated:  				if (abbrev_option) {  					/* @@ -227,7 +228,7 @@ is_abbreviated:  				if (!(flags & OPT_UNSET) && *arg_end)  					p->opt = arg_end + 1;  				abbrev_option = options; -				abbrev_flags = flags; +				abbrev_flags = flags ^ opt_flags;  				continue;  			}  			/* negation allowed? */ @@ -239,12 +240,18 @@ is_abbreviated:  				goto is_abbreviated;  			}  			/* negated? */ -			if (strncmp(arg, "no-", 3)) +			if (prefixcmp(arg, "no-")) { +				if (!prefixcmp(long_name, "no-")) { +					long_name += 3; +					opt_flags |= OPT_UNSET; +					goto again; +				}  				continue; +			}  			flags |= OPT_UNSET; -			rest = skip_prefix(arg + 3, options->long_name); +			rest = skip_prefix(arg + 3, long_name);  			/* abbreviated and negated? */ -			if (!rest && !prefixcmp(options->long_name, arg + 3)) +			if (!rest && !prefixcmp(long_name, arg + 3))  				goto is_abbreviated;  			if (!rest)  				continue; @@ -254,7 +261,7 @@ is_abbreviated:  				continue;  			p->opt = rest + 1;  		} -		return get_value(p, options, flags); +		return get_value(p, options, flags ^ opt_flags);  	}  	if (ambiguous_option) | 
