diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-10-16 16:15:59 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-10-16 16:15:59 +0900 |
commit | 506ee60d222f94a1598769feaba3b3621bd9fa1a (patch) | |
tree | 3968c7bb84c944483266f25de658b5882c919047 /git.c | |
parent | Merge branch 'ds/commit-graph-with-grafts' (diff) | |
parent | t0014: introduce an alias testing suite (diff) | |
download | tgif-506ee60d222f94a1598769feaba3b3621bd9fa1a.tar.xz |
Merge branch 'ts/alias-of-alias'
An alias that expands to another alias has so far been forbidden,
but now it is allowed to create such an alias.
* ts/alias-of-alias:
t0014: introduce an alias testing suite
alias: show the call history when an alias is looping
alias: add support for aliases of an alias
Diffstat (limited to 'git.c')
-rw-r--r-- | git.c | 28 |
1 files changed, 25 insertions, 3 deletions
@@ -675,6 +675,8 @@ static void execv_dashed_external(const char **argv) static int run_argv(int *argcp, const char ***argv) { int done_alias = 0; + struct string_list cmd_list = STRING_LIST_INIT_NODUP; + struct string_list_item *seen; while (1) { /* @@ -692,17 +694,37 @@ static int run_argv(int *argcp, const char ***argv) /* .. then try the external ones */ execv_dashed_external(*argv); - /* It could be an alias -- this works around the insanity + seen = unsorted_string_list_lookup(&cmd_list, *argv[0]); + if (seen) { + int i; + struct strbuf sb = STRBUF_INIT; + for (i = 0; i < cmd_list.nr; i++) { + struct string_list_item *item = &cmd_list.items[i]; + + strbuf_addf(&sb, "\n %s", item->string); + if (item == seen) + strbuf_addstr(&sb, " <=="); + else if (i == cmd_list.nr - 1) + strbuf_addstr(&sb, " ==>"); + } + die(_("alias loop detected: expansion of '%s' does" + " not terminate:%s"), cmd_list.items[0].string, sb.buf); + } + + string_list_append(&cmd_list, *argv[0]); + + /* + * 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) - break; if (!handle_alias(argcp, argv)) break; done_alias = 1; } + string_list_clear(&cmd_list, 0); + return done_alias; } |