-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Tay Ray Chuan
authored and
Junio C Hamano
committed
Jun 25, 2010
1 parent
6f426c7
commit 39ac7a7
Showing
1 changed file
with
121 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
#!/bin/sh | ||
|
||
test_description='checkout ' | ||
|
||
. ./test-lib.sh | ||
|
||
# Arguments: <branch> <sha> [<checkout options>] | ||
# | ||
# Runs "git checkout" to switch to <branch>, testing that | ||
# | ||
# 1) we are on the specified branch, <branch>; | ||
# 2) HEAD is <sha>; if <sha> is not specified, the old HEAD is used. | ||
# | ||
# If <checkout options> is not specified, "git checkout" is run with -b. | ||
do_checkout() { | ||
exp_branch=$1 && | ||
exp_ref="refs/heads/$exp_branch" && | ||
|
||
# if <sha> is not specified, use HEAD. | ||
exp_sha=${2:-$(git rev-parse --verify HEAD)} && | ||
|
||
# default options for git checkout: -b | ||
if [ -z "$3" ]; then | ||
opts="-b" | ||
else | ||
opts="$3" | ||
fi | ||
|
||
git checkout $opts $exp_branch $exp_sha && | ||
|
||
test $exp_ref = $(git rev-parse --symbolic-full-name HEAD) && | ||
test $exp_sha = $(git rev-parse --verify HEAD) | ||
} | ||
|
||
test_dirty_unmergeable() { | ||
! git diff --exit-code >/dev/null | ||
} | ||
|
||
setup_dirty_unmergeable() { | ||
echo >>file1 change2 | ||
} | ||
|
||
test_dirty_mergeable() { | ||
! git diff --cached --exit-code >/dev/null | ||
} | ||
|
||
setup_dirty_mergeable() { | ||
echo >file2 file2 && | ||
git add file2 | ||
} | ||
|
||
test_expect_success 'setup' ' | ||
test_commit initial file1 && | ||
HEAD1=$(git rev-parse --verify HEAD) && | ||
test_commit change1 file1 && | ||
HEAD2=$(git rev-parse --verify HEAD) && | ||
git branch -m branch1 | ||
' | ||
|
||
test_expect_success 'checkout -b to a new branch, set to HEAD' ' | ||
do_checkout branch2 | ||
' | ||
|
||
test_expect_success 'checkout -b to a new branch, set to an explicit ref' ' | ||
git checkout branch1 && | ||
git branch -D branch2 && | ||
do_checkout branch2 $HEAD1 | ||
' | ||
|
||
test_expect_success 'checkout -b to a new branch with unmergeable changes fails' ' | ||
git checkout branch1 && | ||
# clean up from previous test | ||
git branch -D branch2 && | ||
setup_dirty_unmergeable && | ||
test_must_fail do_checkout branch2 $HEAD1 && | ||
test_dirty_unmergeable | ||
' | ||
|
||
test_expect_success 'checkout -f -b to a new branch with unmergeable changes discards changes' ' | ||
# still dirty and on branch1 | ||
do_checkout branch2 $HEAD1 "-f -b" && | ||
test_must_fail test_dirty_unmergeable | ||
' | ||
|
||
test_expect_success 'checkout -b to a new branch preserves mergeable changes' ' | ||
git checkout branch1 && | ||
# clean up from previous test | ||
git branch -D branch2 && | ||
setup_dirty_mergeable && | ||
do_checkout branch2 $HEAD1 && | ||
test_dirty_mergeable | ||
' | ||
|
||
test_expect_success 'checkout -f -b to a new branch with mergeable changes discards changes' ' | ||
# clean up from previous test | ||
git reset --hard && | ||
git checkout branch1 && | ||
# clean up from previous test | ||
git branch -D branch2 && | ||
setup_dirty_mergeable && | ||
do_checkout branch2 $HEAD1 "-f -b" && | ||
test_must_fail test_dirty_mergeable | ||
' | ||
|
||
test_expect_success 'checkout -b to an existing branch fails' ' | ||
git reset --hard HEAD && | ||
test_must_fail do_checkout branch2 $HEAD2 | ||
' | ||
|
||
test_done |