|  | #!/bin/sh | 
|  |  | 
|  | test_description='Test notes trees that also contain non-notes' | 
|  |  | 
|  | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | 
|  | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | number_of_commits=100 | 
|  |  | 
|  | start_note_commit () { | 
|  | test_tick && | 
|  | cat <<INPUT_END | 
|  | commit refs/notes/commits | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | notes | 
|  | COMMIT | 
|  |  | 
|  | from refs/notes/commits^0 | 
|  | deleteall | 
|  | INPUT_END | 
|  |  | 
|  | } | 
|  |  | 
|  | verify_notes () { | 
|  | git log | grep "^    " > output && | 
|  | i=$number_of_commits && | 
|  | while [ $i -gt 0 ]; do | 
|  | echo "    commit #$i" && | 
|  | echo "    note for commit #$i" && | 
|  | i=$(($i-1)); | 
|  | done > expect && | 
|  | test_cmp expect output | 
|  | } | 
|  |  | 
|  | test_expect_success "setup: create a couple of commits" ' | 
|  |  | 
|  | test_tick && | 
|  | cat <<INPUT_END >input && | 
|  | commit refs/heads/main | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | commit #1 | 
|  | COMMIT | 
|  |  | 
|  | M 644 inline file | 
|  | data <<EOF | 
|  | file in commit #1 | 
|  | EOF | 
|  |  | 
|  | INPUT_END | 
|  |  | 
|  | test_tick && | 
|  | cat <<INPUT_END >>input && | 
|  | commit refs/heads/main | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | commit #2 | 
|  | COMMIT | 
|  |  | 
|  | M 644 inline file | 
|  | data <<EOF | 
|  | file in commit #2 | 
|  | EOF | 
|  |  | 
|  | INPUT_END | 
|  | git fast-import --quiet <input | 
|  | ' | 
|  |  | 
|  | test_expect_success "create a notes tree with both notes and non-notes" ' | 
|  |  | 
|  | commit1=$(git rev-parse refs/heads/main^) && | 
|  | commit2=$(git rev-parse refs/heads/main) && | 
|  | test_tick && | 
|  | cat <<INPUT_END >input && | 
|  | commit refs/notes/commits | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | notes commit #1 | 
|  | COMMIT | 
|  |  | 
|  | N inline $commit1 | 
|  | data <<EOF | 
|  | note for commit #1 | 
|  | EOF | 
|  |  | 
|  | N inline $commit2 | 
|  | data <<EOF | 
|  | note for commit #2 | 
|  | EOF | 
|  |  | 
|  | INPUT_END | 
|  | test_tick && | 
|  | cat <<INPUT_END >>input && | 
|  | commit refs/notes/commits | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | notes commit #2 | 
|  | COMMIT | 
|  |  | 
|  | M 644 inline foobar/non-note.txt | 
|  | data <<EOF | 
|  | A non-note in a notes tree | 
|  | EOF | 
|  |  | 
|  | N inline $commit2 | 
|  | data <<EOF | 
|  | edited note for commit #2 | 
|  | EOF | 
|  |  | 
|  | INPUT_END | 
|  | test_tick && | 
|  | cat <<INPUT_END >>input && | 
|  | commit refs/notes/commits | 
|  | committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE | 
|  | data <<COMMIT | 
|  | notes commit #3 | 
|  | COMMIT | 
|  |  | 
|  | N inline $commit1 | 
|  | data <<EOF | 
|  | edited note for commit #1 | 
|  | EOF | 
|  |  | 
|  | M 644 inline deadbeef | 
|  | data <<EOF | 
|  | non-note with SHA1-like name | 
|  | EOF | 
|  |  | 
|  | M 644 inline de/adbeef | 
|  | data <<EOF | 
|  | another non-note with SHA1-like name | 
|  | EOF | 
|  |  | 
|  | M 644 inline de/adbeefdeadbeefdeadbeefdeadbeefdeadbeef | 
|  | data <<EOF | 
|  | This is actually a valid note, albeit to a non-existing object. | 
|  | It is needed in order to trigger the "mishandling" of the dead/beef non-note. | 
|  | EOF | 
|  |  | 
|  | M 644 inline dead/beef | 
|  | data <<EOF | 
|  | yet another non-note with SHA1-like name | 
|  | EOF | 
|  |  | 
|  | INPUT_END | 
|  | git fast-import --quiet <input && | 
|  | git config core.notesRef refs/notes/commits | 
|  | ' | 
|  |  | 
|  | cat >expect <<EXPECT_END | 
|  | commit #2 | 
|  | edited note for commit #2 | 
|  | commit #1 | 
|  | edited note for commit #1 | 
|  | EXPECT_END | 
|  |  | 
|  | test_expect_success "verify contents of notes" ' | 
|  |  | 
|  | git log | grep "^    " > actual && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | cat >expect_nn1 <<EXPECT_END | 
|  | A non-note in a notes tree | 
|  | EXPECT_END | 
|  | cat >expect_nn2 <<EXPECT_END | 
|  | non-note with SHA1-like name | 
|  | EXPECT_END | 
|  | cat >expect_nn3 <<EXPECT_END | 
|  | another non-note with SHA1-like name | 
|  | EXPECT_END | 
|  | cat >expect_nn4 <<EXPECT_END | 
|  | yet another non-note with SHA1-like name | 
|  | EXPECT_END | 
|  |  | 
|  | test_expect_success "verify contents of non-notes" ' | 
|  |  | 
|  | git cat-file -p refs/notes/commits:foobar/non-note.txt > actual_nn1 && | 
|  | test_cmp expect_nn1 actual_nn1 && | 
|  | git cat-file -p refs/notes/commits:deadbeef > actual_nn2 && | 
|  | test_cmp expect_nn2 actual_nn2 && | 
|  | git cat-file -p refs/notes/commits:de/adbeef > actual_nn3 && | 
|  | test_cmp expect_nn3 actual_nn3 && | 
|  | git cat-file -p refs/notes/commits:dead/beef > actual_nn4 && | 
|  | test_cmp expect_nn4 actual_nn4 | 
|  | ' | 
|  |  | 
|  | test_expect_success "git-notes preserves non-notes" ' | 
|  |  | 
|  | test_tick && | 
|  | git notes add -f -m "foo bar" | 
|  | ' | 
|  |  | 
|  | test_expect_success "verify contents of non-notes after git-notes" ' | 
|  |  | 
|  | git cat-file -p refs/notes/commits:foobar/non-note.txt > actual_nn1 && | 
|  | test_cmp expect_nn1 actual_nn1 && | 
|  | git cat-file -p refs/notes/commits:deadbeef > actual_nn2 && | 
|  | test_cmp expect_nn2 actual_nn2 && | 
|  | git cat-file -p refs/notes/commits:de/adbeef > actual_nn3 && | 
|  | test_cmp expect_nn3 actual_nn3 && | 
|  | git cat-file -p refs/notes/commits:dead/beef > actual_nn4 && | 
|  | test_cmp expect_nn4 actual_nn4 | 
|  | ' | 
|  |  | 
|  | test_done |