Skip to content

Commit

Permalink
worktree: add_worktree: construct worktree-population command locally
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Jul 20, 2015
1 parent ae2a382 commit 80a0548
Showing 1 changed file with 8 additions and 11 deletions.
19 changes: 8 additions & 11 deletions builtin/worktree.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ static const char *worktree_basename(const char *path, int *olen)
return name;
}

static int add_worktree(const char *path, const char **child_argv,
static int add_worktree(const char *path, const char *refname,
const struct add_opts *opts)
{
struct strbuf sb_git = STRBUF_INIT, sb_repo = STRBUF_INIT;
Expand Down Expand Up @@ -261,7 +261,12 @@ static int add_worktree(const char *path, const char **child_argv,
argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
memset(&cp, 0, sizeof(cp));
cp.git_cmd = 1;
cp.argv = child_argv;
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) {
Expand All @@ -286,7 +291,6 @@ static int add(int ac, const char **av, const char *prefix)
struct add_opts opts;
const char *new_branch_force = NULL;
const char *path, *branch;
struct argv_array cmd = ARGV_ARRAY_INIT;
struct option options[] = {
OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
Expand Down Expand Up @@ -331,14 +335,7 @@ static int add(int ac, const char **av, const char *prefix)
branch = opts.new_branch;
}

argv_array_push(&cmd, "checkout");
if (opts.force)
argv_array_push(&cmd, "--ignore-other-worktrees");
if (opts.detach)
argv_array_push(&cmd, "--detach");
argv_array_push(&cmd, branch);

return add_worktree(path, cmd.argv, &opts);
return add_worktree(path, branch, &opts);
}

int cmd_worktree(int ac, const char **av, const char *prefix)
Expand Down

0 comments on commit 80a0548

Please sign in to comment.