Skip to content

Commit

Permalink
help.autocorrect: do not run a command if the command given is junk
Browse files Browse the repository at this point in the history
If a given command is not found, then help.c tries to guess which one the
user could have meant. If help.autocorrect is 0 or unset, then a list of
suggestions is given as long as the dissimilarity between the given command
and the candidates is not excessively high. But if help.autocorrect was
non-zero (i.e., a delay after which the command is run automatically), the
latter restriction on dissimilarity was not obeyed.

In my case, this happened:

 $ git ..daab02
 WARNING: You called a Git command named '..daab02', which does not exist.
 Continuing under the assumption that you meant 'read-tree'
 in 4.0 seconds automatically...

The patch reuses the similarity limit that is also applied when the list of
suggested commands is printed.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
j6t authored and gitster committed Dec 16, 2009
1 parent d79f5d1 commit 06500a0
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions help.c
Expand Up @@ -297,6 +297,9 @@ static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
old->names = NULL;
}

/* An empirically derived magic number */
#define SIMILAR_ENOUGH(x) ((x) < 6)

const char *help_unknown_cmd(const char *cmd)
{
int i, n, best_similarity = 0;
Expand Down Expand Up @@ -331,7 +334,7 @@ const char *help_unknown_cmd(const char *cmd)
n = 1;
while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len)
++n;
if (autocorrect && n == 1) {
if (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
const char *assumed = main_cmds.names[0]->name;
main_cmds.names[0] = NULL;
clean_cmdnames(&main_cmds);
Expand All @@ -349,7 +352,7 @@ const char *help_unknown_cmd(const char *cmd)

fprintf(stderr, "git: '%s' is not a git-command. See 'git --help'.\n", cmd);

if (best_similarity < 6) {
if (SIMILAR_ENOUGH(best_similarity)) {
fprintf(stderr, "\nDid you mean %s?\n",
n < 2 ? "this": "one of these");

Expand Down

0 comments on commit 06500a0

Please sign in to comment.