If setup_git_directory_gently() and its callers do not set gitdir now, it will be eventually set by setup_git_env(), through obscure call chain. One of the indirect call site is git_config(). My goal is to remove gitdir auto detection in setup_git_env(). So the first step is not depend on that behavior. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- setup.c | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/setup.c b/setup.c index b38cbee..183bcf6 100644 --- a/setup.c +++ b/setup.c @@ -313,8 +313,12 @@ const char *read_gitfile_gently(const char *path) /* * We cannot decide in this function whether we are in the work tree or * not, since the config can only be read _after_ this function was called. + * + * After this function is finished, set_git_dir() must be called if a + * a repository is found. Repo format will be checked later by + * setup_git_directory_gently() */ -const char *setup_git_directory_gently(int *nongit_ok) +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); @@ -345,18 +349,17 @@ const char *setup_git_directory_gently(int *nongit_ok) const char *retval; if (!work_tree_env) { + /* core.worktree may override worktree */ retval = set_work_tree(gitdirenv); - /* config may override worktree */ - if (check_repository_format_gently(nongit_ok)) - return NULL; + set_git_dir(gitdirenv); return retval; } - if (check_repository_format_gently(nongit_ok)) - return NULL; retval = get_relative_cwd(buffer, sizeof(buffer) - 1, get_git_work_tree()); - if (!retval || !*retval) + if (!retval || !*retval) { + set_git_dir(gitdirenv); return NULL; + } set_git_dir(make_absolute_path(gitdirenv)); if (chdir(work_tree_env) < 0) die_errno ("Could not chdir to '%s'", work_tree_env); @@ -396,8 +399,10 @@ const char *setup_git_directory_gently(int *nongit_ok) die("Repository setup failed"); break; } - if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) + if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) { + set_git_dir(DEFAULT_GIT_DIR_ENVIRONMENT); break; + } if (is_git_directory(".")) { inside_git_dir = 1; if (!work_tree_env) @@ -407,7 +412,6 @@ const char *setup_git_directory_gently(int *nongit_ok) set_git_dir(cwd); } else set_git_dir("."); - check_repository_format_gently(nongit_ok); return NULL; } while (--offset > ceil_offset && cwd[offset] != '/'); @@ -428,8 +432,6 @@ const char *setup_git_directory_gently(int *nongit_ok) if (!work_tree_env) inside_work_tree = 1; git_work_tree_cfg = xstrndup(cwd, offset); - if (check_repository_format_gently(nongit_ok)) - return NULL; if (offset == len) return NULL; @@ -440,6 +442,16 @@ const char *setup_git_directory_gently(int *nongit_ok) return cwd + offset; } +const char *setup_git_directory_gently(int *nongit_ok) +{ + const char *prefix; + + prefix = setup_git_directory_gently_1(nongit_ok); + if (!nongit_ok || (!*nongit_ok && check_repository_format_gently(nongit_ok))) + prefix = NULL; + return prefix; +} + int git_config_perm(const char *var, const char *value) { int i; -- 1.7.0.195.g637a2 -- 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