| #!/bin/sh | 
 |  | 
 | test_description='Test notes trees that also contain non-notes' | 
 |  | 
 | . ./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/master | 
 | 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/master | 
 | 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/master^) && | 
 | 	commit2=$(git rev-parse refs/heads/master) && | 
 | 	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 |