In a later patch we want to treat the failures of each of the two steps differently, so split them up first. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- dir.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/dir.c b/dir.c index d872cc1570..b2cb23fe88 100644 --- a/dir.c +++ b/dir.c @@ -2749,27 +2749,41 @@ void untracked_cache_add_to_index(struct index_state *istate, untracked_cache_invalidate_path(istate, path); } -/* Update gitfile and core.worktree setting to connect work tree and git dir */ -void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_) +static void point_gitlink_file_to(const char *work_tree, const char *git_dir) { struct strbuf file_name = STRBUF_INIT; struct strbuf rel_path = STRBUF_INIT; - char *git_dir = xstrdup(real_path(git_dir_)); - char *work_tree = xstrdup(real_path(work_tree_)); - /* Update gitfile */ strbuf_addf(&file_name, "%s/.git", work_tree); write_file(file_name.buf, "gitdir: %s", relative_path(git_dir, work_tree, &rel_path)); - /* Update core.worktree setting */ - strbuf_reset(&file_name); + strbuf_release(&file_name); + strbuf_release(&rel_path); +} + +static void set_core_work_tree_to_connect(const char *work_tree, const char *git_dir) +{ + struct strbuf file_name = STRBUF_INIT; + struct strbuf rel_path = STRBUF_INIT; + strbuf_addf(&file_name, "%s/config", git_dir); git_config_set_in_file(file_name.buf, "core.worktree", relative_path(work_tree, git_dir, &rel_path)); strbuf_release(&file_name); strbuf_release(&rel_path); +} + +/* Update gitfile and core.worktree setting to connect work tree and git dir */ +void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_) +{ + char *git_dir = xstrdup(real_path(git_dir_)); + char *work_tree = xstrdup(real_path(work_tree_)); + + point_gitlink_file_to(work_tree, git_dir); + set_core_work_tree_to_connect(work_tree, git_dir); + free(work_tree); free(git_dir); } -- 2.11.0.rc2.53.gb7b3fba.dirty