#!/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