worktree: make branch creation distinct from worktree population
authorEric Sunshine <sunshine@sunshineco.com>
Fri, 17 Jul 2015 23:00:10 +0000 (19:00 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 Jul 2015 18:29:51 +0000 (11:29 -0700)
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 <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c
index 83484ad502da716cabceb5d379f10e1463e06ffb..8225468f1171f5f1f3805698d3e072c1d454e417 100644 (file)
@@ -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);