Merge branch 'js/fsmonitor-unpack-fix'
[git] / t / t3302-notes-index-expensive.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Johannes E. Schindelin
4 #
5
6 test_description='Test commit notes index (expensive!)'
7
8 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
9 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
10
11 . ./test-lib.sh
12
13 create_repo () {
14         number_of_commits=$1
15         nr=0
16         test -d .git || {
17         git init &&
18         (
19                 while test $nr -lt $number_of_commits
20                 do
21                         nr=$(($nr+1))
22                         mark=$(($nr+$nr))
23                         notemark=$(($mark+1))
24                         test_tick &&
25                         cat <<-INPUT_END &&
26                         commit refs/heads/main
27                         mark :$mark
28                         committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
29                         data <<COMMIT
30                         commit #$nr
31                         COMMIT
32
33                         M 644 inline file
34                         data <<EOF
35                         file in commit #$nr
36                         EOF
37
38                         blob
39                         mark :$notemark
40                         data <<EOF
41                         note for commit #$nr
42                         EOF
43
44                         INPUT_END
45                         echo "N :$notemark :$mark" >>note_commit
46                 done &&
47                 test_tick &&
48                 cat <<-INPUT_END &&
49                 commit refs/notes/commits
50                 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
51                 data <<COMMIT
52                 notes
53                 COMMIT
54
55                 INPUT_END
56
57                 cat note_commit
58         ) |
59         git fast-import --quiet &&
60         git config core.notesRef refs/notes/commits
61         }
62 }
63
64 test_notes () {
65         count=$1 &&
66         git config core.notesRef refs/notes/commits &&
67         git log | grep "^    " >output &&
68         i=$count &&
69         while test $i -gt 0
70         do
71                 echo "    commit #$i" &&
72                 echo "    note for commit #$i" &&
73                 i=$(($i-1))
74         done >expect &&
75         test_cmp expect output
76 }
77
78 write_script time_notes <<\EOF
79         mode=$1
80         i=1
81         while test $i -lt $2
82         do
83                 case $1 in
84                 no-notes)
85                         GIT_NOTES_REF=non-existing
86                         export GIT_NOTES_REF
87                         ;;
88                 notes)
89                         unset GIT_NOTES_REF
90                         ;;
91                 esac
92                 git log
93                 i=$(($i+1))
94         done >/dev/null
95 EOF
96
97 time_notes () {
98         for mode in no-notes notes
99         do
100                 echo $mode
101                 /usr/bin/time ../time_notes $mode $1
102         done
103 }
104
105 do_tests () {
106         count=$1 pr=${2-}
107
108         test_expect_success $pr "setup $count" '
109                 mkdir "$count" &&
110                 (
111                         cd "$count" &&
112                         create_repo "$count"
113                 )
114         '
115
116         test_expect_success $pr 'notes work' '
117                 (
118                         cd "$count" &&
119                         test_notes "$count"
120                 )
121         '
122
123         test_expect_success "USR_BIN_TIME${pr:+,$pr}" 'notes timing with /usr/bin/time' '
124                 (
125                         cd "$count" &&
126                         time_notes 100
127                 )
128         '
129 }
130
131 do_tests 10
132 for count in 100 1000 10000
133 do
134         do_tests "$count" EXPENSIVE
135 done
136
137 test_done