зеркало из https://github.com/microsoft/git.git
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:
Родитель
5bdc32d3e5
Коммит
6bbfd1fa98
|
@ -230,6 +230,9 @@ is_abbreviated:
|
|||
abbrev_flags = flags;
|
||||
continue;
|
||||
}
|
||||
/* negation allowed? */
|
||||
if (options->flags & PARSE_OPT_NONEG)
|
||||
continue;
|
||||
/* negated and abbreviated very much? */
|
||||
if (!prefixcmp("no-", arg)) {
|
||||
flags |= OPT_UNSET;
|
||||
|
|
|
@ -33,6 +33,8 @@ Magic arguments
|
|||
--quux means --quux
|
||||
-NUM set integer to NUM
|
||||
+ same as -b
|
||||
--ambiguous positive ambiguity
|
||||
--no-ambiguous negative ambiguity
|
||||
|
||||
Standard options
|
||||
--abbrev[=<n>] use <n> digits to display SHA-1s
|
||||
|
@ -315,4 +317,22 @@ test_expect_success 'OPT_NUMBER_CALLBACK() works' '
|
|||
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
|
||||
|
|
|
@ -8,6 +8,7 @@ static int abbrev = 7;
|
|||
static int verbose = 0, dry_run = 0, quiet = 0;
|
||||
static char *string = NULL;
|
||||
static char *file = NULL;
|
||||
static int ambiguous;
|
||||
|
||||
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),
|
||||
{ OPTION_BOOLEAN, '+', NULL, &boolean, NULL, "same as -b",
|
||||
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__ABBREV(&abbrev),
|
||||
OPT__VERBOSE(&verbose),
|
||||
|
|
Загрузка…
Ссылка в новой задаче