worktree: add_worktree: construct worktree-population command locally

The caller of add_worktree() provides it with a command to invoke to populate the new worktree. This was a useful abstraction during the conversion of "git checkout --to" functionality to "git worktree add" since git-checkout and git-worktree constructed the population command differently. However, now that "git checkout --to" has been retired, and add_worktree() has access to the options given to "worktree add", this extra indirection is no longer useful and makes the code a bit convoluted. Moreover, the eventual goal is for git-worktree to make setting of HEAD and worktree population distinct operations, whereas they are currently conflated into a single git-checkout invocation. As such, add_worktree() will eventually invoke other commands in addition to the worktree population command, so it will be doing command construction itself anyhow. Therefore, relocate construction of the worktree population command from add() to add_worktree(). Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Eric Sunshine committed Jul 17, 2015 at 19:00 UTC 80a0548f6c12f43e9bd62e13eacb033f05e2b001
1 file changed +8 -11
builtin/worktree.c
+8 -11
@@ -178,7 +178,7 @@ static const char *worktree_basename(const char *path, int *olen)
178 return name;
179 }
180
181 -static int add_worktree(const char *path, const char **child_argv,
181 +static int add_worktree(const char *path, const char *refname,
182 const struct add_opts *opts)
183 {
184 struct strbuf sb_git = STRBUF_INIT, sb_repo = STRBUF_INIT;
@@ -261,7 +261,12 @@ static int add_worktree(const char *path, const char **child_argv,
261 argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
262 memset(&cp, 0, sizeof(cp));
263 cp.git_cmd = 1;
264 - cp.argv = child_argv;
264 + argv_array_push(&cp.args, "checkout");
265 + if (opts->force)
266 + argv_array_push(&cp.args, "--ignore-other-worktrees");
267 + if (opts->detach)
268 + argv_array_push(&cp.args, "--detach");
269 + argv_array_push(&cp.args, refname);
270 cp.env = child_env.argv;
271 ret = run_command(&cp);
272 if (!ret) {
@@ -286,7 +291,6 @@ static int add(int ac, const char **av, const char *prefix)
291 struct add_opts opts;
292 const char *new_branch_force = NULL;
293 const char *path, *branch;
289 - struct argv_array cmd = ARGV_ARRAY_INIT;
294 struct option options[] = {
295 OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
296 OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
@@ -331,14 +335,7 @@ static int add(int ac, const char **av, const char *prefix)
335 branch = opts.new_branch;
336 }
337
334 - argv_array_push(&cmd, "checkout");
335 - if (opts.force)
336 - argv_array_push(&cmd, "--ignore-other-worktrees");
337 - if (opts.detach)
338 - argv_array_push(&cmd, "--detach");
339 - argv_array_push(&cmd, branch);
340 -
341 - return add_worktree(path, cmd.argv, &opts);
338 + return add_worktree(path, branch, &opts);
339 }
340
341 int cmd_worktree(int ac, const char **av, const char *prefix)