mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-10 16:54:08 -05:00
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:
committed by
Junio C Hamano
parent
916b96c0ec
commit
a6e0ccbd38
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
9
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);
|
||||
|
||||
Reference in New Issue
Block a user