summaryrefslogtreecommitdiff
path: root/builtin/worktree.c
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2015-07-17 23:00:14 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-07-20 18:29:52 (GMT)
commit7f44e3d1de08bf99c8dbd69d6437b712df369692 (patch)
treebdb0dc1f562e250d036d72073ceefad36041eeab /builtin/worktree.c
parentf7c9dac1b037e453e934c272d77cc648d56d5477 (diff)
downloadgit-7f44e3d1de08bf99c8dbd69d6437b712df369692.zip
git-7f44e3d1de08bf99c8dbd69d6437b712df369692.tar.gz
git-7f44e3d1de08bf99c8dbd69d6437b712df369692.tar.bz2
worktree: make setup of new HEAD distinct from worktree population
git-worktree currently conflates setting of HEAD in the new worktree and initial worktree population into a single git-checkout invocation which requires git-checkout to have special knowledge that it is operating on a newly created worktree. The eventual goal is to rid git-checkout of that overly-intimate knowledge. Once these operations are separate, git-worktree will no longer be able to delegate to git-branch the setting of the new worktree's HEAD to the desired branch (or commit, if detached). Therefore, make git-worktree itself responsible for setting up HEAD as either a symbolic reference, if associated with a branch, or detached, if not. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/worktree.c')
-rw-r--r--builtin/worktree.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c
index cf35b2a..79d088c 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -278,12 +278,21 @@ static int add_worktree(const char *path, const char *refname,
argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
memset(&cp, 0, sizeof(cp));
cp.git_cmd = 1;
+
+ if (commit)
+ argv_array_pushl(&cp.args, "update-ref", "HEAD",
+ sha1_to_hex(commit->object.sha1), NULL);
+ else
+ argv_array_pushl(&cp.args, "symbolic-ref", "HEAD",
+ symref.buf, NULL);
+ cp.env = child_env.argv;
+ ret = run_command(&cp);
+ if (ret)
+ goto done;
+
+ cp.argv = NULL;
+ argv_array_clear(&cp.args);
argv_array_push(&cp.args, "checkout");
- if (opts->force)
- argv_array_push(&cp.args, "--ignore-other-worktrees");
- if (opts->detach)
- argv_array_push(&cp.args, "--detach");
- argv_array_push(&cp.args, refname);
cp.env = child_env.argv;
ret = run_command(&cp);
if (!ret) {
@@ -293,6 +302,7 @@ static int add_worktree(const char *path, const char *refname,
junk_work_tree = NULL;
junk_git_dir = NULL;
}
+done:
strbuf_reset(&sb);
strbuf_addf(&sb, "%s/locked", sb_repo.buf);
unlink_or_warn(sb.buf);