help_unknown_cmd: do not propose an "unknown" cmd

When executing an external shell script like `git foo` with a bad shebang, e.g. "#!/usr/bin/not/existing", execvp returns 127 (ENOENT). Since help_unknown_cmd proposes the use of all external commands similar to the name of the "unknown" command, it suggests the just failed command again. Stop it and give some advice to the user. Helped-by: Jeff King <peff@peff.net> Signed-off-by: Michael Schubert <mschub@elegosoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Michael Schubert committed Jul 8, 2011 at 12:08 UTC 823e0ded8a319425496967dcb284e7e3ce2b6c29
1 file changed +12
help.c
+12
@@ -302,6 +302,10 @@ static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
302 #define SIMILARITY_FLOOR 7
303 #define SIMILAR_ENOUGH(x) ((x) < SIMILARITY_FLOOR)
304
305 +static const char bad_interpreter_advice[] =
306 + N_("'%s' appears to be a git command, but we were not\n"
307 + "able to execute it. Maybe git-%s is broken?");
308 +
309 const char *help_unknown_cmd(const char *cmd)
310 {
311 int i, n, best_similarity = 0;
@@ -326,6 +330,14 @@ const char *help_unknown_cmd(const char *cmd)
330 int cmp = 0; /* avoid compiler stupidity */
331 const char *candidate = main_cmds.names[i]->name;
332
333 + /*
334 + * An exact match means we have the command, but
335 + * for some reason exec'ing it gave us ENOENT; probably
336 + * it's a bad interpreter in the #! line.
337 + */
338 + if (!strcmp(candidate, cmd))
339 + die(_(bad_interpreter_advice), cmd, cmd);
340 +
341 /* Does the candidate appear in common_cmds list? */
342 while (n < ARRAY_SIZE(common_cmds) &&
343 (cmp = strcmp(common_cmds[n].name, candidate)) < 0)