[PATCH 25/43] worktree setup: call set_git_dir explicitly
- From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
- Date
- Apr 5, 2010, 18:41 UTC
- Message-ID
- <1270492888-26589-26-git-send-email-pclouds@gmail.com>
- In-Reply-To
- <1270492888-26589-1-git-send-email-pclouds@gmail.com>
Currently setup_git_env() can automatically set git directory to ".git", relative to current working directory, no matter where it is. Any access to repository may call setup_git_env() automatically if there is no repository found yet. This leads to obscure faults where we don't expect a repository setup to happen.
The ultimate goal (**) is:
- Git repository will be searched and set up by either one of these functions (and no other functions):
+ setup_git_directory_gently() + setup_git_directory() + enter_repo() + init_db()
- Repository setup can't be called more than once. If it is really needed, then un-setup the previous repo before moving on with another one.
- Any attempts to access repository when it's not found/set up should be caught.
This patch is the first step to accomplish this goal. It ensures that after the "setup function" (mentioned above) is called, if a repository is found, then setup_git_env() must be called already.
The two other cases (no setup function called, setup_git_directory_gently() called but no repo found) will be covered by the next patches, to ensure setup_git_env() will not be triggered.
(**) This only applies to builtin commands, for now.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> --- setup.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/setup.c b/setup.c index e067292..43a8609 100644 --- a/setup.c +++ b/setup.c @@ -350,14 +350,17 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) /* 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); @@ -392,8 +395,10 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) offset = len = strlen(cwd); for (;;) { gitfile_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT); - if (gitfile_dir || is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) { - if (gitfile_dir && set_git_dir(gitfile_dir)) + if (!gitfile_dir && is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) + gitfile_dir = DEFAULT_GIT_DIR_ENVIRONMENT; + if (gitfile_dir) { + if (set_git_dir(gitfile_dir)) die("Repository setup failed"); inside_git_dir = 0; if (!work_tree_env)
-- 1.7.0.rc1.541.g2da82.dirty