Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- setup.c | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-) diff --git a/setup.c b/setup.c index 43a8609..b8f88db 100644 --- a/setup.c +++ b/setup.c @@ -241,9 +241,21 @@ void setup_work_tree(void) initialized = 1; } -static int check_repository_format_gently(int *nongit_ok) +static int check_repository_format_gently(const char *gitdir, int *nongit_ok) { - git_config(check_repository_format_version, NULL); + char repo_config[PATH_MAX+1]; + + /* + * git_config() can't be used here because it calls git_pathdup() + * to get $GIT_CONFIG/config. That call will make setup_git_env() + * set git_dir to ".git". + * + * We are in gitdir setup, no git dir has been found useable yet. + * Use a gentler version of git_config() to check if this repo + * is a good one. + */ + snprintf(repo_config, PATH_MAX, "%s/config", gitdir); + git_config_early(check_repository_format_version, NULL, repo_config); if (GIT_REPO_VERSION < repository_format_version) { if (!nongit_ok) die ("Expected git repo version <= %d, found %d", @@ -348,12 +360,12 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) if (!work_tree_env) { retval = set_work_tree(gitdirenv); /* config may override worktree */ - if (check_repository_format_gently(nongit_ok)) + if (check_repository_format_gently(gitdirenv, nongit_ok)) return NULL; set_git_dir(gitdirenv); return retval; } - if (check_repository_format_gently(nongit_ok)) + if (check_repository_format_gently(gitdirenv, nongit_ok)) return NULL; retval = get_relative_cwd(buffer, sizeof(buffer) - 1, get_git_work_tree()); @@ -403,6 +415,8 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) inside_git_dir = 0; if (!work_tree_env) inside_work_tree = 1; + if (check_repository_format_gently(gitfile_dir, nongit_ok)) + return NULL; root_len = offset_1st_component(cwd); git_work_tree_cfg = xstrndup(cwd, offset > root_len ? offset : root_len); break; @@ -411,6 +425,8 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) inside_git_dir = 1; if (!work_tree_env) inside_work_tree = 0; + if (check_repository_format_gently(gitfile_dir, nongit_ok)) + return NULL; if (offset != len) { root_len = offset_1st_component(cwd); cwd[offset > root_len ? offset : root_len] = '\0'; @@ -433,8 +449,6 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) die_errno("Cannot change to '%s/..'", cwd); } - if (check_repository_format_gently(nongit_ok)) - return NULL; if (offset == len) return NULL; @@ -542,7 +556,7 @@ char *enter_repo(char *path, int strict) validate_headref("HEAD") == 0) { inside_work_tree = 0; inside_git_dir = 1; - check_repository_format(); + check_repository_format_gently(".", NULL); set_git_dir("."); if (startup_info) { startup_info->prefix = NULL; @@ -627,7 +641,7 @@ int check_repository_format_version(const char *var, const char *value, void *cb int check_repository_format(void) { - return check_repository_format_gently(NULL); + return check_repository_format_gently(get_git_dir(), NULL); } const char *setup_git_directory(void) -- 1.7.0.1.384.g6abcaa -- 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