Skip to content

Commit

Permalink
worktree: make branch creation distinct from worktree population
Browse files Browse the repository at this point in the history
git-worktree currently conflates branch creation, setting of HEAD in the
new worktree, and worktree population into a single sub-invocation of
git-checkout, which requires git-checkout to be specially aware that it
is operating in a newly-created worktree. The goal is to free
git-checkout of that special knowledge, and to do so, git-worktree will
eventually perform those operations separately. Thus, as a first step,
rather than piggybacking on git-checkout's -b/-B ability to create a new
branch at checkout time, make git-worktree responsible for branch
creation itself.

Signed-off-by: Eric Sunshine <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
sunshineco authored and gitster committed Jul 20, 2015
1 parent 5c94257 commit c284243
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions builtin/worktree.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,12 +314,23 @@ static int add(int ac, const char **av, const char *prefix)
opts.new_branch = xstrndup(s, n);
}

if (opts.new_branch) {
struct child_process cp;
memset(&cp, 0, sizeof(cp));
cp.git_cmd = 1;
argv_array_push(&cp.args, "branch");
if (opts.force_new_branch)
argv_array_push(&cp.args, "--force");
argv_array_push(&cp.args, opts.new_branch);
argv_array_push(&cp.args, branch);
if (run_command(&cp))
return -1;
branch = opts.new_branch;
}

argv_array_push(&cmd, "checkout");
if (opts.force)
argv_array_push(&cmd, "--ignore-other-worktrees");
if (opts.new_branch)
argv_array_pushl(&cmd, opts.force_new_branch ? "-B" : "-b",
opts.new_branch, NULL);
if (opts.detach)
argv_array_push(&cmd, "--detach");
argv_array_push(&cmd, branch);
Expand Down

0 comments on commit c284243

Please sign in to comment.