]> git.ipfire.org Git - thirdparty/git.git/blame - t/t1700-split-index.sh
sha1-file: split OBJECT_INFO_FOR_PREFETCH
[thirdparty/git.git] / t / t1700-split-index.sh
CommitLineData
3e52f70b
NTND
1#!/bin/sh
2
3test_description='split index mode tests'
4
5. ./test-lib.sh
6
7# We need total control of index splitting here
8sane_unset GIT_TEST_SPLIT_INDEX
c780b9cf
BP
9
10# Testing a hard coded SHA against an index with an extension
11# that can vary from run to run is problematic so we disable
12# those extensions.
4cb54d0a 13sane_unset GIT_TEST_FSMONITOR
c780b9cf 14sane_unset GIT_TEST_INDEX_THREADS
3e52f70b 15
c6e5607c
SG
16# Create a file named as $1 with content read from stdin.
17# Set the file's mtime to a few seconds in the past to avoid racy situations.
18create_non_racy_file () {
19 cat >"$1" &&
20 test-tool chmtime =-5 "$1"
21}
22
3e52f70b 23test_expect_success 'enable split index' '
e6a1dd77 24 git config splitIndex.maxPercentChange 100 &&
3e52f70b 25 git update-index --split-index &&
8133061e 26 test-tool dump-split-index .git/index >actual &&
cc6f663d 27 indexversion=$(test-tool index-version <.git/index) &&
d8465500
JN
28
29 # NEEDSWORK: Stop hard-coding checksums.
e869c5ea
TG
30 if test "$indexversion" = "4"
31 then
d8465500
JN
32 own=432ef4b63f32193984f339431fd50ca796493569
33 base=508851a7f0dfa8691e9f69c7f055865389012491
e869c5ea 34 else
d8465500
JN
35 own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
36 base=39d890139ee5356c7ef572216cebcd27aa41f9df
e869c5ea 37 fi &&
d8465500 38
56621763
CC
39 cat >expect <<-EOF &&
40 own $own
41 base $base
42 replacements:
43 deletions:
44 EOF
3e52f70b
NTND
45 test_cmp expect actual
46'
47
48test_expect_success 'add one file' '
c6e5607c 49 create_non_racy_file one &&
3e52f70b
NTND
50 git update-index --add one &&
51 git ls-files --stage >ls-files.actual &&
56621763
CC
52 cat >ls-files.expect <<-EOF &&
53 100644 $EMPTY_BLOB 0 one
54 EOF
3e52f70b
NTND
55 test_cmp ls-files.expect ls-files.actual &&
56
8133061e 57 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
58 cat >expect <<-EOF &&
59 base $base
60 100644 $EMPTY_BLOB 0 one
61 replacements:
62 deletions:
63 EOF
3e52f70b
NTND
64 test_cmp expect actual
65'
66
67test_expect_success 'disable split index' '
68 git update-index --no-split-index &&
69 git ls-files --stage >ls-files.actual &&
56621763
CC
70 cat >ls-files.expect <<-EOF &&
71 100644 $EMPTY_BLOB 0 one
72 EOF
3e52f70b
NTND
73 test_cmp ls-files.expect ls-files.actual &&
74
acdee9e9 75 BASE=$(test-tool dump-split-index .git/index | sed -n "s/^own/base/p") &&
8133061e 76 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
77 cat >expect <<-EOF &&
78 not a split index
79 EOF
3e52f70b
NTND
80 test_cmp expect actual
81'
82
83test_expect_success 'enable split index again, "one" now belongs to base index"' '
84 git update-index --split-index &&
85 git ls-files --stage >ls-files.actual &&
56621763
CC
86 cat >ls-files.expect <<-EOF &&
87 100644 $EMPTY_BLOB 0 one
88 EOF
3e52f70b
NTND
89 test_cmp ls-files.expect ls-files.actual &&
90
8133061e 91 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
92 cat >expect <<-EOF &&
93 $BASE
94 replacements:
95 deletions:
96 EOF
3e52f70b
NTND
97 test_cmp expect actual
98'
99
100test_expect_success 'modify original file, base index untouched' '
c6e5607c 101 echo modified | create_non_racy_file one &&
3e52f70b
NTND
102 git update-index one &&
103 git ls-files --stage >ls-files.actual &&
56621763
CC
104 cat >ls-files.expect <<-EOF &&
105 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
106 EOF
3e52f70b
NTND
107 test_cmp ls-files.expect ls-files.actual &&
108
8133061e 109 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
110 q_to_tab >expect <<-EOF &&
111 $BASE
112 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
113 replacements: 0
114 deletions:
115 EOF
3e52f70b
NTND
116 test_cmp expect actual
117'
118
119test_expect_success 'add another file, which stays index' '
c6e5607c 120 create_non_racy_file two &&
3e52f70b
NTND
121 git update-index --add two &&
122 git ls-files --stage >ls-files.actual &&
56621763
CC
123 cat >ls-files.expect <<-EOF &&
124 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
125 100644 $EMPTY_BLOB 0 two
126 EOF
3e52f70b
NTND
127 test_cmp ls-files.expect ls-files.actual &&
128
8133061e 129 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
130 q_to_tab >expect <<-EOF &&
131 $BASE
132 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
133 100644 $EMPTY_BLOB 0 two
134 replacements: 0
135 deletions:
136 EOF
3e52f70b
NTND
137 test_cmp expect actual
138'
139
140test_expect_success 'remove file not in base index' '
141 git update-index --force-remove two &&
142 git ls-files --stage >ls-files.actual &&
56621763
CC
143 cat >ls-files.expect <<-EOF &&
144 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
145 EOF
3e52f70b
NTND
146 test_cmp ls-files.expect ls-files.actual &&
147
8133061e 148 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
149 q_to_tab >expect <<-EOF &&
150 $BASE
151 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
152 replacements: 0
153 deletions:
154 EOF
3e52f70b
NTND
155 test_cmp expect actual
156'
157
158test_expect_success 'remove file in base index' '
159 git update-index --force-remove one &&
160 git ls-files --stage >ls-files.actual &&
1c5e94f4 161 test_must_be_empty ls-files.actual &&
3e52f70b 162
8133061e 163 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
164 cat >expect <<-EOF &&
165 $BASE
166 replacements:
167 deletions: 0
168 EOF
3e52f70b
NTND
169 test_cmp expect actual
170'
171
172test_expect_success 'add original file back' '
c6e5607c 173 create_non_racy_file one &&
3e52f70b
NTND
174 git update-index --add one &&
175 git ls-files --stage >ls-files.actual &&
56621763
CC
176 cat >ls-files.expect <<-EOF &&
177 100644 $EMPTY_BLOB 0 one
178 EOF
3e52f70b
NTND
179 test_cmp ls-files.expect ls-files.actual &&
180
8133061e 181 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
182 cat >expect <<-EOF &&
183 $BASE
184 100644 $EMPTY_BLOB 0 one
185 replacements:
186 deletions: 0
187 EOF
3e52f70b
NTND
188 test_cmp expect actual
189'
190
191test_expect_success 'add new file' '
c6e5607c 192 create_non_racy_file two &&
3e52f70b
NTND
193 git update-index --add two &&
194 git ls-files --stage >actual &&
56621763
CC
195 cat >expect <<-EOF &&
196 100644 $EMPTY_BLOB 0 one
197 100644 $EMPTY_BLOB 0 two
198 EOF
3e52f70b
NTND
199 test_cmp expect actual
200'
201
202test_expect_success 'unify index, two files remain' '
203 git update-index --no-split-index &&
204 git ls-files --stage >ls-files.actual &&
56621763
CC
205 cat >ls-files.expect <<-EOF &&
206 100644 $EMPTY_BLOB 0 one
207 100644 $EMPTY_BLOB 0 two
208 EOF
8fb26872 209 test_cmp ls-files.expect ls-files.actual &&
3e52f70b 210
8133061e 211 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
56621763
CC
212 cat >expect <<-EOF &&
213 not a split index
214 EOF
3e52f70b
NTND
215 test_cmp expect actual
216'
217
098aa867 218test_expect_success 'rev-parse --shared-index-path' '
5de8a549
MR
219 test_create_repo split-index &&
220 (
221 cd split-index &&
222 git update-index --split-index &&
223 echo .git/sharedindex* >expect &&
224 git rev-parse --shared-index-path >actual &&
225 test_cmp expect actual &&
226 mkdir subdirectory &&
227 cd subdirectory &&
228 echo ../.git/sharedindex* >expect &&
229 git rev-parse --shared-index-path >actual &&
230 test_cmp expect actual
231 )
232'
233
b8923bf6
CC
234test_expect_success 'set core.splitIndex config variable to true' '
235 git config core.splitIndex true &&
c6e5607c 236 create_non_racy_file three &&
b8923bf6
CC
237 git update-index --add three &&
238 git ls-files --stage >ls-files.actual &&
239 cat >ls-files.expect <<-EOF &&
240 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
241 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 three
242 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
243 EOF
244 test_cmp ls-files.expect ls-files.actual &&
8133061e
NTND
245 BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
246 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
b8923bf6
CC
247 cat >expect <<-EOF &&
248 $BASE
249 replacements:
250 deletions:
251 EOF
252 test_cmp expect actual
253'
254
255test_expect_success 'set core.splitIndex config variable to false' '
256 git config core.splitIndex false &&
257 git update-index --force-remove three &&
258 git ls-files --stage >ls-files.actual &&
259 cat >ls-files.expect <<-EOF &&
260 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
261 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
262 EOF
263 test_cmp ls-files.expect ls-files.actual &&
8133061e 264 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
b8923bf6
CC
265 cat >expect <<-EOF &&
266 not a split index
267 EOF
268 test_cmp expect actual
269'
270
c6e5607c 271test_expect_success 'set core.splitIndex config variable back to true' '
fcdbd954 272 git config core.splitIndex true &&
c6e5607c 273 create_non_racy_file three &&
fcdbd954 274 git update-index --add three &&
8133061e
NTND
275 BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
276 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
277 cat >expect <<-EOF &&
278 $BASE
279 replacements:
280 deletions:
281 EOF
282 test_cmp expect actual &&
c6e5607c 283 create_non_racy_file four &&
fcdbd954 284 git update-index --add four &&
8133061e 285 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
286 cat >expect <<-EOF &&
287 $BASE
288 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 four
289 replacements:
290 deletions:
291 EOF
292 test_cmp expect actual
293'
294
295test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
296 git config --unset splitIndex.maxPercentChange &&
c6e5607c 297 create_non_racy_file five &&
fcdbd954 298 git update-index --add five &&
8133061e
NTND
299 BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
300 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
301 cat >expect <<-EOF &&
302 $BASE
303 replacements:
304 deletions:
305 EOF
306 test_cmp expect actual &&
c6e5607c 307 create_non_racy_file six &&
fcdbd954 308 git update-index --add six &&
8133061e 309 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
310 cat >expect <<-EOF &&
311 $BASE
312 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 six
313 replacements:
314 deletions:
315 EOF
316 test_cmp expect actual
317'
318
319test_expect_success 'check splitIndex.maxPercentChange set to 0' '
320 git config splitIndex.maxPercentChange 0 &&
c6e5607c 321 create_non_racy_file seven &&
fcdbd954 322 git update-index --add seven &&
8133061e
NTND
323 BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
324 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
325 cat >expect <<-EOF &&
326 $BASE
327 replacements:
328 deletions:
329 EOF
330 test_cmp expect actual &&
c6e5607c 331 create_non_racy_file eight &&
fcdbd954 332 git update-index --add eight &&
8133061e
NTND
333 BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
334 test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
fcdbd954
CC
335 cat >expect <<-EOF &&
336 $BASE
337 replacements:
338 deletions:
339 EOF
340 test_cmp expect actual
341'
342
c0441f7e 343test_expect_success 'shared index files expire after 2 weeks by default' '
c6e5607c 344 create_non_racy_file ten &&
c0441f7e 345 git update-index --add ten &&
c3a00825 346 test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
c0441f7e 347 just_under_2_weeks_ago=$((5-14*86400)) &&
0e496492 348 test-tool chmtime =$just_under_2_weeks_ago .git/sharedindex.* &&
c6e5607c 349 create_non_racy_file eleven &&
c0441f7e 350 git update-index --add eleven &&
c3a00825 351 test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
c0441f7e 352 just_over_2_weeks_ago=$((-1-14*86400)) &&
0e496492 353 test-tool chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
c6e5607c 354 create_non_racy_file twelve &&
c0441f7e 355 git update-index --add twelve &&
c3a00825 356 test $(ls .git/sharedindex.* | wc -l) -le 2
c0441f7e
CC
357'
358
359test_expect_success 'check splitIndex.sharedIndexExpire set to 16 days' '
360 git config splitIndex.sharedIndexExpire "16.days.ago" &&
0e496492 361 test-tool chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
c6e5607c 362 create_non_racy_file thirteen &&
c0441f7e 363 git update-index --add thirteen &&
c3a00825 364 test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
c0441f7e 365 just_over_16_days_ago=$((-1-16*86400)) &&
0e496492 366 test-tool chmtime =$just_over_16_days_ago .git/sharedindex.* &&
c6e5607c 367 create_non_racy_file fourteen &&
c0441f7e 368 git update-index --add fourteen &&
c3a00825 369 test $(ls .git/sharedindex.* | wc -l) -le 2
c0441f7e
CC
370'
371
372test_expect_success 'check splitIndex.sharedIndexExpire set to "never" and "now"' '
373 git config splitIndex.sharedIndexExpire never &&
374 just_10_years_ago=$((-365*10*86400)) &&
0e496492 375 test-tool chmtime =$just_10_years_ago .git/sharedindex.* &&
c6e5607c 376 create_non_racy_file fifteen &&
c0441f7e 377 git update-index --add fifteen &&
c3a00825 378 test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
c0441f7e
CC
379 git config splitIndex.sharedIndexExpire now &&
380 just_1_second_ago=-1 &&
0e496492 381 test-tool chmtime =$just_1_second_ago .git/sharedindex.* &&
c6e5607c 382 create_non_racy_file sixteen &&
c0441f7e 383 git update-index --add sixteen &&
c3a00825 384 test $(ls .git/sharedindex.* | wc -l) -le 2
c0441f7e
CC
385'
386
c9d6c788
ÆAB
387test_expect_success POSIXPERM 'same mode for index & split index' '
388 git init same-mode &&
389 (
390 cd same-mode &&
391 test_commit A &&
392 test_modebits .git/index >index_mode &&
393 test_must_fail git config core.sharedRepository &&
394 git -c core.splitIndex=true status &&
395 shared=$(ls .git/sharedindex.*) &&
396 case "$shared" in
397 *" "*)
398 # we have more than one???
399 false ;;
400 *)
401 test_modebits "$shared" >split_index_mode &&
402 test_cmp index_mode split_index_mode ;;
403 esac
404 )
405'
406
3ee83f48
CC
407while read -r mode modebits
408do
409 test_expect_success POSIXPERM "split index respects core.sharedrepository $mode" '
410 # Remove existing shared index files
411 git config core.splitIndex false &&
412 git update-index --force-remove one &&
413 rm -f .git/sharedindex.* &&
414 # Create one new shared index file
415 git config core.sharedrepository "$mode" &&
416 git config core.splitIndex true &&
c6e5607c 417 create_non_racy_file one &&
3ee83f48
CC
418 git update-index --add one &&
419 echo "$modebits" >expect &&
420 test_modebits .git/index >actual &&
421 test_cmp expect actual &&
422 shared=$(ls .git/sharedindex.*) &&
423 case "$shared" in
424 *" "*)
425 # we have more than one???
426 false ;;
427 *)
428 test_modebits "$shared" >actual &&
429 test_cmp expect actual ;;
430 esac
431 '
432done <<\EOF
4330666 -rw-rw-rw-
4340642 -rw-r---w-
435EOF
436
ef5b3a6c
NTND
437test_expect_success POSIXPERM,SANITY 'graceful handling when splitting index is not allowed' '
438 test_create_repo ro &&
439 (
440 cd ro &&
441 test_commit initial &&
442 git update-index --split-index &&
443 test -f .git/sharedindex.*
444 ) &&
445 cp ro/.git/index new-index &&
446 test_when_finished "chmod u+w ro/.git" &&
447 chmod u-w ro/.git &&
448 GIT_INDEX_FILE="$(pwd)/new-index" git -C ro update-index --split-index &&
449 chmod u+w ro/.git &&
450 rm ro/.git/sharedindex.* &&
451 GIT_INDEX_FILE=new-index git ls-files >actual &&
452 echo initial.t >expected &&
453 test_cmp expected actual
454'
455
4bddd983
TG
456test_expect_success 'writing split index with null sha1 does not write cache tree' '
457 git config core.splitIndex true &&
458 git config splitIndex.maxPercentChange 0 &&
459 git commit -m "commit" &&
460 {
461 git ls-tree HEAD &&
8125a58b 462 printf "160000 commit $ZERO_OID\\tbroken\\n"
4bddd983
TG
463 } >broken-tree &&
464 echo "add broken entry" >msg &&
465
466 tree=$(git mktree <broken-tree) &&
467 test_tick &&
468 commit=$(git commit-tree $tree -p HEAD <msg) &&
469 git update-ref HEAD "$commit" &&
470 GIT_ALLOW_NULL_SHA1=1 git reset --hard &&
83279748 471 test_might_fail test-tool dump-cache-tree >cache-tree.out &&
4bddd983
TG
472 test_line_count = 0 cache-tree.out
473'
474
6e37c8ed
NTND
475test_expect_success 'do not refresh null base index' '
476 test_create_repo merge &&
477 (
478 cd merge &&
479 test_commit initial &&
480 git checkout -b side-branch &&
481 test_commit extra &&
482 git checkout master &&
483 git update-index --split-index &&
484 test_commit more &&
485 # must not write a new shareindex, or we wont catch the problem
486 git -c splitIndex.maxPercentChange=100 merge --no-edit side-branch 2>err &&
487 # i.e. do not expect warnings like
488 # could not freshen shared index .../shareindex.00000...
489 test_must_be_empty err
490 )
491'
492
3e52f70b 493test_done