Skip to content

Commit

Permalink
t2024: Show failure to use refspec when DWIMming remote branch names
Browse files Browse the repository at this point in the history
When using "git checkout foo" to DWIM the creation of local "foo" from some
existing upstream "foo", we assume conventional refspecs as created by "git
clone" or "git remote add", and fail to work correctly if the current
refspecs do not follow the conventional "refs/remotes/$remote/*" pattern.

Improved-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johan Herland authored and Junio C Hamano committed Apr 21, 2013
1 parent 399e4a1 commit ec2764e
Showing 1 changed file with 69 additions and 1 deletion.
70 changes: 69 additions & 1 deletion t/t2024-checkout-dwim.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ test_branch_upstream () {
}

test_expect_success 'setup' '
test_commit my_master &&
git init repo_a &&
(
cd repo_a &&
Expand Down Expand Up @@ -58,7 +59,7 @@ test_expect_success 'checkout of non-existing branch fails' '
test_branch master
'

test_expect_success 'checkout of branch from multiple remotes fails' '
test_expect_success 'checkout of branch from multiple remotes fails #1' '
git checkout -B master &&
test_might_fail git branch -D foo &&
Expand Down Expand Up @@ -96,4 +97,71 @@ test_expect_success '--no-guess suppresses branch auto-vivification' '
test_branch master
'

test_expect_success 'setup more remotes with unconventional refspecs' '
git checkout -B master &&
git init repo_c &&
(
cd repo_c &&
test_commit c_master &&
git checkout -b bar &&
test_commit c_bar
git checkout -b spam &&
test_commit c_spam
) &&
git init repo_d &&
(
cd repo_d &&
test_commit d_master &&
git checkout -b baz &&
test_commit f_baz
git checkout -b eggs &&
test_commit c_eggs
) &&
git remote add repo_c repo_c &&
git config remote.repo_c.fetch \
"+refs/heads/*:refs/remotes/extra_dir/repo_c/extra_dir/*" &&
git remote add repo_d repo_d &&
git config remote.repo_d.fetch \
"+refs/heads/*:refs/repo_d/*" &&
git fetch --all
'

test_expect_failure 'checkout of branch from multiple remotes fails #2' '
git checkout -B master &&
test_might_fail git branch -D bar &&
test_must_fail git checkout bar &&
test_must_fail git rev-parse --verify refs/heads/bar &&
test_branch master
'

test_expect_failure 'checkout of branch from multiple remotes fails #3' '
git checkout -B master &&
test_might_fail git branch -D baz &&
test_must_fail git checkout baz &&
test_must_fail git rev-parse --verify refs/heads/baz &&
test_branch master
'

test_expect_failure 'checkout of branch from a single remote succeeds #3' '
git checkout -B master &&
test_might_fail git branch -D spam &&
git checkout spam &&
test_branch spam &&
test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
test_branch_upstream spam repo_c spam
'

test_expect_failure 'checkout of branch from a single remote succeeds #4' '
git checkout -B master &&
test_might_fail git branch -D eggs &&
git checkout eggs &&
test_branch eggs &&
test_cmp_rev refs/repo_d/eggs HEAD &&
test_branch_upstream eggs repo_d eggs
'

test_done

0 comments on commit ec2764e

Please sign in to comment.