worktree: add: suppress auto-vivication with --detach and no <branch>

Fix oversight where branch auto-vivication incorrectly kicks in when
--detach is specified and <branch> omitted. Instead, treat:

    git worktree add --detach <path>

as shorthand for:

    git worktree add --detach <path> HEAD

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Sunshine 2015-07-17 19:00:09 -04:00 committed by Junio C Hamano
parent ab0b2c53ed
commit 5c942570fe
3 changed files with 18 additions and 4 deletions

View File

@ -51,9 +51,9 @@ Create `<path>` and checkout `<branch>` into it. The new working directory
is linked to the current repository, sharing everything except working is linked to the current repository, sharing everything except working
directory specific files such as HEAD, index, etc. directory specific files such as HEAD, index, etc.
+ +
If `<branch>` is omitted and neither `-b` nor `-B` is used, then, as a If `<branch>` is omitted and neither `-b` nor `-B` nor `--detached` used,
convenience, a new branch based at HEAD is created automatically, as if then, as a convenience, a new branch based at HEAD is created automatically,
`-b $(basename <path>)` was specified. as if `-b $(basename <path>)` was specified.
prune:: prune::

View File

@ -308,7 +308,7 @@ static int add(int ac, const char **av, const char *prefix)
if (opts.force_new_branch) if (opts.force_new_branch)
opts.new_branch = new_branch_force; opts.new_branch = new_branch_force;
if (ac < 2 && !opts.new_branch) { if (ac < 2 && !opts.new_branch && !opts.detach) {
int n; int n;
const char *s = worktree_basename(path, &n); const char *s = worktree_basename(path, &n);
opts.new_branch = xstrndup(s, n); opts.new_branch = xstrndup(s, n);

View File

@ -153,6 +153,14 @@ test_expect_success '"add -b" with <branch> omitted' '
test_cmp_rev HEAD burble test_cmp_rev HEAD burble
' '
test_expect_success '"add --detach" with <branch> omitted' '
git worktree add --detach fishhook &&
git rev-parse HEAD >expected &&
git -C fishhook rev-parse HEAD >actual &&
test_cmp expected actual &&
test_must_fail git -C fishhook symbolic-ref HEAD
'
test_expect_success '"add" with <branch> omitted' ' test_expect_success '"add" with <branch> omitted' '
git worktree add wiffle/bat && git worktree add wiffle/bat &&
test_cmp_rev HEAD bat test_cmp_rev HEAD bat
@ -167,6 +175,12 @@ test_expect_success '"add" auto-vivify does not clobber existing branch' '
test_path_is_missing precious test_path_is_missing precious
' '
test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' '
git worktree add --detach mish/mash &&
test_must_fail git rev-parse mash -- &&
test_must_fail git -C mish/mash symbolic-ref HEAD
'
test_expect_success '"add" -b/-B mutually exclusive' ' test_expect_success '"add" -b/-B mutually exclusive' '
test_must_fail git worktree add -b poodle -B poodle bamboo master test_must_fail git worktree add -b poodle -B poodle bamboo master
' '