| #!/bin/sh |
| # |
| # Copyright (c) 2007 Johannes E. Schindelin |
| # |
| |
| test_description='Test commit notes index (expensive!)' |
| |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| TEST_PASSES_SANITIZE_LEAK=true |
| . ./test-lib.sh |
| |
| create_repo () { |
| number_of_commits=$1 |
| nr=0 |
| test -d .git || { |
| git init && |
| ( |
| while test $nr -lt $number_of_commits |
| do |
| nr=$(($nr+1)) |
| mark=$(($nr+$nr)) |
| notemark=$(($mark+1)) |
| test_tick && |
| cat <<-INPUT_END && |
| commit refs/heads/main |
| mark :$mark |
| committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE |
| data <<COMMIT |
| commit #$nr |
| COMMIT |
| |
| M 644 inline file |
| data <<EOF |
| file in commit #$nr |
| EOF |
| |
| blob |
| mark :$notemark |
| data <<EOF |
| note for commit #$nr |
| EOF |
| |
| INPUT_END |
| echo "N :$notemark :$mark" >>note_commit |
| done && |
| test_tick && |
| cat <<-INPUT_END && |
| commit refs/notes/commits |
| committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE |
| data <<COMMIT |
| notes |
| COMMIT |
| |
| INPUT_END |
| |
| cat note_commit |
| ) | |
| git fast-import --quiet && |
| git config core.notesRef refs/notes/commits |
| } |
| } |
| |
| test_notes () { |
| count=$1 && |
| git config core.notesRef refs/notes/commits && |
| git log >tmp && |
| grep "^ " tmp >output && |
| i=$count && |
| while test $i -gt 0 |
| do |
| echo " commit #$i" && |
| echo " note for commit #$i" && |
| i=$(($i-1)) |
| done >expect && |
| test_cmp expect output |
| } |
| |
| write_script time_notes <<\EOF |
| mode=$1 |
| i=1 |
| while test $i -lt $2 |
| do |
| case $1 in |
| no-notes) |
| GIT_NOTES_REF=non-existing |
| export GIT_NOTES_REF |
| ;; |
| notes) |
| unset GIT_NOTES_REF |
| ;; |
| esac |
| git log || exit $? |
| i=$(($i+1)) |
| done >/dev/null |
| EOF |
| |
| time_notes () { |
| for mode in no-notes notes |
| do |
| echo $mode |
| /usr/bin/time ../time_notes $mode $1 |
| done |
| } |
| |
| do_tests () { |
| count=$1 pr=${2-} |
| |
| test_expect_success $pr "setup $count" ' |
| mkdir "$count" && |
| ( |
| cd "$count" && |
| create_repo "$count" |
| ) |
| ' |
| |
| test_expect_success $pr 'notes work' ' |
| ( |
| cd "$count" && |
| test_notes "$count" |
| ) |
| ' |
| |
| test_expect_success "USR_BIN_TIME${pr:+,$pr}" 'notes timing with /usr/bin/time' ' |
| ( |
| cd "$count" && |
| time_notes 100 |
| ) |
| ' |
| } |
| |
| do_tests 10 |
| for count in 100 1000 10000 |
| do |
| do_tests "$count" EXPENSIVE |
| done |
| |
| test_done |