Skip to content

Commit a6e0ccb

Browse files
barroitgitster
authored andcommitted
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>
1 parent 916b96c commit a6e0ccb

3 files changed

Lines changed: 42 additions & 33 deletions

File tree

autocorrect.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "prompt.h"
77
#include "gettext.h"
88

9-
static int parse_autocorrect(const char *value)
9+
static enum autocorrect_mode parse_autocorrect(const char *value)
1010
{
1111
switch (git_parse_maybe_bool_text(value)) {
1212
case 1:
@@ -19,49 +19,49 @@ static int parse_autocorrect(const char *value)
1919

2020
if (!strcmp(value, "prompt"))
2121
return AUTOCORRECT_PROMPT;
22-
if (!strcmp(value, "never"))
22+
else if (!strcmp(value, "never"))
2323
return AUTOCORRECT_NEVER;
24-
if (!strcmp(value, "immediate"))
24+
else if (!strcmp(value, "immediate"))
2525
return AUTOCORRECT_IMMEDIATELY;
26-
if (!strcmp(value, "show"))
26+
else if (!strcmp(value, "show"))
2727
return AUTOCORRECT_SHOW;
28-
29-
return 0;
28+
else
29+
return AUTOCORRECT_DELAY;
3030
}
3131

3232
void autocorrect_resolve_config(const char *var, const char *value,
3333
const struct config_context *ctx, void *data)
3434
{
35-
int *out = data;
36-
int parsed;
35+
struct autocorrect *conf = data;
3736

3837
if (strcmp(var, "help.autocorrect"))
3938
return;
4039

41-
parsed = parse_autocorrect(value);
40+
conf->mode = parse_autocorrect(value);
4241

4342
/*
4443
* Disable autocorrection prompt in a non-interactive session
4544
*/
46-
if (parsed == AUTOCORRECT_PROMPT && (!isatty(0) || !isatty(2)))
47-
parsed = AUTOCORRECT_NEVER;
45+
if (conf->mode == AUTOCORRECT_PROMPT && (!isatty(0) || !isatty(2)))
46+
conf->mode = AUTOCORRECT_NEVER;
4847

49-
if (!parsed) {
50-
parsed = git_config_int(var, value, ctx->kvi);
51-
if (parsed < 0 || parsed == 1)
52-
parsed = AUTOCORRECT_IMMEDIATELY;
53-
}
48+
if (conf->mode == AUTOCORRECT_DELAY) {
49+
conf->delay = git_config_int(var, value, ctx->kvi);
5450

55-
*out = parsed;
51+
if (!conf->delay)
52+
conf->mode = AUTOCORRECT_SHOW;
53+
else if (conf->delay < 0 || conf->delay == 1)
54+
conf->mode = AUTOCORRECT_IMMEDIATELY;
55+
}
5656
}
5757

58-
void autocorrect_confirm(int autocorrect, const char *assumed)
58+
void autocorrect_confirm(struct autocorrect *conf, const char *assumed)
5959
{
60-
if (autocorrect == AUTOCORRECT_IMMEDIATELY) {
60+
if (conf->mode == AUTOCORRECT_IMMEDIATELY) {
6161
fprintf_ln(stderr,
6262
_("Continuing under the assumption that you meant '%s'."),
6363
assumed);
64-
} else if (autocorrect == AUTOCORRECT_PROMPT) {
64+
} else if (conf->mode == AUTOCORRECT_PROMPT) {
6565
char *answer;
6666
struct strbuf msg = STRBUF_INIT;
6767

@@ -71,10 +71,10 @@ void autocorrect_confirm(int autocorrect, const char *assumed)
7171

7272
if (!(starts_with(answer, "y") || starts_with(answer, "Y")))
7373
exit(1);
74-
} else {
74+
} else if (conf->mode == AUTOCORRECT_DELAY) {
7575
fprintf_ln(stderr,
7676
_("Continuing in %0.1f seconds, assuming that you meant '%s'."),
77-
(float)autocorrect / 10.0, assumed);
78-
sleep_millisec(autocorrect * 100);
77+
conf->delay / 10.0, assumed);
78+
sleep_millisec(conf->delay * 100);
7979
}
8080
}

autocorrect.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
#ifndef AUTOCORRECT_H
22
#define AUTOCORRECT_H
33

4-
#define AUTOCORRECT_SHOW (-4)
5-
#define AUTOCORRECT_PROMPT (-3)
6-
#define AUTOCORRECT_NEVER (-2)
7-
#define AUTOCORRECT_IMMEDIATELY (-1)
8-
94
struct config_context;
105

6+
enum autocorrect_mode {
7+
AUTOCORRECT_SHOW,
8+
AUTOCORRECT_NEVER,
9+
AUTOCORRECT_PROMPT,
10+
AUTOCORRECT_IMMEDIATELY,
11+
AUTOCORRECT_DELAY,
12+
};
13+
14+
struct autocorrect {
15+
enum autocorrect_mode mode;
16+
int delay;
17+
};
18+
1119
void autocorrect_resolve_config(const char *var, const char *value,
1220
const struct config_context *ctx, void *data);
1321

14-
void autocorrect_confirm(int autocorrect, const char *assumed);
22+
void autocorrect_confirm(struct autocorrect *conf, const char *assumed);
1523

1624
#endif /* AUTOCORRECT_H */

help.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
538538
}
539539

540540
struct help_unknown_cmd_config {
541-
int autocorrect;
541+
struct autocorrect autocorrect;
542542
struct cmdnames aliases;
543543
};
544544

@@ -607,7 +607,7 @@ char *help_unknown_cmd(const char *cmd)
607607

608608
read_early_config(the_repository, git_unknown_cmd_config, &cfg);
609609

610-
if (cfg.autocorrect == AUTOCORRECT_NEVER) {
610+
if (cfg.autocorrect.mode == AUTOCORRECT_NEVER) {
611611
fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
612612
exit(1);
613613
}
@@ -673,7 +673,8 @@ char *help_unknown_cmd(const char *cmd)
673673
n++)
674674
; /* still counting */
675675
}
676-
if (cfg.autocorrect && cfg.autocorrect != AUTOCORRECT_SHOW && n == 1 &&
676+
677+
if (cfg.autocorrect.mode != AUTOCORRECT_SHOW && n == 1 &&
677678
SIMILAR_ENOUGH(best_similarity)) {
678679
char *assumed = xstrdup(main_cmds.names[0]->name);
679680

@@ -682,7 +683,7 @@ char *help_unknown_cmd(const char *cmd)
682683
"which does not exist."),
683684
cmd);
684685

685-
autocorrect_confirm(cfg.autocorrect, assumed);
686+
autocorrect_confirm(&cfg.autocorrect, assumed);
686687

687688
cmdnames_release(&cfg.aliases);
688689
cmdnames_release(&main_cmds);

0 commit comments

Comments
 (0)