When git_config() is called, either git_dir has already been set (by $GIT_DIR env or set_git_dir()), or it will default git_dir to ".git". git_config_early() gives setup functions more freedom because it does not require git_dir. Give it a config path, it will happily examine it. Signed-off-by: Nguyán ThÃi Ngác Duy <pclouds@xxxxxxxxx> --- setup.c | 47 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 35 insertions(+), 12 deletions(-) diff --git a/setup.c b/setup.c index a3b76de..49a1a25 100644 --- a/setup.c +++ b/setup.c @@ -243,9 +243,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", @@ -331,11 +343,11 @@ static const char *setup_explicit_git_dir(const char *gitdirenv, 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; 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()); @@ -357,11 +369,17 @@ static int cwd_contains_git_dir(const char **gitfile_dirp) die("Repository setup failed"); return 1; } - return is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT); + if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) { + *gitfile_dirp = DEFAULT_GIT_DIR_ENVIRONMENT; + return 1; + } + return 0; } static const char *setup_discovered_git_dir(const char *work_tree_env, - int offset, int len, char *cwd, int *nongit_ok) + const char *gitdir, + int offset, int len, + char *cwd, int *nongit_ok) { int root_len; @@ -370,7 +388,7 @@ static const char *setup_discovered_git_dir(const char *work_tree_env, inside_work_tree = 1; root_len = offset_1st_component(cwd); git_work_tree_cfg = xstrndup(cwd, offset > root_len ? offset : root_len); - if (check_repository_format_gently(nongit_ok)) + if (check_repository_format_gently(gitdir, nongit_ok)) return NULL; if (offset == len) return NULL; @@ -396,9 +414,12 @@ static const char *setup_bare_git_dir(const char *work_tree_env, root_len = offset_1st_component(cwd); cwd[offset > root_len ? offset : root_len] = '\0'; set_git_dir(cwd); - } else + check_repository_format_gently(cwd, nongit_ok); + } + else { set_git_dir("."); - check_repository_format_gently(nongit_ok); + check_repository_format_gently(".", nongit_ok); + } return NULL; } @@ -478,8 +499,10 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) current_device = get_device_or_die(".", NULL); for (;;) { if (cwd_contains_git_dir(&gitfile_dir)) - return setup_discovered_git_dir(work_tree_env, offset, - len, cwd, nongit_ok); + return setup_discovered_git_dir(work_tree_env, + gitfile_dir, + offset, len, + cwd, nongit_ok); if (is_git_directory(".")) return setup_bare_git_dir(work_tree_env, offset, len, cwd, nongit_ok); @@ -590,7 +613,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); } /* -- 1.7.0.2.445.gcbdb3 -- 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