]>
Commit | Line | Data |
---|---|---|
a6ee883b EN |
1 | #!/bin/sh |
2 | ||
3 | test_description="merges with unrelated index changes" | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | # Testcase for some simple merges | |
8 | # A | |
eab3f285 | 9 | # o-------o B |
a6ee883b | 10 | # \ |
eab3f285 | 11 | # \-----o C |
a6ee883b | 12 | # \ |
eab3f285 | 13 | # \---o D |
a6ee883b | 14 | # \ |
eab3f285 EN |
15 | # \-o E |
16 | # \ | |
17 | # o F | |
a6ee883b EN |
18 | # Commit A: some file a |
19 | # Commit B: adds file b, modifies end of a | |
20 | # Commit C: adds file c | |
21 | # Commit D: adds file d, modifies beginning of a | |
22 | # Commit E: renames a->subdir/a, adds subdir/e | |
eab3f285 | 23 | # Commit F: empty commit |
a6ee883b EN |
24 | |
25 | test_expect_success 'setup trivial merges' ' | |
3f215b03 | 26 | test_seq 1 10 >a && |
a6ee883b EN |
27 | git add a && |
28 | test_tick && git commit -m A && | |
29 | ||
30 | git branch A && | |
31 | git branch B && | |
32 | git branch C && | |
33 | git branch D && | |
34 | git branch E && | |
eab3f285 | 35 | git branch F && |
a6ee883b EN |
36 | |
37 | git checkout B && | |
38 | echo b >b && | |
39 | echo 11 >>a && | |
40 | git add a b && | |
41 | test_tick && git commit -m B && | |
42 | ||
43 | git checkout C && | |
44 | echo c >c && | |
45 | git add c && | |
46 | test_tick && git commit -m C && | |
47 | ||
48 | git checkout D && | |
3f215b03 | 49 | test_seq 2 10 >a && |
a6ee883b EN |
50 | echo d >d && |
51 | git add a d && | |
52 | test_tick && git commit -m D && | |
53 | ||
54 | git checkout E && | |
55 | mkdir subdir && | |
56 | git mv a subdir/a && | |
57 | echo e >subdir/e && | |
58 | git add subdir && | |
eab3f285 EN |
59 | test_tick && git commit -m E && |
60 | ||
61 | git checkout F && | |
62 | test_tick && git commit --allow-empty -m F | |
a6ee883b EN |
63 | ' |
64 | ||
65 | test_expect_success 'ff update' ' | |
66 | git reset --hard && | |
67 | git checkout A^0 && | |
68 | ||
69 | touch random_file && git add random_file && | |
70 | ||
71 | git merge E^0 && | |
72 | ||
73 | test_must_fail git rev-parse HEAD:random_file && | |
4b317450 JH |
74 | test "$(git diff --name-only --cached E)" = "random_file" && |
75 | test_path_is_file random_file && | |
76 | git rev-parse --verify :random_file | |
a6ee883b EN |
77 | ' |
78 | ||
79 | test_expect_success 'ff update, important file modified' ' | |
80 | git reset --hard && | |
81 | git checkout A^0 && | |
82 | ||
83 | mkdir subdir && | |
84 | touch subdir/e && | |
85 | git add subdir/e && | |
86 | ||
58f4d1b9 | 87 | test_must_fail git merge E^0 && |
4b317450 JH |
88 | test_path_is_file subdir/e && |
89 | git rev-parse --verify :subdir/e && | |
58f4d1b9 | 90 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
91 | ' |
92 | ||
93 | test_expect_success 'resolve, trivial' ' | |
94 | git reset --hard && | |
95 | git checkout B^0 && | |
96 | ||
97 | touch random_file && git add random_file && | |
98 | ||
58f4d1b9 | 99 | test_must_fail git merge -s resolve C^0 && |
4b317450 JH |
100 | test_path_is_file random_file && |
101 | git rev-parse --verify :random_file && | |
58f4d1b9 | 102 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
103 | ' |
104 | ||
105 | test_expect_success 'resolve, non-trivial' ' | |
106 | git reset --hard && | |
107 | git checkout B^0 && | |
108 | ||
109 | touch random_file && git add random_file && | |
110 | ||
58f4d1b9 | 111 | test_must_fail git merge -s resolve D^0 && |
4b317450 JH |
112 | test_path_is_file random_file && |
113 | git rev-parse --verify :random_file && | |
58f4d1b9 | 114 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
115 | ' |
116 | ||
117 | test_expect_success 'recursive' ' | |
118 | git reset --hard && | |
119 | git checkout B^0 && | |
120 | ||
121 | touch random_file && git add random_file && | |
122 | ||
58f4d1b9 | 123 | test_must_fail git merge -s recursive C^0 && |
4b317450 JH |
124 | test_path_is_file random_file && |
125 | git rev-parse --verify :random_file && | |
58f4d1b9 | 126 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
127 | ' |
128 | ||
92702392 | 129 | test_expect_success 'recursive, when merge branch matches merge base' ' |
eab3f285 EN |
130 | git reset --hard && |
131 | git checkout B^0 && | |
132 | ||
133 | touch random_file && git add random_file && | |
134 | ||
58f4d1b9 EN |
135 | test_must_fail git merge -s recursive F^0 && |
136 | test_path_is_missing .git/MERGE_HEAD | |
eab3f285 EN |
137 | ' |
138 | ||
e1f8694f | 139 | test_expect_success 'merge-recursive, when index==head but head!=HEAD' ' |
cf69f2af EN |
140 | git reset --hard && |
141 | git checkout C^0 && | |
142 | ||
143 | # Make index match B | |
144 | git diff C B -- | git apply --cached && | |
f222bd34 | 145 | test_when_finished "git clean -fd" && # Do not leave untracked around |
cf69f2af EN |
146 | # Merge B & F, with B as "head" |
147 | git merge-recursive A -- B F > out && | |
148 | test_i18ngrep "Already up to date" out | |
149 | ' | |
150 | ||
eddd1a41 | 151 | test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' ' |
7f5271fa EN |
152 | git reset --hard && |
153 | git checkout B^0 && | |
154 | ||
155 | mkdir subdir && | |
156 | test_seq 1 10 >subdir/a && | |
157 | git add subdir/a && | |
4b317450 | 158 | git rev-parse --verify :subdir/a >expect && |
7f5271fa | 159 | |
eddd1a41 EN |
160 | # We have staged changes; merge should error out |
161 | test_must_fail git merge -s recursive E^0 2>err && | |
4b317450 JH |
162 | git rev-parse --verify :subdir/a >actual && |
163 | test_cmp expect actual && | |
eddd1a41 | 164 | test_i18ngrep "changes to the following files would be overwritten" err |
7f5271fa EN |
165 | ' |
166 | ||
eddd1a41 | 167 | test_expect_success 'recursive, when file has staged changes matching what a merge would give' ' |
7f5271fa EN |
168 | git reset --hard && |
169 | git checkout B^0 && | |
170 | ||
171 | mkdir subdir && | |
172 | test_seq 1 11 >subdir/a && | |
173 | git add subdir/a && | |
4b317450 | 174 | git rev-parse --verify :subdir/a >expect && |
7f5271fa | 175 | |
eddd1a41 EN |
176 | # We have staged changes; merge should error out |
177 | test_must_fail git merge -s recursive E^0 2>err && | |
4b317450 JH |
178 | git rev-parse --verify :subdir/a >actual && |
179 | test_cmp expect actual && | |
eddd1a41 | 180 | test_i18ngrep "changes to the following files would be overwritten" err |
7f5271fa EN |
181 | ' |
182 | ||
3ec62ad9 | 183 | test_expect_success 'octopus, unrelated file touched' ' |
a6ee883b EN |
184 | git reset --hard && |
185 | git checkout B^0 && | |
186 | ||
187 | touch random_file && git add random_file && | |
188 | ||
58f4d1b9 | 189 | test_must_fail git merge C^0 D^0 && |
4b317450 JH |
190 | test_path_is_missing .git/MERGE_HEAD && |
191 | git rev-parse --verify :random_file && | |
192 | test_path_exists random_file | |
a6ee883b EN |
193 | ' |
194 | ||
3ec62ad9 | 195 | test_expect_success 'octopus, related file removed' ' |
a6ee883b EN |
196 | git reset --hard && |
197 | git checkout B^0 && | |
198 | ||
199 | git rm b && | |
200 | ||
58f4d1b9 | 201 | test_must_fail git merge C^0 D^0 && |
4b317450 JH |
202 | test_path_is_missing b && |
203 | test_must_fail git rev-parse --verify :b && | |
58f4d1b9 | 204 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
205 | ' |
206 | ||
3ec62ad9 | 207 | test_expect_success 'octopus, related file modified' ' |
a6ee883b EN |
208 | git reset --hard && |
209 | git checkout B^0 && | |
210 | ||
211 | echo 12 >>a && git add a && | |
4b317450 | 212 | git rev-parse --verify :a >expect && |
a6ee883b | 213 | |
58f4d1b9 | 214 | test_must_fail git merge C^0 D^0 && |
4b317450 JH |
215 | test_path_is_file a && |
216 | git rev-parse --verify :a >actual && | |
217 | test_cmp expect actual && | |
58f4d1b9 | 218 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
219 | ' |
220 | ||
221 | test_expect_success 'ours' ' | |
222 | git reset --hard && | |
223 | git checkout B^0 && | |
224 | ||
225 | touch random_file && git add random_file && | |
226 | ||
58f4d1b9 | 227 | test_must_fail git merge -s ours C^0 && |
4b317450 JH |
228 | test_path_is_file random_file && |
229 | git rev-parse --verify :random_file && | |
58f4d1b9 | 230 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
231 | ' |
232 | ||
233 | test_expect_success 'subtree' ' | |
234 | git reset --hard && | |
235 | git checkout B^0 && | |
236 | ||
237 | touch random_file && git add random_file && | |
238 | ||
58f4d1b9 | 239 | test_must_fail git merge -s subtree E^0 && |
4b317450 JH |
240 | test_path_is_file random_file && |
241 | git rev-parse --verify :random_file && | |
58f4d1b9 | 242 | test_path_is_missing .git/MERGE_HEAD |
a6ee883b EN |
243 | ' |
244 | ||
245 | test_done |