1#!/bin/sh 2# 3# Copyright (c) 2009 Christian Couder 4# 5 6test_description='Tests for "git reset --merge"' 7 8. ./test-lib.sh 9 10test_expect_success setup ' 11 for i in 1 2 3; do echo line$i; done >file1 && 12 cat file1 >file2 && 13 git add file1 file2 && 14 test_tick && 15 git commit -m "Initial commit" && 16 git tag initial && 17 echo line 4 >>file1 && 18 cat file1 >file2 && 19 test_tick && 20 git commit -m "add line 4 to file1" file1 && 21 git tag second 22' 23 24# The next test will test the following: 25# 26# working index HEAD target working index HEAD 27# ---------------------------------------------------- 28# file1: C C C D --merge D D D 29# file2: C D D D --merge C D D 30test_expect_success 'reset --merge is ok with changes in file it does not touch'' 31 git reset --merge HEAD^ && 32 ! grep 4 file1 && 33 grep 4 file2 && 34 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && 35 test -z "$(git diff --cached)" 36' 37 38test_expect_success 'reset --merge is ok when switching back'' 39 git reset --merge second && 40 grep 4 file1 && 41 grep 4 file2 && 42 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && 43 test -z "$(git diff --cached)" 44' 45 46# The next test will test the following: 47# 48# working index HEAD target working index HEAD 49# ---------------------------------------------------- 50# file1: B B C D --merge D D D 51# file2: C D D D --merge C D D 52test_expect_success 'reset --merge discards changes added to index (1)'' 53 git reset --hard second && 54 cat file1 >file2 && 55 echo "line 5" >> file1 && 56 git add file1 && 57 git reset --merge HEAD^ && 58 ! grep 4 file1 && 59 ! grep 5 file1 && 60 grep 4 file2 && 61 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && 62 test -z "$(git diff --cached)" 63' 64 65test_expect_success 'reset --merge is ok again when switching back (1)'' 66 git reset --hard initial && 67 echo "line 5" >> file2 && 68 git add file2 && 69 git reset --merge second && 70 ! grep 4 file2 && 71 ! grep 5 file1 && 72 grep 4 file1 && 73 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && 74 test -z "$(git diff --cached)" 75' 76 77# The next test will test the following: 78# 79# working index HEAD target working index HEAD 80# ---------------------------------------------------- 81# file1: C C C D --merge D D D 82# file2: C C D D --merge D D D 83test_expect_success 'reset --merge discards changes added to index (2)'' 84 git reset --hard second && 85 echo "line 4" >> file2 && 86 git add file2 && 87 git reset --merge HEAD^ && 88 ! grep 4 file2 && 89 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" && 90 test -z "$(git diff)" && 91 test -z "$(git diff --cached)" 92' 93 94test_expect_success 'reset --merge is ok again when switching back (2)'' 95 git reset --hard initial && 96 git reset --merge second && 97 ! grep 4 file2 && 98 grep 4 file1 && 99 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && 100 test -z "$(git diff --cached)" 101' 102 103# The next test will test the following: 104# 105# working index HEAD target working index HEAD 106# ---------------------------------------------------- 107# file1: A B B C --merge (disallowed) 108test_expect_success 'reset --merge fails with changes in file it touches'' 109 git reset --hard second && 110 echo "line 5" >> file1 && 111 test_tick && 112 git commit -m "add line 5" file1 && 113 sed -e "s/line 1/changed line 1/" <file1 >file3 && 114 mv file3 file1 && 115 test_must_fail git reset --merge HEAD^ 2>err.log && 116 grep file1 err.log | grep "not uptodate" 117' 118 119test_expect_success 'setup 3 different branches'' 120 git reset --hard second && 121 git branch branch1 && 122 git branch branch2 && 123 git branch branch3 && 124 git checkout branch1 && 125 echo "line 5 in branch1" >> file1 && 126 test_tick && 127 git commit -a -m "change in branch1" && 128 git checkout branch2 && 129 echo "line 5 in branch2" >> file1 && 130 test_tick && 131 git commit -a -m "change in branch2" && 132 git tag third && 133 git checkout branch3 && 134 echo a new file >file3 && 135 rm -f file1 && 136 git add file3 && 137 test_tick && 138 git commit -a -m "change in branch3" 139' 140 141# The next test will test the following: 142# 143# working index HEAD target working index HEAD 144# ---------------------------------------------------- 145# file1: X U B C --merge C C C 146test_expect_success '"reset --merge HEAD^" is ok with pending merge'' 147 git checkout third && 148 test_must_fail git merge branch1 && 149 git reset --merge HEAD^ && 150 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" && 151 test -z "$(git diff --cached)" && 152 test -z "$(git diff)" 153' 154 155# The next test will test the following: 156# 157# working index HEAD target working index HEAD 158# ---------------------------------------------------- 159# file1: X U B B --merge B B B 160test_expect_success '"reset --merge HEAD" is ok with pending merge'' 161 git reset --hard third && 162 test_must_fail git merge branch1 && 163 git reset --merge HEAD && 164 test "$(git rev-parse HEAD)" = "$(git rev-parse third)" && 165 test -z "$(git diff --cached)" && 166 test -z "$(git diff)" 167' 168 169test_expect_success '--merge with added/deleted'' 170 git reset --hard third && 171 rm -f file2 && 172 test_must_fail git merge branch3 && 173 ! test -f file2 && 174 test -f file3 && 175 git diff --exit-code file3 && 176 git diff --exit-code branch3 file3 && 177 git reset --merge HEAD && 178 ! test -f file3 && 179 ! test -f file2 && 180 git diff --exit-code --cached 181' 182 183test_done