aboutsummaryrefslogtreecommitdiffstats
path: root/parse-options.c
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2024-01-21 18:56:39 +0100
committerJunio C Hamano <gitster@pobox.com>2024-01-22 07:17:12 -0800
commit457f96252fcfd64127f71e8663e2e4b6dfd4576c (patch)
tree4a1d41ec37d7cf146778f030a6c52c88e9ad4014 /parse-options.c
parent5825268db1058516d05be03d6a8d8d55eea5a943 (diff)
downloadgit-457f96252fcfd64127f71e8663e2e4b6dfd4576c.tar.gz
parse-options: simplify positivation handling
We accept the positive version of options whose long name starts with "no-" and are defined without the flag PARSE_OPT_NONEG. E.g. git clone has an explicitly defined --no-checkout option and also implicitly accepts --checkout to override it. parse_long_opt() handles that by restarting the option matching with the positive version when it finds that only the current option definition starts with "no-", but not the user-supplied argument. This code is located almost at the end of the matching logic. Avoid the need for a restart by moving the code up. We don't have to check the positive arg against the negative long_name at all -- the "no-" prefix of the latter makes a match impossible. Skip it and toggle OPT_UNSET right away to simplify the control flow. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'parse-options.c')
-rw-r--r--parse-options.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/parse-options.c b/parse-options.c
index 0dd07eec82..e4fda09af4 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -369,7 +369,11 @@ static enum parse_opt_result parse_long_opt(
if (!long_name)
continue;
-again:
+ if (!starts_with(arg, "no-") &&
+ !(options->flags & PARSE_OPT_NONEG) &&
+ skip_prefix(long_name, "no-", &long_name))
+ opt_flags |= OPT_UNSET;
+
if (!skip_prefix(arg, long_name, &rest))
rest = NULL;
if (!rest) {
@@ -403,13 +407,8 @@ is_abbreviated:
goto is_abbreviated;
}
/* negated? */
- if (!starts_with(arg, "no-")) {
- if (skip_prefix(long_name, "no-", &long_name)) {
- opt_flags |= OPT_UNSET;
- goto again;
- }
+ if (!starts_with(arg, "no-"))
continue;
- }
flags |= OPT_UNSET;
if (!skip_prefix(arg + 3, long_name, &rest)) {
/* abbreviated and negated? */