If core.bare is true, discard the discovered worktree, move back to original cwd. Signed-off-by: Nguyán ThÃi Ngác Duy <pclouds@xxxxxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- setup.c | 72 ++++++++++++++++++++++++------------------------ t/t1510-repo-setup.sh | 24 ++++++++-------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/setup.c b/setup.c index a6cc044..3ee9c2e 100644 --- a/setup.c +++ b/setup.c @@ -362,39 +362,27 @@ 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("."); + if (strcmp(gitdir, DEFAULT_GIT_DIR_ENVIRONMENT)) + 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 +444,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 +490,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 45feb80..5ae02ee 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -2350,7 +2350,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) @@ -2479,7 +2479,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) @@ -2944,7 +2944,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) @@ -3074,7 +3074,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) @@ -3716,7 +3716,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) @@ -3726,7 +3726,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) @@ -3766,7 +3766,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) @@ -3776,7 +3776,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) @@ -4151,7 +4151,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) @@ -4161,7 +4161,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) @@ -4201,7 +4201,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) @@ -4211,7 +4211,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.316.gda8b3 -- 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