If core.bare is true, discard the discovered worktree, move back to original cwd. This change may set GIT_DIR env var to ".git" via set_git_dir(). This bothers alias handling because handle_alias() does 1. prefix = setup_git_directory_gently(..) 2. look up alias 3. chdir(prefix) After step 1, GIT_DIR may be set to ".git" (relative to worktree), but step 3 moves cwd back to original cwd. When the next setup_git_directory_gently() is called by run_builtin(), it will mistakenly find ".git" in original cwd. As a workaround, teach set_git_dir() not to set to ".git". setup_git_env() will default to ".git" later on. Alias handling code will need more work later. Signed-off-by: Nguyán ThÃi Ngác Duy <pclouds@xxxxxxxxx> --- The alias breakage is new. It should be fixed by calling setup_git_* only once. No "chdir(prefix)" any more. And that fix will be needed before we can turn more git_dir to relative path. But for now the workaround is enough, I think. environment.c | 6 +++- setup.c | 71 ++++++++++++++++++++++++------------------------- t/t1510-repo-setup.sh | 24 ++++++++-------- 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/environment.c b/environment.c index d811049..15764ee 100644 --- a/environment.c +++ b/environment.c @@ -193,8 +193,10 @@ char *get_graft_file(void) int set_git_dir(const char *path) { - if (setenv(GIT_DIR_ENVIRONMENT, path, 1)) - return error("Could not set GIT_DIR to '%s'", path); + if (strcmp(path, DEFAULT_GIT_DIR_ENVIRONMENT)) { + if (setenv(GIT_DIR_ENVIRONMENT, path, 1)) + return error("Could not set GIT_DIR to '%s'", path); + } setup_git_env(); return 0; } diff --git a/setup.c b/setup.c index a6cc044..2dd5f78 100644 --- a/setup.c +++ b/setup.c @@ -362,39 +362,26 @@ static const char *setup_explicit_git_dir(const char *gitdirenv, return retval; } -static int cwd_contains_git_dir(const char **gitfile_dirp) +static const char *setup_discovered_git_dir(const char *gitdir, + char *cwd, int offset, int len, + int *nongit_ok) { - const char *gitfile_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT); - *gitfile_dirp = gitfile_dir; - if (gitfile_dir) { - if (set_git_dir(gitfile_dir)) - die("Repository setup failed"); - return 1; - } - if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) { - *gitfile_dirp = DEFAULT_GIT_DIR_ENVIRONMENT; - return 1; - } - return 0; -} + if (check_repository_format_gently(gitdir, nongit_ok)) + return NULL; -static const char *setup_discovered_git_dir(const char *work_tree_env, - const char *gitdir, - int offset, int len, - char *cwd, int *nongit_ok) -{ - int root_len; - char *work_tree; + /* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */ + if (is_bare_repository_cfg > 0) { + set_git_dir(offset == len ? gitdir : make_absolute_path(gitdir)); + if (chdir(cwd)) + die_errno("Could not come back to cwd"); + return NULL; + } + /* #0, #1, #5, #8, #9, #12, #13 */ + set_git_work_tree("."); + set_git_dir(gitdir); inside_git_dir = 0; - if (!work_tree_env) - inside_work_tree = 1; - root_len = offset_1st_component(cwd); - work_tree = xstrndup(cwd, offset > root_len ? offset : root_len); - set_git_work_tree(work_tree); - free(work_tree); - if (check_repository_format_gently(gitdir, nongit_ok)) - return NULL; + inside_work_tree = 1; if (offset == len) return NULL; @@ -456,8 +443,8 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) const char *work_tree_env = getenv(GIT_WORK_TREE_ENVIRONMENT); const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT); static char cwd[PATH_MAX+1]; - const char *gitdirenv; - const char *gitfile_dir; + const char *gitdirenv, *ret; + char *gitfile; int len, offset, ceil_offset; dev_t current_device = 0; int one_filesystem = 1; @@ -502,11 +489,23 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) if (one_filesystem) current_device = get_device_or_die(".", NULL); for (;;) { - if (cwd_contains_git_dir(&gitfile_dir)) - return setup_discovered_git_dir(work_tree_env, - gitfile_dir, - offset, len, - cwd, nongit_ok); + gitfile = (char*)read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT); + if (gitfile) + gitdirenv = gitfile = xstrdup(gitfile); + else { + if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) + gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT; + } + + if (gitdirenv) { + ret = setup_discovered_git_dir(gitdirenv, + cwd, offset, len, + nongit_ok); + free(gitfile); + return ret; + } + free(gitfile); + if (is_git_directory(".")) return setup_bare_git_dir(cwd, offset, len, nongit_ok); diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh index 629ba34..d492996 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -2343,7 +2343,7 @@ EOF test_repo 16 ' -test_expect_failure '#16.2: in subdir' ' +test_expect_success '#16.2: in subdir' ' cat >16/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/16/.git setup: worktree: (null) @@ -2471,7 +2471,7 @@ EOF test_repo 17 ' -test_expect_failure '#17.2: in subdir' ' +test_expect_success '#17.2: in subdir' ' cat >17/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/17/.git setup: worktree: (null) @@ -2936,7 +2936,7 @@ EOF test_repo 20 ' -test_expect_failure '#20.2: in subdir' ' +test_expect_success '#20.2: in subdir' ' cat >20/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/20/.git setup: worktree: (null) @@ -3065,7 +3065,7 @@ EOF test_repo 21 ' -test_expect_failure '#21.2: in subdir' ' +test_expect_success '#21.2: in subdir' ' cat >21/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/21/.git setup: worktree: (null) @@ -3703,7 +3703,7 @@ test_expect_success '#24: setup' ' cd .. ' -test_expect_failure '#24: at root' ' +test_expect_success '#24: at root' ' cat >24/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/24.git setup: worktree: (null) @@ -3713,7 +3713,7 @@ EOF test_repo 24 ' -test_expect_failure '#24: in subdir' ' +test_expect_success '#24: in subdir' ' cat >24/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/24.git setup: worktree: (null) @@ -3752,7 +3752,7 @@ test_expect_success '#25: setup' ' cd .. ' -test_expect_failure '#25: at root' ' +test_expect_success '#25: at root' ' cat >25/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/25.git setup: worktree: (null) @@ -3762,7 +3762,7 @@ EOF test_repo 25 ' -test_expect_failure '#25: in subdir' ' +test_expect_success '#25: in subdir' ' cat >25/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/25.git setup: worktree: (null) @@ -4137,7 +4137,7 @@ test_expect_success '#28: setup' ' cd .. ' -test_expect_failure '#28: at root' ' +test_expect_success '#28: at root' ' cat >28/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/28.git setup: worktree: (null) @@ -4147,7 +4147,7 @@ EOF test_repo 28 ' -test_expect_failure '#28: in subdir' ' +test_expect_success '#28: in subdir' ' cat >28/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/28.git setup: worktree: (null) @@ -4186,7 +4186,7 @@ test_expect_success '#29: setup' ' cd .. ' -test_expect_failure '#29: at root' ' +test_expect_success '#29: at root' ' cat >29/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/29.git setup: worktree: (null) @@ -4196,7 +4196,7 @@ EOF test_repo 29 ' -test_expect_failure '#29: in subdir' ' +test_expect_success '#29: in subdir' ' cat >29/sub/expected <<EOF && setup: git_dir: $TRASH_DIRECTORY/29.git setup: worktree: (null) -- 1.7.3.2.210.g045198 -- 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