autocorrect: use mode and delay instead of magic numbers

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>
This commit is contained in:
Jiamu Sun
2026-03-17 00:36:17 +09:00
committed by Junio C Hamano
parent 916b96c0ec
commit a6e0ccbd38
3 changed files with 42 additions and 33 deletions

View 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);
if (!conf->delay)
conf->mode = AUTOCORRECT_SHOW;
else if (conf->delay < 0 || conf->delay == 1)
conf->mode = AUTOCORRECT_IMMEDIATELY;
}
*out = parsed;
}
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);
}
}

View 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 */

9
help.c
View File

@@ -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);