diff options
author | René Scharfe <l.s.r@web.de> | 2024-03-03 13:19:41 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2024-03-03 18:49:21 +0100 |
commit | 0d8a3097c74ed3b78442c4d533f3427316596a46 (patch) | |
tree | 3a06f5cef0415bdd9ee8767ee16e8adb79045481 /t/t1502-rev-parse-parseopt.sh | |
parent | parse-options: factor out register_abbrev() and struct parsed_option (diff) | |
download | git-0d8a3097c74ed3b78442c4d533f3427316596a46.tar.xz git-0d8a3097c74ed3b78442c4d533f3427316596a46.zip |
parse-options: detect ambiguous self-negation
Git currently does not detect the ambiguity of an option that starts
with "no" like --notes and its negated form if given just --n or --no.
All Git commands with such options have other negatable options, and
we detect the ambiguity with them, so that's currently only a potential
problem for scripts that use git rev-parse --parseopt.
Let's fix it nevertheless, as there's no need for that confusion. To
detect the ambiguity we have to loosen the check in register_abbrev(),
as an option is considered an alias of itself. Add non-matching
negation flags as a criterion to recognize an option being ambiguous
with its negated form.
And we need to keep going after finding a non-negated option as an
abbreviated candidate and perform the negation checks in the same
loop.
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t1502-rev-parse-parseopt.sh')
-rwxr-xr-x | t/t1502-rev-parse-parseopt.sh | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index f0737593c3..b754b9fd74 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -322,4 +322,15 @@ check_invalid_long_option optionspec-neg --no-positive-only check_invalid_long_option optionspec-neg --negative check_invalid_long_option optionspec-neg --no-no-negative +test_expect_success 'ambiguous: --no matches both --noble and --no-noble' ' + cat >spec <<-\EOF && + some-command [options] + -- + noble The feudal switch. + EOF + test_expect_code 129 env GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \ + git rev-parse --parseopt -- <spec 2>err --no && + grep "error: ambiguous option: no (could be --noble or --no-noble)" err +' + test_done |