#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:
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;
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);
}
}
#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 */
}
struct help_unknown_cmd_config {
- int autocorrect;
+ struct autocorrect autocorrect;
struct cmdnames aliases;
};
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);
}
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);
"which does not exist."),
cmd);
- autocorrect_confirm(cfg.autocorrect, assumed);
+ autocorrect_confirm(&cfg.autocorrect, assumed);
cmdnames_release(&cfg.aliases);
cmdnames_release(&main_cmds);