parse-opt: ignore negation of OPT_NONEG for ambiguity checks
parse_long_opt always matches both --opt and --no-opt for any option "opt", and only get_value checks whether --no-opt is actually valid. Since the options for git branch contains both "no-merged" and "merged" there are two matches for --no-merge, but no exact match. With this patch the negation of a NONEG option is rejected earlier, but it changes the error message from "option `no-opt' isn't available" to "unknown option `no-opt'". [jk: added test] Signed-off-by: Andreas Schwab <schwab@linux-m68k.org> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
5bdc32d3e5
commit
6bbfd1fa98
@ -230,6 +230,9 @@ is_abbreviated:
|
|||||||
abbrev_flags = flags;
|
abbrev_flags = flags;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
/* negation allowed? */
|
||||||
|
if (options->flags & PARSE_OPT_NONEG)
|
||||||
|
continue;
|
||||||
/* negated and abbreviated very much? */
|
/* negated and abbreviated very much? */
|
||||||
if (!prefixcmp("no-", arg)) {
|
if (!prefixcmp("no-", arg)) {
|
||||||
flags |= OPT_UNSET;
|
flags |= OPT_UNSET;
|
||||||
|
@ -33,6 +33,8 @@ Magic arguments
|
|||||||
--quux means --quux
|
--quux means --quux
|
||||||
-NUM set integer to NUM
|
-NUM set integer to NUM
|
||||||
+ same as -b
|
+ same as -b
|
||||||
|
--ambiguous positive ambiguity
|
||||||
|
--no-ambiguous negative ambiguity
|
||||||
|
|
||||||
Standard options
|
Standard options
|
||||||
--abbrev[=<n>] use <n> digits to display SHA-1s
|
--abbrev[=<n>] use <n> digits to display SHA-1s
|
||||||
@ -315,4 +317,22 @@ test_expect_success 'OPT_NUMBER_CALLBACK() works' '
|
|||||||
test_cmp expect output
|
test_cmp expect output
|
||||||
'
|
'
|
||||||
|
|
||||||
|
cat >expect <<EOF
|
||||||
|
boolean: 0
|
||||||
|
integer: 0
|
||||||
|
timestamp: 0
|
||||||
|
string: (not set)
|
||||||
|
abbrev: 7
|
||||||
|
verbose: 0
|
||||||
|
quiet: no
|
||||||
|
dry run: no
|
||||||
|
file: (not set)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'negation of OPT_NONEG flags is not ambiguous' '
|
||||||
|
test-parse-options --no-ambig >output 2>output.err &&
|
||||||
|
test ! -s output.err &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -8,6 +8,7 @@ static int abbrev = 7;
|
|||||||
static int verbose = 0, dry_run = 0, quiet = 0;
|
static int verbose = 0, dry_run = 0, quiet = 0;
|
||||||
static char *string = NULL;
|
static char *string = NULL;
|
||||||
static char *file = NULL;
|
static char *file = NULL;
|
||||||
|
static int ambiguous;
|
||||||
|
|
||||||
static int length_callback(const struct option *opt, const char *arg, int unset)
|
static int length_callback(const struct option *opt, const char *arg, int unset)
|
||||||
{
|
{
|
||||||
@ -59,6 +60,10 @@ int main(int argc, const char **argv)
|
|||||||
number_callback),
|
number_callback),
|
||||||
{ OPTION_BOOLEAN, '+', NULL, &boolean, NULL, "same as -b",
|
{ OPTION_BOOLEAN, '+', NULL, &boolean, NULL, "same as -b",
|
||||||
PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH },
|
PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH },
|
||||||
|
{ OPTION_BOOLEAN, 0, "ambiguous", &ambiguous, NULL,
|
||||||
|
"positive ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
|
||||||
|
{ OPTION_BOOLEAN, 0, "no-ambiguous", &ambiguous, NULL,
|
||||||
|
"negative ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
|
||||||
OPT_GROUP("Standard options"),
|
OPT_GROUP("Standard options"),
|
||||||
OPT__ABBREV(&abbrev),
|
OPT__ABBREV(&abbrev),
|
||||||
OPT__VERBOSE(&verbose),
|
OPT__VERBOSE(&verbose),
|
||||||
|
Loading…
Reference in New Issue
Block a user