git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] builtin/worktree.c: add option for setting worktree name

From
Barret Rennie <barret@brennie.ca>
Date
Jun 25, 2016, 05:15 UTC
Message-ID
<20160625051548.95564-1-barret@brennie.ca>

Add the --name parameter to git worktree add that allows the user to set the name of the created worktree directory. A worktree must not already exist with the current name or creation will fail.

Signed-off-by: Barret Rennie <barret@brennie.ca>
---
 Documentation/git-worktree.txt |  6 +++++-
 builtin/worktree.c             | 24 ++++++++++++++++++------
 t/t2025-worktree-add.sh        | 16 ++++++++++++++++
 3 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 23d8d2a..2af0ee4 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -9,7 +9,7 @@ git-worktree - Manage multiple working trees
 SYNOPSIS
 --------
 [verse]
-'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] <path> [<branch>]
+'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] [--name <name>] <path> [<branch>]
 'git worktree prune' [-n] [-v] [--expire <expire>]
 'git worktree list' [--porcelain]
 
@@ -88,6 +88,10 @@ OPTIONS
 	With `add`, detach HEAD in the new working tree. See "DETACHED HEAD"
 	in linkgit:git-checkout[1].
 
+--name::
+	Set the name for the worktree. If there is already a worktree with this
+	name, the command will fail.
+
 --[no-]checkout::
 	By default, `add` checks out `<branch>`, however, `--no-checkout` can
 	be used to suppress checkout in order to make customizations,
diff --git a/builtin/worktree.c b/builtin/worktree.c
index e3199a2..ed071b2 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -24,6 +24,7 @@ struct add_opts {
 	int checkout;
 	const char *new_branch;
 	int force_new_branch;
+	const char *name;
 };
 
 static int show_only;
@@ -212,19 +213,29 @@ static int add_worktree(const char *path, const char *refname,
 			die(_("invalid reference: %s"), refname);
 	}
 
-	name = worktree_basename(path, &len);
+	if (opts->name) {
+		name = opts->name;
+		len = strlen(name);
+	} else {
+		name = worktree_basename(path, &len);
+	}
+
 	strbuf_addstr(&sb_repo,
 		      git_path("worktrees/%.*s", (int)(path + len - name), name));
+
 	len = sb_repo.len;
 	if (safe_create_leading_directories_const(sb_repo.buf))
 		die_errno(_("could not create leading directories of '%s'"),
 			  sb_repo.buf);
-	while (!stat(sb_repo.buf, &st)) {
-		counter++;
-		strbuf_setlen(&sb_repo, len);
-		strbuf_addf(&sb_repo, "%d", counter);
+
+	if (!opts->name) {
+		while (!stat(sb_repo.buf, &st)) {
+			counter++;
+			strbuf_setlen(&sb_repo, len);
+			strbuf_addf(&sb_repo, "%d", counter);
+		}
+		name = strrchr(sb_repo.buf, '/') + 1;
 	}
-	name = strrchr(sb_repo.buf, '/') + 1;
 
 	junk_pid = getpid();
 	atexit(remove_junk);
@@ -326,6 +337,7 @@ static int add(int ac, const char **av, const char *prefix)
 			   N_("create or reset a branch")),
 		OPT_BOOL(0, "detach", &opts.detach, N_("detach HEAD at named commit")),
 		OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
+		OPT_STRING(0, "name", &opts.name, N_("name"), N_("set name for working tree")),
 		OPT_END()
 	};
 
diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
index 4bcc335..9abcf8e 100755
--- a/t/t2025-worktree-add.sh
+++ b/t/t2025-worktree-add.sh
@@ -63,6 +63,22 @@ test_expect_success '"add" worktree' '
 	)
 '
 
+test_expect_success '"add" worktree with name' '
+	git worktree add --detach --name custom-name another-worktree master &&
+	(
+		cd here &&
+		test_cmp ../init.t init.t
+	) &&
+	(
+		cd .git/worktrees &&
+		test -d custom-name
+	)
+'
+
+test_expect_success '"add" worktree with name that already exists' '
+	test_must_fail git worktree add --name custom-name --detach yet-another-worktree master
+'
+
 test_expect_success '"add" worktree from a subdir' '
 	(
 		mkdir sub &&
-- 
2.9.0
Next: Junio C Hamano
Message 1 of 16 in “builtin/worktree.c: add option for setting worktree name”
  1. builtin/worktree.c: add option for setting worktree nameBarret Rennie, Jun 25, 2016
  2. Junio C HamanoJun 25, 2016
  3. Barret RennieJun 25, 2016
  4. Johannes SixtJun 25, 2016
  5. Barret RennieJun 25, 2016
  6. Barret RennieJun 25, 2016
  7. Junio C HamanoJun 25, 2016
  8. Barret RennieJun 25, 2016
  9. Junio C HamanoJun 26, 2016
  10. Barret RennieJun 27, 2016
  11. Junio C HamanoJun 27, 2016
  12. Eric SunshineJun 26, 2016
  13. Barret RennieJun 27, 2016
  14. Eric SunshineJun 27, 2016
  15. Barret RennieJun 29, 2016
  16. Barret RennieJun 25, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.