git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Eric Sunshine <sunshine@sunshineco.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	Duy Nguyen <pclouds@gmail.com>,
	Michael J Gruber <git@drmicha.warpmail.net>,
	Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH v2 15/20] worktree: add_worktree: construct worktree-population command locally
Date: Thu, 16 Jul 2015 04:20:20 -0400	[thread overview]
Message-ID: <1437034825-32054-16-git-send-email-sunshine@sunshineco.com> (raw)
In-Reply-To: <1437034825-32054-1-git-send-email-sunshine@sunshineco.com>

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>
---

Changes since v1: reword commit message.

 builtin/worktree.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/builtin/worktree.c b/builtin/worktree.c
index 7ae186f..28095c1 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -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;
@@ -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) {
@@ -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"),
@@ -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)
-- 
2.5.0.rc2.378.g0af52e8

  parent reply	other threads:[~2015-07-16  8:21 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-16  8:20 [PATCH v2 00/20] rid git-checkout of too-intimate knowledge of new worktree Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 01/20] checkout: avoid resolving HEAD unnecessarily Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 02/20] checkout: name check_linked_checkouts() more meaningfully Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 03/20] checkout: improve die_if_checked_out() robustness Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 04/20] checkout: die_if_checked_out: simplify strbuf management Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 05/20] checkout: generalize die_if_checked_out() branch name argument Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 06/20] checkout: check_linked_checkout: improve "already checked out" aesthetic Eric Sunshine
2015-07-16 17:55   ` Junio C Hamano
2015-07-17  0:32     ` Eric Sunshine
2015-07-17  1:42       ` Duy Nguyen
2015-07-16  8:20 ` [PATCH v2 07/20] checkout: check_linked_checkout: simplify symref parsing Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 08/20] checkout: teach check_linked_checkout() about symbolic link HEAD Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 09/20] branch: publish die_if_checked_out() Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 10/20] worktree: simplify new branch (-b/-B) option checking Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 11/20] worktree: introduce options container Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 12/20] worktree: make --detach mutually exclusive with -b/-B Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 13/20] worktree: make branch creation distinct from worktree population Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 14/20] worktree: elucidate environment variables intended for child processes Eric Sunshine
2015-07-16  8:20 ` Eric Sunshine [this message]
2015-07-16  8:20 ` [PATCH v2 16/20] worktree: detect branch-name/detached and error conditions locally Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 17/20] worktree: make setup of new HEAD distinct from worktree population Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 18/20] worktree: avoid resolving HEAD unnecessarily Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 19/20] worktree: populate via "git reset --hard" rather than "git checkout" Eric Sunshine
2015-07-16  8:20 ` [PATCH v2 20/20] checkout: drop intimate knowledge of newly created worktree Eric Sunshine
2015-07-16 18:13   ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1437034825-32054-16-git-send-email-sunshine@sunshineco.com \
    --to=sunshine@sunshineco.com \
    --cc=git@drmicha.warpmail.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=pclouds@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).