]> git.ipfire.org Git - thirdparty/git.git/blame - t/perf/p7527-builtin-fsmonitor.sh
Merge branch 'jk/clone-allow-bare-and-o-together'
[thirdparty/git.git] / t / perf / p7527-builtin-fsmonitor.sh
CommitLineData
7667f9d2
JH
1#!/bin/sh
2
3test_description="Perf test for the builtin FSMonitor"
4
5. ./perf-lib.sh
6
7if ! test_have_prereq FSMONITOR_DAEMON
8then
9 skip_all="fsmonitor--daemon is not supported on this platform"
10 test_done
11fi
12
13test_lazy_prereq UNTRACKED_CACHE '
14 { git update-index --test-untracked-cache; ret=$?; } &&
15 test $ret -ne 1
16'
17
18# Lie to perf-lib and ask for a new empty repo and avoid
19# the complaints about GIT_PERF_REPO not being big enough
20# the perf hit when GIT_PERF_LARGE_REPO is copied into
21# the trash directory.
22#
23# NEEDSWORK: It would be nice if perf-lib had an option to
24# "borrow" an existing large repo (especially for gigantic
25# monorepos) and use it in-place. For now, fake it here.
26#
27test_perf_fresh_repo
28
29
30# Use a generated synthetic monorepo. If it doesn't exist, we will
31# generate it. If it does exist, we will put it in a known state
32# before we start our timings.
33#
34PARAM_D=5
35PARAM_W=10
36PARAM_F=9
37
38PARAMS="$PARAM_D"."$PARAM_W"."$PARAM_F"
39
40BALLAST_BR=p0006-ballast
41export BALLAST_BR
42
43TMP_BR=tmp_br
44export TMP_BR
45
46REPO=../repos/gen-many-files-"$PARAMS".git
47export REPO
48
49if ! test -d $REPO
50then
51 (cd ../repos; ./many-files.sh -d $PARAM_D -w $PARAM_W -f $PARAM_F)
52fi
53
54
55enable_uc () {
56 git -C $REPO config core.untrackedcache true
57 git -C $REPO update-index --untracked-cache
58 git -C $REPO status >/dev/null 2>&1
59}
60
61disable_uc () {
62 git -C $REPO config core.untrackedcache false
63 git -C $REPO update-index --no-untracked-cache
64 git -C $REPO status >/dev/null 2>&1
65}
66
67start_fsm () {
68 git -C $REPO fsmonitor--daemon start
69 git -C $REPO fsmonitor--daemon status
70 git -C $REPO config core.fsmonitor true
71 git -C $REPO update-index --fsmonitor
72 git -C $REPO status >/dev/null 2>&1
73}
74
75stop_fsm () {
76 git -C $REPO config --unset core.fsmonitor
77 git -C $REPO update-index --no-fsmonitor
78 test_might_fail git -C $REPO fsmonitor--daemon stop 2>/dev/null
79 git -C $REPO status >/dev/null 2>&1
80}
81
82
83# Ensure that FSMonitor is turned off on the borrowed repo.
84#
85test_expect_success "Setup borrowed repo (fsm+uc)" "
86 stop_fsm &&
87 disable_uc
88"
89
90# Also ensure that it starts in a known state.
91#
92# Because we assume that $GIT_PERF_REPEAT_COUNT > 1, we are not going to time
93# the ballast checkout, since only the first invocation does any work and the
94# subsequent ones just print "already on branch" and quit, so the reported
95# time is not useful.
96#
97# Create a temp branch and do all work relative to it so that we don't
98# accidentially alter the real ballast branch.
99#
100test_expect_success "Setup borrowed repo (temp ballast branch)" "
101 test_might_fail git -C $REPO checkout $BALLAST_BR &&
102 test_might_fail git -C $REPO reset --hard &&
103 git -C $REPO clean -d -f &&
104 test_might_fail git -C $REPO branch -D $TMP_BR &&
105 git -C $REPO branch $TMP_BR $BALLAST_BR &&
106 git -C $REPO checkout $TMP_BR
107"
108
109
110echo Data >data.txt
111
112# NEEDSWORK: We assume that $GIT_PERF_REPEAT_COUNT > 1. With
113# FSMonitor enabled, we can get a skewed view of status times, since
114# the index MAY (or may not) be updated after the first invocation
115# which will update the FSMonitor Token, so the subsequent invocations
116# may get a smaller response from the daemon.
117#
118do_status () {
119 msg=$1
120
121 test_perf "$msg" "
122 git -C $REPO status >/dev/null 2>&1
123 "
124}
125
126do_matrix () {
127 uc=$1
128 fsm=$2
129
130 t="[uc $uc][fsm $fsm]"
131 MATRIX_BR="$TMP_BR-$uc-$fsm"
132
133 test_expect_success "$t Setup matrix branch" "
134 git -C $REPO clean -d -f &&
135 git -C $REPO checkout $TMP_BR &&
136 test_might_fail git -C $REPO branch -D $MATRIX_BR &&
137 git -C $REPO branch $MATRIX_BR $TMP_BR &&
138 git -C $REPO checkout $MATRIX_BR
139 "
140
141 if test $uc = true
142 then
143 enable_uc
144 else
145 disable_uc
146 fi
147
148 if test $fsm = true
149 then
150 start_fsm
151 else
152 stop_fsm
153 fi
154
155 do_status "$t status after checkout"
156
157 # Modify many files in the matrix branch.
158 # Stage them.
159 # Commit them.
160 # Rollback.
161 #
162 test_expect_success "$t modify tracked files" "
163 find $REPO -name file1 -exec cp data.txt {} \\;
164 "
165
166 do_status "$t status after big change"
167
168 # Don't bother timing the "add" because _REPEAT_COUNT
169 # issue described above.
170 #
171 test_expect_success "$t add all" "
172 git -C $REPO add -A
173 "
174
175 do_status "$t status after add all"
176
177 test_expect_success "$t add dot" "
178 git -C $REPO add .
179 "
180
181 do_status "$t status after add dot"
182
183 test_expect_success "$t commit staged" "
184 git -C $REPO commit -a -m data
185 "
186
187 do_status "$t status after commit"
188
189 test_expect_success "$t reset HEAD~1 hard" "
190 git -C $REPO reset --hard HEAD~1 >/dev/null 2>&1
191 "
192
193 do_status "$t status after reset hard"
194
195 # Create some untracked files.
196 #
197 test_expect_success "$t create untracked files" "
198 cp -R $REPO/ballast/dir1 $REPO/ballast/xxx1
199 "
200
201 do_status "$t status after create untracked files"
202
203 # Remove the new untracked files.
204 #
205 test_expect_success "$t clean -df" "
206 git -C $REPO clean -d -f
207 "
208
209 do_status "$t status after clean"
210
211 if test $fsm = true
212 then
213 stop_fsm
214 fi
215}
216
217# Begin testing each case in the matrix that we care about.
218#
219uc_values="false"
220test_have_prereq UNTRACKED_CACHE && uc_values="false true"
221
222fsm_values="false true"
223
224for uc_val in $uc_values
225do
226 for fsm_val in $fsm_values
227 do
228 do_matrix $uc_val $fsm_val
229 done
230done
231
232cleanup () {
233 uc=$1
234 fsm=$2
235
236 MATRIX_BR="$TMP_BR-$uc-$fsm"
237
238 test_might_fail git -C $REPO branch -D $MATRIX_BR
239}
240
241
242# We're borrowing this repo. We should leave it in a clean state.
243#
244test_expect_success "Cleanup temp and matrix branches" "
245 git -C $REPO clean -d -f &&
246 test_might_fail git -C $REPO checkout $BALLAST_BR &&
247 test_might_fail git -C $REPO branch -D $TMP_BR &&
248 for uc_val in $uc_values
249 do
250 for fsm_val in $fsm_values
251 do
0e66bc1b 252 cleanup $uc_val $fsm_val || return 1
7667f9d2
JH
253 done
254 done
255"
256
257test_done