diff options
author | Thomas Gummerer <t.gummerer@gmail.com> | 2018-04-24 22:56:35 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-04-30 09:06:34 +0900 |
commit | f60a7b763fe070161b332d3878f81a7f09ab6e44 (patch) | |
tree | 0359d260102a9bfd21292a4bf3a7fe6eb83d0377 /builtin/worktree.c | |
parent | 6427f87186e53d9d4319d43e4efbe46bb93b7440 (diff) | |
download | git-f60a7b763fe070161b332d3878f81a7f09ab6e44.tar.gz |
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.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c index 6bd32b6090..d3aeb4877d 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 = |