Hi Peff, On Sat, 10 Jun 2017, Jeff King wrote: > On Thu, Jun 08, 2017 at 09:53:53PM +0200, Johannes Schindelin wrote: > > > @@ -245,36 +201,37 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) > > > > static int handle_alias(int *argcp, const char ***argv) > > { > > + struct strbuf cdup_dir = STRBUF_INIT; > > int envchanged = 0, ret = 0, saved_errno = errno; > > int count, option_count; > > const char **new_argv; > > const char *alias_command; > > char *alias_string; > > - int unused_nongit; > > - > > - save_env_before_alias(); > > - setup_git_directory_gently(&unused_nongit); > > > > alias_command = (*argv)[0]; > > - alias_string = alias_lookup(alias_command, NULL); > > + alias_string = alias_lookup(alias_command, &cdup_dir); > > if (alias_string) { > > if (alias_string[0] == '!') { > > struct child_process child = CHILD_PROCESS_INIT; > > > > + if (cdup_dir.len) > > + setup_git_directory(); > > + > > I'm really confused here. We went to all the trouble to record the > cdup_dir as part of the alias lookup so that we could make sure to > chdir() to it. Right, that was my first idea. But then the test suite taught me that we set at least GIT_PREFIX and that tests break (or, in other words, promises Git made earlier) if those variables are not set. So as a quick fix, I simply called setup_git_directory() instead of chdir(cdup_dir.buf). > I understand why you must use setup_git_directory() and not just a > chdir(), because the latter sets up variables like GIT_PREFIX and > GIT_DIR that the shell alias may be depending on. Exactly. > But couldn't we just unconditionally do: > > setup_git_directory_gently(); But of course we can do that! Why on earth did I not think of that... Will change the code accordingly. Ciao, Dscho