summaryrefslogtreecommitdiff
path: root/src/repository.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repository.c')
-rw-r--r--src/repository.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/src/repository.c b/src/repository.c
index 278c0384e..443744504 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -186,39 +186,37 @@ static int load_workdir(git_repository *repo, git_buf *parent_path)
{
int error;
git_config *config;
- const char *worktree;
- git_buf worktree_buf = GIT_BUF_INIT;
+ const git_config_entry *ce;
+ git_buf worktree = GIT_BUF_INIT;
if (repo->is_bare)
return 0;
- if (git_repository_config__weakptr(&config, repo) < 0)
- return -1;
+ if ((error = git_repository_config__weakptr(&config, repo)) < 0)
+ return error;
- error = git_config_get_string(&worktree, config, "core.worktree");
- if (!error && worktree != NULL) {
- error = git_path_prettify_dir(
- &worktree_buf, worktree, repo->path_repository);
- if (error < 0)
+ if ((error = git_config__lookup_entry(
+ &ce, config, "core.worktree", false)) < 0)
+ return error;
+
+ if (ce && ce->value) {
+ if ((error = git_path_prettify_dir(
+ &worktree, ce->value, repo->path_repository)) < 0)
return error;
- repo->workdir = git_buf_detach(&worktree_buf);
+
+ repo->workdir = git_buf_detach(&worktree);
}
- else if (error != GIT_ENOTFOUND)
- return error;
+ else if (parent_path && git_path_isdir(parent_path->ptr))
+ repo->workdir = git_buf_detach(parent_path);
else {
- giterr_clear();
+ if (git_path_dirname_r(&worktree, repo->path_repository) < 0 ||
+ git_path_to_dir(&worktree) < 0)
+ return -1;
- if (parent_path && git_path_isdir(parent_path->ptr))
- repo->workdir = git_buf_detach(parent_path);
- else {
- git_path_dirname_r(&worktree_buf, repo->path_repository);
- git_path_to_dir(&worktree_buf);
- repo->workdir = git_buf_detach(&worktree_buf);
- }
+ repo->workdir = git_buf_detach(&worktree);
}
GITERR_CHECK_ALLOC(repo->workdir);
-
return 0;
}