3 # Copyright (c) 2009 Johan Herland
6 test_description='test git fast-import of notes objects'
11 cat >input <<INPUT_END
12 commit refs/heads/master
13 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
20 file foo in first commit
25 file bar in first commit
28 M 644 inline baz/xyzzy
30 file baz/xyzzy in first commit
33 commit refs/heads/master
34 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
41 file foo in second commit
44 M 755 inline baz/xyzzy
46 file baz/xyzzy in second commit
49 commit refs/heads/master
50 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
57 file foo in third commit
60 commit refs/heads/master
61 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
68 file bar in fourth commit
73 test_expect_success 'set up master branch' '
75 git fast-import <input &&
76 git whatchanged master
79 commit4=$(git rev-parse refs/heads/master)
80 commit3=$(git rev-parse "$commit4^")
81 commit2=$(git rev-parse "$commit4~2")
82 commit1=$(git rev-parse "$commit4~3")
85 cat >input <<INPUT_END
86 commit refs/notes/test
87 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
94 first note for first commit
99 first note for second commit
104 cat >expect <<EXPECT_END
108 first note for second commit
110 first note for first commit
113 test_expect_success 'add notes with simple M command' '
115 git fast-import <input &&
116 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
117 test_cmp expect actual
122 cat >input <<INPUT_END
123 commit refs/notes/test
124 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
129 from refs/notes/test^0
132 first note for third commit
137 first note for fourth commit
142 cat >expect <<EXPECT_END
144 first note for fourth commit
146 first note for third commit
148 first note for second commit
150 first note for first commit
153 test_expect_success 'add notes with simple N command' '
155 git fast-import <input &&
156 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
157 test_cmp expect actual
162 cat >input <<INPUT_END
163 commit refs/notes/test
164 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
169 from refs/notes/test^0
172 second note for first commit
177 second note for second commit
182 second note for third commit
187 second note for fourth commit
192 cat >expect <<EXPECT_END
194 second note for fourth commit
196 second note for third commit
198 second note for second commit
200 second note for first commit
203 test_expect_success 'update existing notes with N command' '
205 git fast-import <input &&
206 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
207 test_cmp expect actual
212 cat >input <<INPUT_END
213 commit refs/notes/test
214 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
219 from refs/notes/test^0
220 M 644 inline $(echo "$commit3" | sed "s|^..|&/|")
222 prefix of note for third commit
225 M 644 inline $(echo "$commit4" | sed "s|^..|&/|")
227 prefix of note for fourth commit
230 M 644 inline $(echo "$commit4" | sed "s|^\(..\)\(..\)|\1/\2/|")
232 pre-prefix of note for fourth commit
237 third note for first commit
242 third note for second commit
247 third note for third commit
252 third note for fourth commit
260 cat >expect <<EXPECT_END
262 pre-prefix of note for fourth commit
264 prefix of note for fourth commit
266 third note for fourth commit
268 prefix of note for third commit
270 third note for third commit
272 third note for second commit
274 third note for first commit
277 test_expect_success 'add concatentation notes with M command' '
279 git fast-import <input &&
280 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
281 test_cmp expect actual
286 cat >input <<INPUT_END
287 commit refs/notes/test
288 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
293 from refs/notes/test^0
298 cat >expect <<EXPECT_END
305 test_expect_success 'verify that deleteall also removes notes' '
307 git fast-import <input &&
308 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
309 test_cmp expect actual
314 cat >input <<INPUT_END
315 commit refs/notes/test
316 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
321 from refs/notes/test^0
322 M 644 inline $commit1
324 third note for first commit
327 M 644 inline $commit3
329 third note for third commit
334 fourth note for first commit
339 fourth note for third commit
344 cat >expect <<EXPECT_END
347 fourth note for third commit
350 fourth note for first commit
353 test_expect_success 'verify that later N commands override earlier M commands' '
355 git fast-import <input &&
356 GIT_NOTES_REF=refs/notes/test git log | grep "^ " > actual &&
357 test_cmp expect actual
361 # Write fast-import commands to create the given number of commits
362 fast_import_commits () {
367 while test $my_i -lt $my_num_commits
371 cat >>"$my_append_to_file" <<INPUT_END
374 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
381 file contents in commit #$my_i
388 # Write fast-import commands to create the given number of notes annotating
389 # the commits created by fast_import_commits()
390 fast_import_notes () {
396 cat >>"$my_append_to_file" <<INPUT_END
398 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
400 committing $my_num_commits notes
406 while test $my_i -lt $my_num_commits
409 cat >>"$my_append_to_file" <<INPUT_END
412 note for commit #$my_i$my_note_append
422 # Create lots of commits
423 fast_import_commits "refs/heads/many_commits" $num_commits input
424 # Create one note per above commit
425 fast_import_notes "refs/notes/many_notes" $num_commits input
426 # Add a couple of non-notes as well
428 cat >>input <<INPUT_END
429 commit refs/notes/many_notes
430 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
432 committing some non-notes to the notes tree
435 M 755 inline foobar/non-note.txt
437 This is not a note, but rather a regular file residing in a notes tree
440 M 644 inline deadbeef
445 M 644 inline de/adbeef
447 Another non-note file
451 # Finally create the expected output from all these notes and commits
455 cat >>expect <<EXPECT_END
462 test_expect_success 'add lots of commits and notes' '
464 git fast-import <input &&
465 GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
466 grep "^ " > actual &&
467 test_cmp expect actual
471 test_expect_success 'verify that lots of notes trigger a fanout scheme' '
473 # None of the entries in the top-level notes tree should be a full SHA1
474 git ls-tree --name-only refs/notes/many_notes |
477 if test $(expr length "$path") -ge 40
485 cat >>expect_non-note1 << EOF
486 This is not a note, but rather a regular file residing in a notes tree
489 cat >>expect_non-note2 << EOF
493 cat >>expect_non-note3 << EOF
494 Another non-note file
497 test_expect_success 'verify that non-notes are untouched by a fanout change' '
499 git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
500 test_cmp expect_non-note1 actual &&
501 git cat-file -p refs/notes/many_notes:deadbeef > actual &&
502 test_cmp expect_non-note2 actual &&
503 git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
504 test_cmp expect_non-note3 actual
509 cat >>input <<INPUT_END
510 commit refs/notes/many_notes
511 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
513 removing all notes but $remaining_notes
515 from refs/notes/many_notes^0
519 while test $i -lt $num_commits
522 cat >>input <<INPUT_END
523 N 0000000000000000000000000000000000000000 :$i
531 cat >>expect <<EXPECT_END
534 if test $i -le $remaining_notes
536 cat >>expect <<EXPECT_END
543 test_expect_success 'remove lots of notes' '
545 git fast-import <input &&
546 GIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |
547 grep "^ " > actual &&
548 test_cmp expect actual
552 test_expect_success 'verify that removing notes trigger fanout consolidation' '
554 # All entries in the top-level notes tree should be a full SHA1
555 git ls-tree --name-only -r refs/notes/many_notes |
558 # Explicitly ignore the non-note paths
559 test "$path" = "foobar/non-note.txt" && continue
560 test "$path" = "deadbeef" && continue
561 test "$path" = "de/adbeef" && continue
563 if test $(expr length "$path") -ne 40
571 test_expect_success 'verify that non-notes are untouched by a fanout change' '
573 git cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&
574 test_cmp expect_non-note1 actual &&
575 git cat-file -p refs/notes/many_notes:deadbeef > actual &&
576 test_cmp expect_non-note2 actual &&
577 git cat-file -p refs/notes/many_notes:de/adbeef > actual &&
578 test_cmp expect_non-note3 actual
588 fast_import_commits "refs/heads/more_commits" $num_commits input
589 # Create one note per above commit per notes ref
591 while test $i -lt $num_notes_refs
594 fast_import_notes "refs/notes/more_notes_$i" $num_commits input
596 # Trigger branch reloading in git-fast-import by repeating the note creation
598 while test $i -lt $num_notes_refs
601 fast_import_notes "refs/notes/more_notes_$i" $some_commits input " (2)"
603 # Finally create the expected output from the notes in refs/notes/more_notes_1
607 note_data="note for commit #$i"
608 if test $i -le $some_commits
610 note_data="$note_data (2)"
612 cat >>expect <<EXPECT_END
619 test_expect_success "add notes to $num_commits commits in each of $num_notes_refs refs" '
621 git fast-import --active-branches=5 <input &&
622 GIT_NOTES_REF=refs/notes/more_notes_1 git log refs/heads/more_commits |
623 grep "^ " > actual &&
624 test_cmp expect actual