]>
Commit | Line | Data |
---|---|---|
af626ac0 TB |
1 | #!/bin/sh |
2 | ||
3 | test_description='pack-objects multi-pack reuse' | |
4 | ||
86b82541 | 5 | TEST_PASSES_SANITIZE_LEAK=true |
af626ac0 TB |
6 | . ./test-lib.sh |
7 | . "$TEST_DIRECTORY"/lib-bitmap.sh | |
8 | ||
9 | objdir=.git/objects | |
10 | packdir=$objdir/pack | |
11 | ||
12 | test_pack_reused () { | |
13 | test_trace2_data pack-objects pack-reused "$1" | |
14 | } | |
15 | ||
16 | test_packs_reused () { | |
17 | test_trace2_data pack-objects packs-reused "$1" | |
18 | } | |
19 | ||
20 | ||
21 | # pack_position <object> </path/to/pack.idx | |
22 | pack_position () { | |
23 | git show-index >objects && | |
24 | grep "$1" objects | cut -d" " -f1 | |
25 | } | |
26 | ||
7c01878e TB |
27 | # test_pack_objects_reused_all <pack-reused> <packs-reused> |
28 | test_pack_objects_reused_all () { | |
29 | : >trace2.txt && | |
30 | GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | |
31 | git pack-objects --stdout --revs --all --delta-base-offset \ | |
32 | >/dev/null && | |
33 | ||
34 | test_pack_reused "$1" <trace2.txt && | |
35 | test_packs_reused "$2" <trace2.txt | |
36 | } | |
37 | ||
38 | # test_pack_objects_reused <pack-reused> <packs-reused> | |
39 | test_pack_objects_reused () { | |
40 | : >trace2.txt && | |
41 | GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | |
42 | git pack-objects --stdout --revs >/dev/null && | |
43 | ||
44 | test_pack_reused "$1" <trace2.txt && | |
45 | test_packs_reused "$2" <trace2.txt | |
46 | } | |
47 | ||
af626ac0 TB |
48 | test_expect_success 'preferred pack is reused for single-pack reuse' ' |
49 | test_config pack.allowPackReuse single && | |
50 | ||
51 | for i in A B | |
52 | do | |
53 | test_commit "$i" && | |
54 | git repack -d || return 1 | |
55 | done && | |
56 | ||
57 | git multi-pack-index write --bitmap && | |
58 | ||
7c01878e | 59 | test_pack_objects_reused_all 3 1 |
af626ac0 TB |
60 | ' |
61 | ||
23c1e713 TB |
62 | test_expect_success 'multi-pack reuse is disabled by default' ' |
63 | test_pack_objects_reused_all 3 1 | |
64 | ' | |
65 | ||
66 | test_expect_success 'feature.experimental implies multi-pack reuse' ' | |
67 | test_config feature.experimental true && | |
68 | ||
69 | test_pack_objects_reused_all 6 2 | |
70 | ' | |
71 | ||
72 | test_expect_success 'multi-pack reuse can be disabled with feature.experimental' ' | |
73 | test_config feature.experimental true && | |
74 | test_config pack.allowPackReuse single && | |
af626ac0 | 75 | |
23c1e713 | 76 | test_pack_objects_reused_all 3 1 |
af626ac0 TB |
77 | ' |
78 | ||
79 | test_expect_success 'enable multi-pack reuse' ' | |
80 | git config pack.allowPackReuse multi | |
81 | ' | |
82 | ||
83 | test_expect_success 'reuse all objects from subset of bitmapped packs' ' | |
84 | test_commit C && | |
85 | git repack -d && | |
86 | ||
87 | git multi-pack-index write --bitmap && | |
88 | ||
89 | cat >in <<-EOF && | |
90 | $(git rev-parse C) | |
91 | ^$(git rev-parse A) | |
92 | EOF | |
93 | ||
7c01878e | 94 | test_pack_objects_reused 6 2 <in |
af626ac0 TB |
95 | ' |
96 | ||
97 | test_expect_success 'reuse all objects from all packs' ' | |
7c01878e | 98 | test_pack_objects_reused_all 9 3 |
af626ac0 TB |
99 | ' |
100 | ||
101 | test_expect_success 'reuse objects from first pack with middle gap' ' | |
102 | for i in D E F | |
103 | do | |
104 | test_commit "$i" || return 1 | |
105 | done && | |
106 | ||
107 | # Set "pack.window" to zero to ensure that we do not create any | |
108 | # deltas, which could alter the amount of pack reuse we perform | |
109 | # (if, for e.g., we are not sending one or more bases). | |
110 | D="$(git -c pack.window=0 pack-objects --all --unpacked $packdir/pack)" && | |
111 | ||
112 | d_pos="$(pack_position $(git rev-parse D) <$packdir/pack-$D.idx)" && | |
113 | e_pos="$(pack_position $(git rev-parse E) <$packdir/pack-$D.idx)" && | |
114 | f_pos="$(pack_position $(git rev-parse F) <$packdir/pack-$D.idx)" && | |
115 | ||
116 | # commits F, E, and D, should appear in that order at the | |
117 | # beginning of the pack | |
118 | test $f_pos -lt $e_pos && | |
119 | test $e_pos -lt $d_pos && | |
120 | ||
121 | # Ensure that the pack we are constructing sorts ahead of any | |
122 | # other packs in lexical/bitmap order by choosing it as the | |
123 | # preferred pack. | |
124 | git multi-pack-index write --bitmap --preferred-pack="pack-$D.idx" && | |
125 | ||
126 | cat >in <<-EOF && | |
127 | $(git rev-parse E) | |
128 | ^$(git rev-parse D) | |
129 | EOF | |
130 | ||
7c01878e | 131 | test_pack_objects_reused 3 1 <in |
af626ac0 TB |
132 | ' |
133 | ||
134 | test_expect_success 'reuse objects from middle pack with middle gap' ' | |
135 | rm -fr $packdir/multi-pack-index* && | |
136 | ||
137 | # Ensure that the pack we are constructing sort into any | |
138 | # position *but* the first one, by choosing a different pack as | |
139 | # the preferred one. | |
140 | git multi-pack-index write --bitmap --preferred-pack="pack-$A.idx" && | |
141 | ||
142 | cat >in <<-EOF && | |
143 | $(git rev-parse E) | |
144 | ^$(git rev-parse D) | |
145 | EOF | |
146 | ||
7c01878e | 147 | test_pack_objects_reused 3 1 <in |
af626ac0 TB |
148 | ' |
149 | ||
150 | test_expect_success 'omit delta with uninteresting base (same pack)' ' | |
151 | git repack -adk && | |
152 | ||
153 | test_seq 32 >f && | |
154 | git add f && | |
155 | test_tick && | |
156 | git commit -m "delta" && | |
157 | delta="$(git rev-parse HEAD)" && | |
158 | ||
159 | test_seq 64 >f && | |
160 | test_tick && | |
161 | git commit -a -m "base" && | |
162 | base="$(git rev-parse HEAD)" && | |
163 | ||
164 | test_commit other && | |
165 | ||
166 | git repack -d && | |
167 | ||
168 | have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" && | |
169 | ||
170 | git multi-pack-index write --bitmap && | |
171 | ||
172 | cat >in <<-EOF && | |
173 | $(git rev-parse other) | |
174 | ^$base | |
175 | EOF | |
176 | ||
af626ac0 TB |
177 | # We can only reuse the 3 objects corresponding to "other" from |
178 | # the latest pack. | |
179 | # | |
180 | # This is because even though we want "delta", we do not want | |
181 | # "base", meaning that we have to inflate the delta/base-pair | |
182 | # corresponding to the blob in commit "delta", which bypasses | |
183 | # the pack-reuse mechanism. | |
184 | # | |
185 | # The remaining objects from the other pack are similarly not | |
186 | # reused because their objects are on the uninteresting side of | |
187 | # the query. | |
7c01878e | 188 | test_pack_objects_reused 3 1 <in |
af626ac0 TB |
189 | ' |
190 | ||
191 | test_expect_success 'omit delta from uninteresting base (cross pack)' ' | |
192 | cat >in <<-EOF && | |
193 | $(git rev-parse $base) | |
194 | ^$(git rev-parse $delta) | |
195 | EOF | |
196 | ||
197 | P="$(git pack-objects --revs $packdir/pack <in)" && | |
198 | ||
199 | git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" && | |
200 | ||
af626ac0 TB |
201 | packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" && |
202 | objects_nr="$(git rev-list --count --all --objects)" && | |
203 | ||
7c01878e | 204 | test_pack_objects_reused_all $(($objects_nr - 1)) $packs_nr |
af626ac0 TB |
205 | ' |
206 | ||
207 | test_done |