Browse Source
* cc/reset-more: t7111: check that reset options work as described in the tables Documentation: reset: add some missing tables Fix bit assignment for CE_CONFLICTED "reset --merge": fix unmerged case reset: use "unpack_trees()" directly instead of "git read-tree" reset: add a few tests for "git reset --merge" Documentation: reset: add some tables to describe the different options reset: improve mixed reset error message when in a bare repomaint
Junio C Hamano
15 years ago
7 changed files with 435 additions and 20 deletions
@ -0,0 +1,183 @@ |
|||||||
|
#!/bin/sh |
||||||
|
# |
||||||
|
# Copyright (c) 2009 Christian Couder |
||||||
|
# |
||||||
|
|
||||||
|
test_description='Tests for "git reset --merge"' |
||||||
|
|
||||||
|
. ./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: 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: 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: 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" |
||||||
|
' |
||||||
|
|
||||||
|
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 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)" |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success '--merge with added/deleted' ' |
||||||
|
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_done |
@ -0,0 +1,113 @@ |
|||||||
|
#!/bin/sh |
||||||
|
# |
||||||
|
# Copyright (c) 2010 Christian Couder |
||||||
|
# |
||||||
|
|
||||||
|
test_description='Tests to check that "reset" options follow a known table' |
||||||
|
|
||||||
|
. ./test-lib.sh |
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'creating initial commits' ' |
||||||
|
test_commit E file1 && |
||||||
|
test_commit D file1 && |
||||||
|
test_commit C file1 |
||||||
|
' |
||||||
|
|
||||||
|
while read W1 I1 H1 T opt W2 I2 H2 |
||||||
|
do |
||||||
|
test_expect_success "check: $W1 $I1 $H1 $T --$opt $W2 $I2 $H2" ' |
||||||
|
git reset --hard C && |
||||||
|
if test "$I1" != "$H1" |
||||||
|
then |
||||||
|
echo "$I1" >file1 && |
||||||
|
git add file1 |
||||||
|
fi && |
||||||
|
if test "$W1" != "$I1" |
||||||
|
then |
||||||
|
echo "$W1" >file1 |
||||||
|
fi && |
||||||
|
if test "$W2" != "XXXXX" |
||||||
|
then |
||||||
|
git reset --$opt $T && |
||||||
|
test "$(cat file1)" = "$W2" && |
||||||
|
git checkout-index -f -- file1 && |
||||||
|
test "$(cat file1)" = "$I2" && |
||||||
|
git checkout -f HEAD -- file1 && |
||||||
|
test "$(cat file1)" = "$H2" |
||||||
|
else |
||||||
|
test_must_fail git reset --$opt $T |
||||||
|
fi |
||||||
|
' |
||||||
|
done <<\EOF |
||||||
|
A B C D soft A B D |
||||||
|
A B C D mixed A D D |
||||||
|
A B C D hard D D D |
||||||
|
A B C D merge XXXXX |
||||||
|
A B C C soft A B C |
||||||
|
A B C C mixed A C C |
||||||
|
A B C C hard C C C |
||||||
|
A B C C merge XXXXX |
||||||
|
B B C D soft B B D |
||||||
|
B B C D mixed B D D |
||||||
|
B B C D hard D D D |
||||||
|
B B C D merge D D D |
||||||
|
B B C C soft B B C |
||||||
|
B B C C mixed B C C |
||||||
|
B B C C hard C C C |
||||||
|
B B C C merge C C C |
||||||
|
B C C D soft B C D |
||||||
|
B C C D mixed B D D |
||||||
|
B C C D hard D D D |
||||||
|
B C C D merge XXXXX |
||||||
|
B C C C soft B C C |
||||||
|
B C C C mixed B C C |
||||||
|
B C C C hard C C C |
||||||
|
B C C C merge B C C |
||||||
|
EOF |
||||||
|
|
||||||
|
test_expect_success 'setting up branches to test with unmerged entries' ' |
||||||
|
git reset --hard C && |
||||||
|
git branch branch1 && |
||||||
|
git branch branch2 && |
||||||
|
git checkout branch1 && |
||||||
|
test_commit B1 file1 && |
||||||
|
git checkout branch2 && |
||||||
|
test_commit B2 file1 |
||||||
|
' |
||||||
|
|
||||||
|
while read W1 I1 H1 T opt W2 I2 H2 |
||||||
|
do |
||||||
|
test_expect_success "check: $W1 $I1 $H1 $T --$opt $W2 $I2 $H2" ' |
||||||
|
git reset --hard B2 && |
||||||
|
test_must_fail git merge branch1 && |
||||||
|
cat file1 >X_file1 && |
||||||
|
if test "$W2" != "XXXXX" |
||||||
|
then |
||||||
|
git reset --$opt $T && |
||||||
|
if test "$W2" = "X" |
||||||
|
then |
||||||
|
test_cmp file1 X_file1 |
||||||
|
else |
||||||
|
test "$(cat file1)" = "$W2" |
||||||
|
fi && |
||||||
|
git checkout-index -f -- file1 && |
||||||
|
test "$(cat file1)" = "$I2" && |
||||||
|
git checkout -f HEAD -- file1 && |
||||||
|
test "$(cat file1)" = "$H2" |
||||||
|
else |
||||||
|
test_must_fail git reset --$opt $T |
||||||
|
fi |
||||||
|
' |
||||||
|
done <<\EOF |
||||||
|
X U C D soft XXXXX |
||||||
|
X U C D mixed X D D |
||||||
|
X U C D hard D D D |
||||||
|
X U C D merge D D D |
||||||
|
X U C C soft XXXXX |
||||||
|
X U C C mixed X C C |
||||||
|
X U C C hard C C C |
||||||
|
X U C C merge C C C |
||||||
|
EOF |
||||||
|
|
||||||
|
test_done |
Loading…
Reference in new issue