help_unknown_cmd() is able to autocorrect a command to an alias, and not only to internal or external commands. However, main() was not passing the autocorrected command through handle_alias(), hence it failed if it was an alias. This commit makes the autocorrected command go through handle_alias, once handle_internal_command() and execv_dashed_external() have been tried. Since this is done twice in main() now, moved that logic to a new run_argv() function. Signed-off-by: Adeodato Simó <dato@xxxxxxxxxxxxxx> --- git.c | 46 +++++++++++++++++++++++++++------------------- 1 files changed, 27 insertions(+), 19 deletions(-) diff --git a/git.c b/git.c index e0d9071..f443b4c 100644 --- a/git.c +++ b/git.c @@ -416,12 +416,35 @@ static void execv_dashed_external(const char **argv) strbuf_release(&cmd); } +static int run_argv(int *argcp, const char ***argv) +{ + int done_alias = 0; + + while (1) { + /* See if it's an internal command */ + handle_internal_command(*argcp, *argv); + + /* .. then try the external ones */ + execv_dashed_external(*argv); + + /* It could be an alias -- this works around the insanity + * of overriding "git log" with "git show" by having + * alias.log = show + */ + if (done_alias || !handle_alias(argcp, argv)) + break; + done_alias = 1; + } + + return done_alias; +} + int main(int argc, const char **argv) { const char *cmd = argv[0] && *argv[0] ? argv[0] : "git-help"; char *slash = (char *)cmd + strlen(cmd); - int done_alias = 0; + int was_alias = 0; /* * Take the basename of argv[0] as the command @@ -478,32 +501,17 @@ int main(int argc, const char **argv) */ setup_path(); - while (1) { - /* See if it's an internal command */ - handle_internal_command(argc, argv); - - /* .. then try the external ones */ - execv_dashed_external(argv); - - /* It could be an alias -- this works around the insanity - * of overriding "git log" with "git show" by having - * alias.log = show - */ - if (done_alias || !handle_alias(&argc, &argv)) - break; - done_alias = 1; - } + was_alias = run_argv(&argc, &argv); if (errno == ENOENT) { - if (done_alias) { + if (was_alias) { fprintf(stderr, "Expansion of alias '%s' failed; " "'%s' is not a git-command\n", cmd, argv[0]); exit(1); } argv[0] = help_unknown_cmd(cmd); - handle_internal_command(argc, argv); - execv_dashed_external(argv); + run_argv(&argc, &argv); } fprintf(stderr, "Failed to run command '%s': %s\n", -- 1.6.1.62.g677ca -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html