]> git.ipfire.org Git - thirdparty/git.git/commitdiff
autocorrect: use mode and delay instead of magic numbers
authorJiamu Sun <39@barroit.sh>
Mon, 16 Mar 2026 15:36:17 +0000 (00:36 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Mar 2026 18:21:07 +0000 (11:21 -0700)
Drop magic numbers and describe autocorrect config with a mode enum and
an integer delay. This reduces errors when mutating config values and
makes the values easier to access.

Signed-off-by: Jiamu Sun <39@barroit.sh>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
autocorrect.c
autocorrect.h
help.c

index 887d2396da44b98edd687b0a539f7b8f308842cb..2484546fc731d9ad3a28cebce0faa190fef65024 100644 (file)
@@ -6,7 +6,7 @@
 #include "prompt.h"
 #include "gettext.h"
 
-static int parse_autocorrect(const char *value)
+static enum autocorrect_mode parse_autocorrect(const char *value)
 {
        switch (git_parse_maybe_bool_text(value)) {
        case 1:
@@ -19,49 +19,49 @@ static int parse_autocorrect(const char *value)
 
        if (!strcmp(value, "prompt"))
                return AUTOCORRECT_PROMPT;
-       if (!strcmp(value, "never"))
+       else if (!strcmp(value, "never"))
                return AUTOCORRECT_NEVER;
-       if (!strcmp(value, "immediate"))
+       else if (!strcmp(value, "immediate"))
                return AUTOCORRECT_IMMEDIATELY;
-       if (!strcmp(value, "show"))
+       else if (!strcmp(value, "show"))
                return AUTOCORRECT_SHOW;
-
-       return 0;
+       else
+               return AUTOCORRECT_DELAY;
 }
 
 void autocorrect_resolve_config(const char *var, const char *value,
                                const struct config_context *ctx, void *data)
 {
-       int *out = data;
-       int parsed;
+       struct autocorrect *conf = data;
 
        if (strcmp(var, "help.autocorrect"))
                return;
 
-       parsed = parse_autocorrect(value);
+       conf->mode = parse_autocorrect(value);
 
        /*
         * Disable autocorrection prompt in a non-interactive session
         */
-       if (parsed == AUTOCORRECT_PROMPT && (!isatty(0) || !isatty(2)))
-               parsed = AUTOCORRECT_NEVER;
+       if (conf->mode == AUTOCORRECT_PROMPT && (!isatty(0) || !isatty(2)))
+               conf->mode = AUTOCORRECT_NEVER;
 
-       if (!parsed) {
-               parsed = git_config_int(var, value, ctx->kvi);
-               if (parsed < 0 || parsed == 1)
-                       parsed = AUTOCORRECT_IMMEDIATELY;
-       }
+       if (conf->mode == AUTOCORRECT_DELAY) {
+               conf->delay = git_config_int(var, value, ctx->kvi);
 
-       *out = parsed;
+               if (!conf->delay)
+                       conf->mode = AUTOCORRECT_SHOW;
+               else if (conf->delay < 0 || conf->delay == 1)
+                       conf->mode = AUTOCORRECT_IMMEDIATELY;
+       }
 }
 
-void autocorrect_confirm(int autocorrect, const char *assumed)
+void autocorrect_confirm(struct autocorrect *conf, const char *assumed)
 {
-       if (autocorrect == AUTOCORRECT_IMMEDIATELY) {
+       if (conf->mode == AUTOCORRECT_IMMEDIATELY) {
                fprintf_ln(stderr,
                           _("Continuing under the assumption that you meant '%s'."),
                           assumed);
-       } else if (autocorrect == AUTOCORRECT_PROMPT) {
+       } else if (conf->mode == AUTOCORRECT_PROMPT) {
                char *answer;
                struct strbuf msg = STRBUF_INIT;
 
@@ -71,10 +71,10 @@ void autocorrect_confirm(int autocorrect, const char *assumed)
 
                if (!(starts_with(answer, "y") || starts_with(answer, "Y")))
                        exit(1);
-       } else {
+       } else if (conf->mode == AUTOCORRECT_DELAY) {
                fprintf_ln(stderr,
                           _("Continuing in %0.1f seconds, assuming that you meant '%s'."),
-                          (float)autocorrect / 10.0, assumed);
-               sleep_millisec(autocorrect * 100);
+                          conf->delay / 10.0, assumed);
+               sleep_millisec(conf->delay * 100);
        }
 }
index f5fadf9d96059b9862c982360bbfd571729bb044..5506a36f11a7ccea5f8cf0c615455bf690b1e51d 100644 (file)
@@ -1,16 +1,24 @@
 #ifndef AUTOCORRECT_H
 #define AUTOCORRECT_H
 
-#define AUTOCORRECT_SHOW (-4)
-#define AUTOCORRECT_PROMPT (-3)
-#define AUTOCORRECT_NEVER (-2)
-#define AUTOCORRECT_IMMEDIATELY (-1)
-
 struct config_context;
 
+enum autocorrect_mode {
+       AUTOCORRECT_SHOW,
+       AUTOCORRECT_NEVER,
+       AUTOCORRECT_PROMPT,
+       AUTOCORRECT_IMMEDIATELY,
+       AUTOCORRECT_DELAY,
+};
+
+struct autocorrect {
+       enum autocorrect_mode mode;
+       int delay;
+};
+
 void autocorrect_resolve_config(const char *var, const char *value,
                                const struct config_context *ctx, void *data);
 
-void autocorrect_confirm(int autocorrect, const char *assumed);
+void autocorrect_confirm(struct autocorrect *conf, const char *assumed);
 
 #endif /* AUTOCORRECT_H */
diff --git a/help.c b/help.c
index 983057970e7c7fe451f97c2e5304c8050f64a6fe..a89ac5aced999435712ad1b45b185a950684a0e8 100644 (file)
--- a/help.c
+++ b/help.c
@@ -538,7 +538,7 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 }
 
 struct help_unknown_cmd_config {
-       int autocorrect;
+       struct autocorrect autocorrect;
        struct cmdnames aliases;
 };
 
@@ -607,7 +607,7 @@ char *help_unknown_cmd(const char *cmd)
 
        read_early_config(the_repository, git_unknown_cmd_config, &cfg);
 
-       if (cfg.autocorrect == AUTOCORRECT_NEVER) {
+       if (cfg.autocorrect.mode == AUTOCORRECT_NEVER) {
                fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
                exit(1);
        }
@@ -673,7 +673,8 @@ char *help_unknown_cmd(const char *cmd)
                     n++)
                        ; /* still counting */
        }
-       if (cfg.autocorrect && cfg.autocorrect != AUTOCORRECT_SHOW && n == 1 &&
+
+       if (cfg.autocorrect.mode != AUTOCORRECT_SHOW && n == 1 &&
            SIMILAR_ENOUGH(best_similarity)) {
                char *assumed = xstrdup(main_cmds.names[0]->name);
 
@@ -682,7 +683,7 @@ char *help_unknown_cmd(const char *cmd)
                             "which does not exist."),
                           cmd);
 
-               autocorrect_confirm(cfg.autocorrect, assumed);
+               autocorrect_confirm(&cfg.autocorrect, assumed);
 
                cmdnames_release(&cfg.aliases);
                cmdnames_release(&main_cmds);