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