]> git.ipfire.org Git - thirdparty/git.git/blame - t/t7110-reset-merge.sh
Merge branch 'jk/clone-allow-bare-and-o-together'
[thirdparty/git.git] / t / t7110-reset-merge.sh
CommitLineData
c9396690
CC
1#!/bin/sh
2#
3# Copyright (c) 2009 Christian Couder
4#
5
ffbc5dc2 6test_description='Tests for "git reset" with "--merge" and "--keep" options'
c9396690 7
3e3b9321 8TEST_PASSES_SANITIZE_LEAK=true
c9396690
CC
9. ./test-lib.sh
10
11test_expect_success setup '
efe26b9e 12 printf "line %d\n" 1 2 3 >file1 &&
c9396690
CC
13 cat file1 >file2 &&
14 git add file1 file2 &&
15 test_tick &&
16 git commit -m "Initial commit" &&
17 git tag initial &&
18 echo line 4 >>file1 &&
19 cat file1 >file2 &&
20 test_tick &&
21 git commit -m "add line 4 to file1" file1 &&
22 git tag second
23'
24
25# The next test will test the following:
26#
27# working index HEAD target working index HEAD
28# ----------------------------------------------------
29# file1: C C C D --merge D D D
30# file2: C D D D --merge C D D
31test_expect_success 'reset --merge is ok with changes in file it does not touch' '
32 git reset --merge HEAD^ &&
33 ! grep 4 file1 &&
34 grep 4 file2 &&
35 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
36 test -z "$(git diff --cached)"
37'
38
39test_expect_success 'reset --merge is ok when switching back' '
40 git reset --merge second &&
41 grep 4 file1 &&
42 grep 4 file2 &&
43 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
44 test -z "$(git diff --cached)"
45'
46
ffbc5dc2
CC
47# The next test will test the following:
48#
49# working index HEAD target working index HEAD
50# ----------------------------------------------------
51# file1: C C C D --keep D D D
52# file2: C D D D --keep C D D
53test_expect_success 'reset --keep is ok with changes in file it does not touch' '
54 git reset --hard second &&
55 cat file1 >file2 &&
56 git reset --keep HEAD^ &&
57 ! grep 4 file1 &&
58 grep 4 file2 &&
59 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
60 test -z "$(git diff --cached)"
61'
62
63test_expect_success 'reset --keep is ok when switching back' '
64 git reset --keep second &&
65 grep 4 file1 &&
66 grep 4 file2 &&
67 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
68 test -z "$(git diff --cached)"
69'
70
c9396690
CC
71# The next test will test the following:
72#
73# working index HEAD target working index HEAD
74# ----------------------------------------------------
75# file1: B B C D --merge D D D
76# file2: C D D D --merge C D D
77test_expect_success 'reset --merge discards changes added to index (1)' '
78 git reset --hard second &&
79 cat file1 >file2 &&
80 echo "line 5" >> file1 &&
81 git add file1 &&
82 git reset --merge HEAD^ &&
83 ! grep 4 file1 &&
84 ! grep 5 file1 &&
85 grep 4 file2 &&
86 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
87 test -z "$(git diff --cached)"
88'
89
90test_expect_success 'reset --merge is ok again when switching back (1)' '
91 git reset --hard initial &&
92 echo "line 5" >> file2 &&
93 git add file2 &&
94 git reset --merge second &&
95 ! grep 4 file2 &&
96 ! grep 5 file1 &&
97 grep 4 file1 &&
98 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
99 test -z "$(git diff --cached)"
100'
101
ffbc5dc2
CC
102# The next test will test the following:
103#
104# working index HEAD target working index HEAD
105# ----------------------------------------------------
106# file1: B B C D --keep (disallowed)
107test_expect_success 'reset --keep fails with changes in index in files it touches' '
108 git reset --hard second &&
109 echo "line 5" >> file1 &&
110 git add file1 &&
111 test_must_fail git reset --keep HEAD^
112'
113
c9396690
CC
114# The next test will test the following:
115#
116# working index HEAD target working index HEAD
117# ----------------------------------------------------
118# file1: C C C D --merge D D D
119# file2: C C D D --merge D D D
120test_expect_success 'reset --merge discards changes added to index (2)' '
121 git reset --hard second &&
122 echo "line 4" >> file2 &&
123 git add file2 &&
124 git reset --merge HEAD^ &&
125 ! grep 4 file2 &&
126 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
127 test -z "$(git diff)" &&
128 test -z "$(git diff --cached)"
129'
130
131test_expect_success 'reset --merge is ok again when switching back (2)' '
132 git reset --hard initial &&
133 git reset --merge second &&
134 ! grep 4 file2 &&
135 grep 4 file1 &&
136 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
137 test -z "$(git diff --cached)"
138'
139
ffbc5dc2
CC
140# The next test will test the following:
141#
142# working index HEAD target working index HEAD
143# ----------------------------------------------------
144# file1: C C C D --keep D D D
145# file2: C C D D --keep C D D
146test_expect_success 'reset --keep keeps changes it does not touch' '
147 git reset --hard second &&
148 echo "line 4" >> file2 &&
149 git add file2 &&
150 git reset --keep HEAD^ &&
151 grep 4 file2 &&
152 test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
153 test -z "$(git diff --cached)"
154'
155
156test_expect_success 'reset --keep keeps changes when switching back' '
157 git reset --keep second &&
158 grep 4 file2 &&
159 grep 4 file1 &&
160 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
161 test -z "$(git diff --cached)"
162'
163
c9396690
CC
164# The next test will test the following:
165#
166# working index HEAD target working index HEAD
167# ----------------------------------------------------
168# file1: A B B C --merge (disallowed)
169test_expect_success 'reset --merge fails with changes in file it touches' '
170 git reset --hard second &&
171 echo "line 5" >> file1 &&
172 test_tick &&
173 git commit -m "add line 5" file1 &&
174 sed -e "s/line 1/changed line 1/" <file1 >file3 &&
175 mv file3 file1 &&
176 test_must_fail git reset --merge HEAD^ 2>err.log &&
177 grep file1 err.log | grep "not uptodate"
178'
179
ffbc5dc2
CC
180# The next test will test the following:
181#
182# working index HEAD target working index HEAD
183# ----------------------------------------------------
184# file1: A B B C --keep (disallowed)
185test_expect_success 'reset --keep fails with changes in file it touches' '
186 git reset --hard second &&
187 echo "line 5" >> file1 &&
188 test_tick &&
189 git commit -m "add line 5" file1 &&
190 sed -e "s/line 1/changed line 1/" <file1 >file3 &&
191 mv file3 file1 &&
192 test_must_fail git reset --keep HEAD^ 2>err.log &&
193 grep file1 err.log | grep "not uptodate"
194'
195
e11d7b59 196test_expect_success 'setup 3 different branches' '
c9396690
CC
197 git reset --hard second &&
198 git branch branch1 &&
199 git branch branch2 &&
e11d7b59 200 git branch branch3 &&
c9396690
CC
201 git checkout branch1 &&
202 echo "line 5 in branch1" >> file1 &&
203 test_tick &&
204 git commit -a -m "change in branch1" &&
205 git checkout branch2 &&
206 echo "line 5 in branch2" >> file1 &&
207 test_tick &&
208 git commit -a -m "change in branch2" &&
e11d7b59
JH
209 git tag third &&
210 git checkout branch3 &&
211 echo a new file >file3 &&
212 rm -f file1 &&
213 git add file3 &&
214 test_tick &&
215 git commit -a -m "change in branch3"
c9396690
CC
216'
217
218# The next test will test the following:
219#
220# working index HEAD target working index HEAD
221# ----------------------------------------------------
e11d7b59 222# file1: X U B C --merge C C C
d0f379c2 223test_expect_success '"reset --merge HEAD^" is ok with pending merge' '
e11d7b59 224 git checkout third &&
c9396690 225 test_must_fail git merge branch1 &&
d0f379c2
SB
226 git reset --merge HEAD^ &&
227 test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
228 test -z "$(git diff --cached)" &&
e11d7b59 229 test -z "$(git diff)"
c9396690
CC
230'
231
ffbc5dc2
CC
232# The next test will test the following:
233#
234# working index HEAD target working index HEAD
235# ----------------------------------------------------
236# file1: X U B C --keep (disallowed)
476cca69 237test_expect_success '"reset --keep HEAD^" fails with pending merge' '
ffbc5dc2
CC
238 git reset --hard third &&
239 test_must_fail git merge branch1 &&
240 test_must_fail git reset --keep HEAD^ 2>err.log &&
476cca69 241 test_i18ngrep "middle of a merge" err.log
ffbc5dc2
CC
242'
243
c9396690
CC
244# The next test will test the following:
245#
246# working index HEAD target working index HEAD
247# ----------------------------------------------------
e11d7b59
JH
248# file1: X U B B --merge B B B
249test_expect_success '"reset --merge HEAD" is ok with pending merge' '
c9396690
CC
250 git reset --hard third &&
251 test_must_fail git merge branch1 &&
e11d7b59 252 git reset --merge HEAD &&
c9396690 253 test "$(git rev-parse HEAD)" = "$(git rev-parse third)" &&
e11d7b59
JH
254 test -z "$(git diff --cached)" &&
255 test -z "$(git diff)"
256'
257
ffbc5dc2
CC
258# The next test will test the following:
259#
260# working index HEAD target working index HEAD
261# ----------------------------------------------------
812d2a3d 262# file1: X U B B --keep (disallowed)
476cca69 263test_expect_success '"reset --keep HEAD" fails with pending merge' '
ffbc5dc2
CC
264 git reset --hard third &&
265 test_must_fail git merge branch1 &&
812d2a3d 266 test_must_fail git reset --keep HEAD 2>err.log &&
476cca69 267 test_i18ngrep "middle of a merge" err.log
ffbc5dc2
CC
268'
269
812d2a3d 270test_expect_success '--merge is ok with added/deleted merge' '
e11d7b59
JH
271 git reset --hard third &&
272 rm -f file2 &&
273 test_must_fail git merge branch3 &&
274 ! test -f file2 &&
275 test -f file3 &&
276 git diff --exit-code file3 &&
277 git diff --exit-code branch3 file3 &&
278 git reset --merge HEAD &&
279 ! test -f file3 &&
280 ! test -f file2 &&
281 git diff --exit-code --cached
c9396690
CC
282'
283
476cca69 284test_expect_success '--keep fails with added/deleted merge' '
ffbc5dc2
CC
285 git reset --hard third &&
286 rm -f file2 &&
287 test_must_fail git merge branch3 &&
288 ! test -f file2 &&
289 test -f file3 &&
290 git diff --exit-code file3 &&
291 git diff --exit-code branch3 file3 &&
812d2a3d 292 test_must_fail git reset --keep HEAD 2>err.log &&
476cca69 293 test_i18ngrep "middle of a merge" err.log
ffbc5dc2
CC
294'
295
c9396690 296test_done