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