You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
295 lines
9.8 KiB
295 lines
9.8 KiB
#!/bin/sh |
|
# |
|
# Copyright (c) 2009 Christian Couder |
|
# |
|
|
|
test_description='Tests for "git reset" with "--merge" and "--keep" options' |
|
|
|
. ./test-lib.sh |
|
|
|
test_expect_success setup ' |
|
for i in 1 2 3; do echo line $i; done >file1 && |
|
cat file1 >file2 && |
|
git add file1 file2 && |
|
test_tick && |
|
git commit -m "Initial commit" && |
|
git tag initial && |
|
echo line 4 >>file1 && |
|
cat file1 >file2 && |
|
test_tick && |
|
git commit -m "add line 4 to file1" file1 && |
|
git tag second |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: C C C D --merge D D D |
|
# file2: C D D D --merge C D D |
|
test_expect_success 'reset --merge is ok with changes in file it does not touch' ' |
|
git reset --merge HEAD^ && |
|
! grep 4 file1 && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
test_expect_success 'reset --merge is ok when switching back' ' |
|
git reset --merge second && |
|
grep 4 file1 && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: C C C D --keep D D D |
|
# file2: C D D D --keep C D D |
|
test_expect_success 'reset --keep is ok with changes in file it does not touch' ' |
|
git reset --hard second && |
|
cat file1 >file2 && |
|
git reset --keep HEAD^ && |
|
! grep 4 file1 && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
test_expect_success 'reset --keep is ok when switching back' ' |
|
git reset --keep second && |
|
grep 4 file1 && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: B B C D --merge D D D |
|
# file2: C D D D --merge C D D |
|
test_expect_success 'reset --merge discards changes added to index (1)' ' |
|
git reset --hard second && |
|
cat file1 >file2 && |
|
echo "line 5" >> file1 && |
|
git add file1 && |
|
git reset --merge HEAD^ && |
|
! grep 4 file1 && |
|
! grep 5 file1 && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
test_expect_success 'reset --merge is ok again when switching back (1)' ' |
|
git reset --hard initial && |
|
echo "line 5" >> file2 && |
|
git add file2 && |
|
git reset --merge second && |
|
! grep 4 file2 && |
|
! grep 5 file1 && |
|
grep 4 file1 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: B B C D --keep (disallowed) |
|
test_expect_success 'reset --keep fails with changes in index in files it touches' ' |
|
git reset --hard second && |
|
echo "line 5" >> file1 && |
|
git add file1 && |
|
test_must_fail git reset --keep HEAD^ |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: C C C D --merge D D D |
|
# file2: C C D D --merge D D D |
|
test_expect_success 'reset --merge discards changes added to index (2)' ' |
|
git reset --hard second && |
|
echo "line 4" >> file2 && |
|
git add file2 && |
|
git reset --merge HEAD^ && |
|
! grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && |
|
test -z "$(git diff)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
test_expect_success 'reset --merge is ok again when switching back (2)' ' |
|
git reset --hard initial && |
|
git reset --merge second && |
|
! grep 4 file2 && |
|
grep 4 file1 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: C C C D --keep D D D |
|
# file2: C C D D --keep C D D |
|
test_expect_success 'reset --keep keeps changes it does not touch' ' |
|
git reset --hard second && |
|
echo "line 4" >> file2 && |
|
git add file2 && |
|
git reset --keep HEAD^ && |
|
grep 4 file2 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
test_expect_success 'reset --keep keeps changes when switching back' ' |
|
git reset --keep second && |
|
grep 4 file2 && |
|
grep 4 file1 && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: A B B C --merge (disallowed) |
|
test_expect_success 'reset --merge fails with changes in file it touches' ' |
|
git reset --hard second && |
|
echo "line 5" >> file1 && |
|
test_tick && |
|
git commit -m "add line 5" file1 && |
|
sed -e "s/line 1/changed line 1/" <file1 >file3 && |
|
mv file3 file1 && |
|
test_must_fail git reset --merge HEAD^ 2>err.log && |
|
grep file1 err.log | grep "not uptodate" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: A B B C --keep (disallowed) |
|
test_expect_success 'reset --keep fails with changes in file it touches' ' |
|
git reset --hard second && |
|
echo "line 5" >> file1 && |
|
test_tick && |
|
git commit -m "add line 5" file1 && |
|
sed -e "s/line 1/changed line 1/" <file1 >file3 && |
|
mv file3 file1 && |
|
test_must_fail git reset --keep HEAD^ 2>err.log && |
|
grep file1 err.log | grep "not uptodate" |
|
' |
|
|
|
test_expect_success 'setup 3 different branches' ' |
|
git reset --hard second && |
|
git branch branch1 && |
|
git branch branch2 && |
|
git branch branch3 && |
|
git checkout branch1 && |
|
echo "line 5 in branch1" >> file1 && |
|
test_tick && |
|
git commit -a -m "change in branch1" && |
|
git checkout branch2 && |
|
echo "line 5 in branch2" >> file1 && |
|
test_tick && |
|
git commit -a -m "change in branch2" && |
|
git tag third && |
|
git checkout branch3 && |
|
echo a new file >file3 && |
|
rm -f file1 && |
|
git add file3 && |
|
test_tick && |
|
git commit -a -m "change in branch3" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: X U B C --merge C C C |
|
test_expect_success '"reset --merge HEAD^" is ok with pending merge' ' |
|
git checkout third && |
|
test_must_fail git merge branch1 && |
|
git reset --merge HEAD^ && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && |
|
test -z "$(git diff --cached)" && |
|
test -z "$(git diff)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: X U B C --keep (disallowed) |
|
test_expect_success '"reset --keep HEAD^" fails with pending merge' ' |
|
git reset --hard third && |
|
test_must_fail git merge branch1 && |
|
test_must_fail git reset --keep HEAD^ 2>err.log && |
|
test_i18ngrep "middle of a merge" err.log |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: X U B B --merge B B B |
|
test_expect_success '"reset --merge HEAD" is ok with pending merge' ' |
|
git reset --hard third && |
|
test_must_fail git merge branch1 && |
|
git reset --merge HEAD && |
|
test "$(git rev-parse HEAD)" = "$(git rev-parse third)" && |
|
test -z "$(git diff --cached)" && |
|
test -z "$(git diff)" |
|
' |
|
|
|
# The next test will test the following: |
|
# |
|
# working index HEAD target working index HEAD |
|
# ---------------------------------------------------- |
|
# file1: X U B B --keep (disallowed) |
|
test_expect_success '"reset --keep HEAD" fails with pending merge' ' |
|
git reset --hard third && |
|
test_must_fail git merge branch1 && |
|
test_must_fail git reset --keep HEAD 2>err.log && |
|
test_i18ngrep "middle of a merge" err.log |
|
' |
|
|
|
test_expect_success '--merge is ok with added/deleted merge' ' |
|
git reset --hard third && |
|
rm -f file2 && |
|
test_must_fail git merge branch3 && |
|
! test -f file2 && |
|
test -f file3 && |
|
git diff --exit-code file3 && |
|
git diff --exit-code branch3 file3 && |
|
git reset --merge HEAD && |
|
! test -f file3 && |
|
! test -f file2 && |
|
git diff --exit-code --cached |
|
' |
|
|
|
test_expect_success '--keep fails with added/deleted merge' ' |
|
git reset --hard third && |
|
rm -f file2 && |
|
test_must_fail git merge branch3 && |
|
! test -f file2 && |
|
test -f file3 && |
|
git diff --exit-code file3 && |
|
git diff --exit-code branch3 file3 && |
|
test_must_fail git reset --keep HEAD 2>err.log && |
|
test_i18ngrep "middle of a merge" err.log |
|
' |
|
|
|
test_done
|
|
|