3 # Copyright (c) 2010 Johan Herland
6 test_description
='Test merging of notes trees'
8 TEST_PASSES_SANITIZE_LEAK
=true
11 test_expect_success setup
'
17 # Create notes on 4 first commits
18 git config core.notesRef refs/notes/x &&
19 git notes add -m "Notes on 1st commit" 1st &&
20 git notes add -m "Notes on 2nd commit" 2nd &&
21 git notes add -m "Notes on 3rd commit" 3rd &&
22 git notes add -m "Notes on 4th commit" 4th &&
23 # Copy notes to remote-notes
24 git fetch . refs/notes/*:refs/remote-notes/origin/* &&
27 hash4a sha1:5e93d24084d32e1cb61f7070505b9d2530cca987
28 hash3a sha1:8366731eeee53787d2bdf8fc1eff7d94757e8da0
29 hash2a sha1:eede89064cd42441590d6afec6c37b321ada3389
30 hash1a sha1:daa55ffad6cb99bf64226532147ffcaf5ce8bdd1
31 hash5b sha1:0f2efbd00262f2fd41dfae33df8765618eeacd99
32 hash4b sha1:dec2502dac3ea161543f71930044deff93fa945c
33 hash3b sha1:4069cdb399fd45463ec6eef8e051a16a03592d91
34 hash2c sha1:d000d30e6ddcfce3a8122c403226a2ce2fd04d9d
35 hash1c sha1:43add6bd0c8c0bc871ac7991e0f5573cfba27804
36 hash4d sha1:1f257a3a90328557c452f0817d6cc50c89d315d4
37 hash3d sha1:05a4927951bcef347f51486575b878b2b60137f2
39 hash4a sha256:eef876be1d32ac2e2e42240e0429325cec116e55e88cb2969899fac695aa762f
40 hash3a sha256:cf7cd1bc091d7ba4166a86df864110e42087cd893a5ae96bc50d637e0290939d
41 hash2a sha256:21ddde7ebce2c285213898cb04deca0fd3209610cf7aaf8222e4e2f45262fae2
42 hash1a sha256:f9fe0eda16c6027732ed9d4295689a03abd16f893be69b3dcbf4037ddb191921
43 hash5b sha256:20046f2244577797a9e3d3f790ea9eca4d8a6bafb2a5570bcb0e03aa02ce100b
44 hash4b sha256:f90563d134c61a95bb88afbd45d48ccc9e919c62aa6fbfcd483302b3e4d8dbcb
45 hash3b sha256:988f2aca9f2d87e93e6a73197c2bb99560cc44a2f92d18653968f956f01221e0
46 hash2c sha256:84153b777b4d42827a756c6578dcdb59d8ae5d1360b874fb37c430150c825c26
47 hash1c sha256:9beb2bc4eef72e4c4087be168a20573e34d993d9ab1883055f23e322afa06567
48 hash4d sha256:32de39dc06e679a7abb2d4a55ede7709b3124340a4a90aa305971b1c72ac319d
49 hash3d sha256:fa73b20e41cbb7541c4c81d1535016131dbfbeb05bf6a71f6115e9cad31c7af5
53 commit_sha1
=$
(git rev-parse
1st^
{commit
})
54 commit_sha2
=$
(git rev-parse
2nd^
{commit
})
55 commit_sha3
=$
(git rev-parse
3rd^
{commit
})
56 commit_sha4
=$
(git rev-parse
4th^
{commit
})
57 commit_sha5
=$
(git rev-parse
5th^
{commit
})
61 git
-c core.notesRef
="refs/notes/$notes_ref" notes |
62 sort >"output_notes_$notes_ref" &&
63 test_cmp
"expect_notes_$notes_ref" "output_notes_$notes_ref" &&
64 git
-c core.notesRef
="refs/notes/$notes_ref" log
--format="%H %s%n%N" \
65 >"output_log_$notes_ref" &&
66 test_cmp
"expect_log_$notes_ref" "output_log_$notes_ref"
69 cat <<EOF | sort >expect_notes_x
70 $(test_oid hash4a) $commit_sha4
71 $(test_oid hash3a) $commit_sha3
72 $(test_oid hash2a) $commit_sha2
73 $(test_oid hash1a) $commit_sha1
76 cat >expect_log_x
<<EOF
93 test_expect_success
'verify initial notes (x)' '
97 cp expect_notes_x expect_notes_y
98 cp expect_notes_x expect_notes_v
99 cp expect_log_x expect_log_y
100 cp expect_log_x expect_log_v
102 test_expect_success
'fail to merge empty notes ref into empty notes ref (z => y)' '
103 test_must_fail git -c "core.notesRef=refs/notes/y" notes merge z
106 test_expect_success
'fail to merge into various non-notes refs' '
107 test_must_fail git -c "core.notesRef=refs/notes" notes merge x &&
108 test_must_fail git -c "core.notesRef=refs/notes/" notes merge x &&
109 git update-ref refs/notes/dir/foo HEAD &&
110 test_must_fail git -c "core.notesRef=refs/notes/dir" notes merge x &&
111 test_must_fail git -c "core.notesRef=refs/notes/dir/" notes merge x &&
112 test_must_fail git -c "core.notesRef=refs/heads/main" notes merge x &&
113 test_must_fail git -c "core.notesRef=refs/notes/y:" notes merge x &&
114 test_must_fail git -c "core.notesRef=refs/notes/y:foo" notes merge x &&
115 test_must_fail git -c "core.notesRef=refs/notes/foo^{bar" notes merge x
118 test_expect_success
'merge non-notes ref into empty notes ref (remote-notes/origin/x => v)' '
119 git config core.notesRef refs/notes/v &&
120 git notes merge refs/remote-notes/origin/x &&
122 # refs/remote-notes/origin/x and v should point to the same notes commit
123 test "$(git rev-parse refs/remote-notes/origin/x)" = "$(git rev-parse refs/notes/v)"
126 test_expect_success
'merge notes into empty notes ref (x => y)' '
127 git config core.notesRef refs/notes/y &&
130 # x and y should point to the same notes commit
131 test "$(git rev-parse refs/notes/x)" = "$(git rev-parse refs/notes/y)"
134 test_expect_success
'merge empty notes ref (z => y)' '
136 # y should not change (still == x)
137 test "$(git rev-parse refs/notes/x)" = "$(git rev-parse refs/notes/y)"
140 test_expect_success
'change notes on other notes ref (y)' '
141 # Not touching notes to 1st commit
142 git notes remove 2nd &&
143 git notes append -m "More notes on 3rd commit" 3rd &&
144 git notes add -f -m "New notes on 4th commit" 4th &&
145 git notes add -m "Notes on 5th commit" 5th
148 test_expect_success
'merge previous notes commit (y^ => y) => No-op' '
149 pre_state="$(git rev-parse refs/notes/y)" &&
150 git notes merge y^ &&
152 test "$pre_state" = "$(git rev-parse refs/notes/y)"
155 cat <<EOF | sort >expect_notes_y
156 $(test_oid hash5b) $commit_sha5
157 $(test_oid hash4b) $commit_sha4
158 $(test_oid hash3b) $commit_sha3
159 $(test_oid hash1a) $commit_sha1
162 cat >expect_log_y
<<EOF
167 New notes on 4th commit
172 More notes on 3rd commit
181 test_expect_success
'verify changed notes on other notes ref (y)' '
185 test_expect_success
'verify unchanged notes on original notes ref (x)' '
189 test_expect_success
'merge original notes (x) into changed notes (y) => No-op' '
190 git notes merge -vvv x &&
195 cp expect_notes_y expect_notes_x
196 cp expect_log_y expect_log_x
198 test_expect_success
'merge changed (y) into original (x) => Fast-forward' '
199 git config core.notesRef refs/notes/x &&
203 # x and y should point to same the notes commit
204 test "$(git rev-parse refs/notes/x)" = "$(git rev-parse refs/notes/y)"
207 test_expect_success
'merge empty notes ref (z => y)' '
208 # Prepare empty (but valid) notes ref (z)
209 git config core.notesRef refs/notes/z &&
210 git notes add -m "foo" &&
212 git notes >output_notes_z &&
213 test_must_be_empty output_notes_z &&
214 # Do the merge (z => y)
215 git config core.notesRef refs/notes/y &&
218 # y should no longer point to the same notes commit as x
219 test "$(git rev-parse refs/notes/x)" != "$(git rev-parse refs/notes/y)"
222 cat <<EOF | sort >expect_notes_y
223 $(test_oid hash5b) $commit_sha5
224 $(test_oid hash4b) $commit_sha4
225 $(test_oid hash3b) $commit_sha3
226 $(test_oid hash2c) $commit_sha2
227 $(test_oid hash1c) $commit_sha1
230 cat >expect_log_y
<<EOF
235 New notes on 4th commit
240 More notes on 3rd commit
243 New notes on 2nd commit
248 More notes on 1st commit
252 test_expect_success
'change notes on other notes ref (y)' '
253 # Append to 1st commit notes
254 git notes append -m "More notes on 1st commit" 1st &&
255 # Add new notes to 2nd commit
256 git notes add -m "New notes on 2nd commit" 2nd &&
260 cat <<EOF | sort >expect_notes_x
261 $(test_oid hash5b) $commit_sha5
262 $(test_oid hash4d) $commit_sha4
263 $(test_oid hash1a) $commit_sha1
266 cat >expect_log_x
<<EOF
271 New notes on 4th commit
273 More notes on 4th commit
284 test_expect_success
'change notes on notes ref (x)' '
285 git config core.notesRef refs/notes/x &&
286 git notes remove 3rd &&
287 git notes append -m "More notes on 4th commit" 4th &&
291 cat <<EOF | sort >expect_notes_x
292 $(test_oid hash5b) $commit_sha5
293 $(test_oid hash4d) $commit_sha4
294 $(test_oid hash2c) $commit_sha2
295 $(test_oid hash1c) $commit_sha1
298 cat >expect_log_x
<<EOF
303 New notes on 4th commit
305 More notes on 4th commit
310 New notes on 2nd commit
315 More notes on 1st commit
319 test_expect_success
'merge y into x => Non-conflicting 3-way merge' '
325 cat <<EOF | sort >expect_notes_w
326 $(test_oid hash3d) $commit_sha3
327 $(test_oid hash2c) $commit_sha2
330 cat >expect_log_w
<<EOF
336 New notes on 3rd commit
339 New notes on 2nd commit
345 test_expect_success
'create notes on new, separate notes ref (w)' '
346 git config core.notesRef refs/notes/w &&
347 # Add same note as refs/notes/y on 2nd commit
348 git notes add -m "New notes on 2nd commit" 2nd &&
349 # Add new note on 3rd commit (non-conflicting)
350 git notes add -m "New notes on 3rd commit" 3rd &&
351 # Verify state of notes on new, separate notes ref (w)
355 cat <<EOF | sort >expect_notes_x
356 $(test_oid hash5b) $commit_sha5
357 $(test_oid hash4d) $commit_sha4
358 $(test_oid hash3d) $commit_sha3
359 $(test_oid hash2c) $commit_sha2
360 $(test_oid hash1c) $commit_sha1
363 cat >expect_log_x
<<EOF
368 New notes on 4th commit
370 More notes on 4th commit
373 New notes on 3rd commit
376 New notes on 2nd commit
381 More notes on 1st commit
385 test_expect_success
'merge w into x => Non-conflicting history-less merge' '
386 git config core.notesRef refs/notes/x &&
388 # Verify new state of notes on other notes ref (x)
390 # Also verify that nothing changed on other notes refs (y and w)