summaryrefslogtreecommitdiff
path: root/builtin/worktree.c
diff options
context:
space:
mode:
authorThomas Gummerer <t.gummerer@gmail.com>2018-04-24 21:56:35 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-04-30 00:06:34 (GMT)
commitf60a7b763fe070161b332d3878f81a7f09ab6e44 (patch)
tree0359d260102a9bfd21292a4bf3a7fe6eb83d0377 /builtin/worktree.c
parent6427f87186e53d9d4319d43e4efbe46bb93b7440 (diff)
downloadgit-f60a7b763fe070161b332d3878f81a7f09ab6e44.zip
git-f60a7b763fe070161b332d3878f81a7f09ab6e44.tar.gz
git-f60a7b763fe070161b332d3878f81a7f09ab6e44.tar.bz2
worktree: teach "add" to check out existing branches
Currently 'git worktree add <path>' creates a new branch named after the basename of the path by default. If a branch with that name already exists, the command refuses to do anything, unless the '--force' option is given. However we can do a little better than that, and check the branch out if it is not checked out anywhere else. This will help users who just want to check an existing branch out into a new worktree, and save a few keystrokes. As the current behaviour is to simply 'die()' when a branch with the name of the basename of the path already exists, there are no backwards compatibility worries here. We will still 'die()' if the branch is checked out in another worktree, unless the --force flag is passed. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Reviewed-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/worktree.c')
-rw-r--r--builtin/worktree.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 6bd32b6..d3aeb48 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -391,8 +391,17 @@ static const char *dwim_branch(const char *path, const char **new_branch)
{
int n;
const char *s = worktree_basename(path, &n);
- *new_branch = xstrndup(s, n);
- UNLEAK(*new_branch);
+ const char *branchname = xstrndup(s, n);
+ struct strbuf ref = STRBUF_INIT;
+
+ UNLEAK(branchname);
+ if (!strbuf_check_branch_ref(&ref, branchname) &&
+ ref_exists(ref.buf)) {
+ strbuf_release(&ref);
+ return branchname;
+ }
+
+ *new_branch = branchname;
if (guess_remote) {
struct object_id oid;
const char *remote =