3 test_description
='multi-pack-indexes'
16 header: 4d494458 1 $NUM_CHUNKS $NUM_PACKS
17 chunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS
18 num_objects: $NUM_OBJECTS
21 if test $NUM_PACKS -ge 1
23 ls $OBJECT_DIR/pack
/ |
grep idx |
sort
25 printf "object-dir: $OBJECT_DIR\n"
27 test-tool read-midx
$OBJECT_DIR >actual
&&
28 test_cmp expect actual
31 test_expect_success
'write midx with no packs' '
32 test_when_finished rm -f pack/multi-pack-index &&
33 git multi-pack-index --object-dir=. write &&
34 midx_read_expect 0 0 4 .
39 iii
=$
(printf '%03i' $i)
41 test-tool genrandom
"bar" 200 &&
42 test-tool genrandom
"baz $iii" 50
45 test-tool genrandom
"foo"$i 100 &&
46 test-tool genrandom
"foo"$
(( $i + 1 )) 100 &&
47 test-tool genrandom
"foo"$
(( $i + 2 )) 100
51 test-tool genrandom
"$iii" 8192
53 git update-index
--add file_
$iii deep_delta_
$iii wide_delta_
$iii
56 commit_and_list_objects
() {
59 test-tool genrandom
100 8192;
61 git update-index
--add file_101
&&
62 tree
=$
(git write-tree
) &&
63 commit
=$
(git commit-tree
$tree -p HEAD
</dev
/null
) &&
66 git ls-tree
$tree |
sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/"
68 git
reset --hard $commit
71 test_expect_success
'create objects' '
72 test_commit initial &&
73 for i in $(test_seq 1 5)
77 commit_and_list_objects
80 test_expect_success
'write midx with one v1 pack' '
81 pack=$(git pack-objects --index-version=1 $objdir/pack/test <obj-list) &&
82 test_when_finished rm $objdir/pack/test-$pack.pack \
83 $objdir/pack/test-$pack.idx $objdir/pack/multi-pack-index &&
84 git multi-pack-index --object-dir=$objdir write &&
85 midx_read_expect 1 18 4 $objdir
88 midx_git_two_modes
() {
89 git
-c core.multiPackIndex
=false
$1 >expect
&&
90 git
-c core.multiPackIndex
=true
$1 >actual
&&
91 test_cmp expect actual
94 compare_results_with_midx
() {
96 test_expect_success
"check normal git operations: $MSG" '
97 midx_git_two_modes "rev-list --objects --all" &&
98 midx_git_two_modes "log --raw"
102 test_expect_success
'write midx with one v2 pack' '
103 git pack-objects --index-version=2,0x40 $objdir/pack/test <obj-list &&
104 git multi-pack-index --object-dir=$objdir write &&
105 midx_read_expect 1 18 4 $objdir
108 compare_results_with_midx
"one v2 pack"
110 test_expect_success
'add more objects' '
111 for i in $(test_seq 6 10)
115 commit_and_list_objects
118 test_expect_success
'write midx with two packs' '
119 git pack-objects --index-version=1 $objdir/pack/test-2 <obj-list &&
120 git multi-pack-index --object-dir=$objdir write &&
121 midx_read_expect 2 34 4 $objdir
124 compare_results_with_midx
"two packs"
126 test_expect_success
'add more packs' '
127 for j in $(test_seq 11 20)
129 generate_objects $j &&
130 commit_and_list_objects &&
131 git pack-objects --index-version=2 $objdir/pack/test-pack <obj-list
135 compare_results_with_midx
"mixed mode (two packs + extra)"
137 test_expect_success
'write midx with twelve packs' '
138 git multi-pack-index --object-dir=$objdir write &&
139 midx_read_expect 12 74 4 $objdir
142 compare_results_with_midx
"twelve packs"
144 test_expect_success
'repack removes multi-pack-index' '
145 test_path_is_file $objdir/pack/multi-pack-index &&
147 test_path_is_missing $objdir/pack/multi-pack-index
150 compare_results_with_midx
"after repack"
153 # usage: corrupt_data <file> <pos> [<data>]
158 printf "$data" |
dd of
="$file" bs
=1 seek
="$pos" conv
=notrunc
161 # Force 64-bit offsets by manipulating the idx file.
162 # This makes the IDX file _incorrect_ so be careful to clean up after!
163 test_expect_success
'force some 64-bit offsets with pack-objects' '
165 mkdir objects64/pack &&
166 for i in $(test_seq 1 11)
170 commit_and_list_objects &&
171 pack64=$(git pack-objects --index-version=2,0x40 objects64/pack/test-64 <obj-list) &&
172 idx64=objects64/pack/test-64-$pack64.idx &&
174 corrupt_data $idx64 2999 "\02" &&
175 midx64=$(git multi-pack-index --object-dir=objects64 write) &&
176 midx_read_expect 1 63 5 objects64 " large-offsets"