From: Junio C Hamano Date: Sun, 18 Jan 2009 07:05:34 +0000 (-0800) Subject: Merge branch 'as/autocorrect-alias' X-Git-Tag: v1.6.2-rc0~140 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5786f4fac7afa881a306e2b771a0307e4ee05384?ds=inline;hp=-c Merge branch 'as/autocorrect-alias' * as/autocorrect-alias: git.c: make autocorrected aliases work --- 5786f4fac7afa881a306e2b771a0307e4ee05384 diff --combined git.c index a53e24feae,ee331aabc6..ecc8fad09a --- a/git.c +++ b/git.c @@@ -158,7 -158,7 +158,7 @@@ static int handle_alias(int *argcp, con if (ret >= 0 && WIFEXITED(ret) && WEXITSTATUS(ret) != 127) exit(WEXITSTATUS(ret)); - die("Failed to run '%s' when expanding alias '%s'\n", + die("Failed to run '%s' when expanding alias '%s'", alias_string + 1, alias_command); } count = split_cmdline(alias_string, &new_argv); @@@ -416,12 -416,34 +416,34 @@@ static void execv_dashed_external(cons 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; /* * Take the basename of argv[0] as the command @@@ -479,31 -501,22 +501,22 @@@ 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)) + static int done_help = 0; + static int was_alias = 0; + was_alias = run_argv(&argc, &argv); + if (errno != ENOENT) break; - done_alias = 1; - } - - 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); + if (!done_help) { + cmd = argv[0] = help_unknown_cmd(cmd); + done_help = 1; + } else + break; } fprintf(stderr, "Failed to run command '%s': %s\n",