Changes since v1: - make sure we save/restore env for external commands in 2/3 - fix t0001 test in 3/3 Interdiff: diff --git b/git.c a/git.c index 83b6c56..da278c3 100644 --- b/git.c +++ a/git.c @@ -229,7 +229,6 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) static int handle_alias(int *argcp, const char ***argv) { int envchanged = 0, ret = 0, saved_errno = errno; - const char *subdir; int count, option_count; const char **new_argv; const char *alias_command; @@ -237,7 +236,7 @@ static int handle_alias(int *argcp, const char ***argv) int unused_nongit; save_env_before_alias(); - subdir = setup_git_directory_gently(&unused_nongit); + setup_git_directory_gently(&unused_nongit); alias_command = (*argv)[0]; alias_string = alias_lookup(alias_command); @@ -296,8 +295,7 @@ static int handle_alias(int *argcp, const char ***argv) ret = 1; } - if (subdir && chdir(subdir)) - die_errno("Cannot change to '%s'", subdir); + restore_env(0); errno = saved_errno; @@ -534,9 +532,13 @@ static void handle_builtin(int argc, const char **argv) builtin = get_builtin(cmd); if (builtin) { - if (saved_env_before_alias) - restore_env(0); - else + /* + * XXX: if we can figure out cases where it is _safe_ + * to do, we can avoid spawning a new process when + * saved_env_before_alias is true + * (i.e. setup_git_dir* has been run once) + */ + if (!saved_env_before_alias) exit(run_builtin(builtin, argc, argv)); } } diff --git b/t/t0001-init.sh a/t/t0001-init.sh index 19539fc..295aa59 100755 --- b/t/t0001-init.sh +++ a/t/t0001-init.sh @@ -88,24 +88,14 @@ test_expect_success 'plain nested in bare through aliased command' ' ' test_expect_success 'No extra GIT_* on alias scripts' ' - cat <<-\EOF >expected && - GIT_ATTR_NOSYSTEM - GIT_AUTHOR_EMAIL - GIT_AUTHOR_NAME - GIT_COMMITTER_EMAIL - GIT_COMMITTER_NAME - GIT_CONFIG_NOSYSTEM - GIT_EXEC_PATH - GIT_MERGE_AUTOEDIT - GIT_MERGE_VERBOSITY - GIT_PREFIX - GIT_TEMPLATE_DIR - GIT_TEXTDOMAINDIR - GIT_TRACE_BARE - EOF + ( + env | sed -ne "/^GIT_/s/=.*//p" && + echo GIT_PREFIX && # setup.c + echo GIT_TEXTDOMAINDIR # wrapper-for-bin.sh + ) | sort | uniq >expected && cat <<-\EOF >script && #!/bin/sh - env | grep GIT_ | sed "s/=.*//" | sort >actual + env | sed -ne "/^GIT_/s/=.*//p" | sort >actual exit 0 EOF chmod 755 script && Nguyễn Thái Ngọc Duy (3): git.c: make it clear save_env() is for alias handling only setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when .. git.c: make sure we do not leak GIT_* to alias scripts environment.c | 2 -- git.c | 41 +++++++++++++++++++++++------------------ t/t0001-init.sh | 17 +++++++++++++++++ t/t5601-clone.sh | 23 +++++++++++++++++++++++ 4 files changed, 63 insertions(+), 20 deletions(-) -- 2.3.0.rc1.137.g477eb31 -- 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