]>
Commit | Line | Data |
---|---|---|
9901164d JX |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2021 Jiang Xin | |
4 | # | |
5 | ||
6 | test_description='Test git-bundle' | |
7 | ||
8 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | |
9 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | |
10 | ||
11 | . ./test-lib.sh | |
e8a8e7ff | 12 | . "$TEST_DIRECTORY"/lib-bundle.sh |
9901164d JX |
13 | |
14 | # Create a commit or tag and set the variable with the object ID. | |
15 | test_commit_setvar () { | |
16 | notick= | |
17 | signoff= | |
18 | indir= | |
19 | merge= | |
20 | tag= | |
21 | var= | |
22 | ||
23 | while test $# != 0 | |
24 | do | |
25 | case "$1" in | |
26 | --merge) | |
27 | merge=t | |
28 | ;; | |
29 | --tag) | |
30 | tag=t | |
31 | ;; | |
32 | --notick) | |
33 | notick=t | |
34 | ;; | |
35 | --signoff) | |
36 | signoff="$1" | |
37 | ;; | |
38 | -C) | |
39 | shift | |
40 | indir="$1" | |
41 | ;; | |
42 | -*) | |
43 | echo >&2 "error: unknown option $1" | |
44 | return 1 | |
45 | ;; | |
46 | *) | |
47 | break | |
48 | ;; | |
49 | esac | |
50 | shift | |
51 | done | |
52 | if test $# -lt 2 | |
53 | then | |
54 | echo >&2 "error: test_commit_setvar must have at least 2 arguments" | |
55 | return 1 | |
56 | fi | |
57 | var=$1 | |
58 | shift | |
59 | indir=${indir:+"$indir"/} | |
60 | if test -z "$notick" | |
61 | then | |
62 | test_tick | |
63 | fi && | |
64 | if test -n "$merge" | |
65 | then | |
66 | git ${indir:+ -C "$indir"} merge --no-edit --no-ff \ | |
67 | ${2:+-m "$2"} "$1" && | |
68 | oid=$(git ${indir:+ -C "$indir"} rev-parse HEAD) | |
69 | elif test -n "$tag" | |
70 | then | |
71 | git ${indir:+ -C "$indir"} tag -m "$1" "$1" "${2:-HEAD}" && | |
72 | oid=$(git ${indir:+ -C "$indir"} rev-parse "$1") | |
73 | else | |
74 | file=${2:-"$1.t"} && | |
75 | echo "${3-$1}" >"$indir$file" && | |
76 | git ${indir:+ -C "$indir"} add "$file" && | |
77 | git ${indir:+ -C "$indir"} commit $signoff -m "$1" && | |
78 | oid=$(git ${indir:+ -C "$indir"} rev-parse HEAD) | |
79 | fi && | |
80 | eval $var=$oid | |
81 | } | |
82 | ||
83 | # Format the output of git commands to make a user-friendly and stable | |
84 | # text. We can easily prepare the expect text without having to worry | |
85 | # about future changes of the commit ID and spaces of the output. | |
86 | make_user_friendly_and_stable_output () { | |
87 | sed \ | |
88 | -e "s/${A%${A#???????}}[0-9a-f]*/<COMMIT-A>/g" \ | |
89 | -e "s/${B%${B#???????}}[0-9a-f]*/<COMMIT-B>/g" \ | |
90 | -e "s/${C%${C#???????}}[0-9a-f]*/<COMMIT-C>/g" \ | |
91 | -e "s/${D%${D#???????}}[0-9a-f]*/<COMMIT-D>/g" \ | |
92 | -e "s/${E%${E#???????}}[0-9a-f]*/<COMMIT-E>/g" \ | |
93 | -e "s/${F%${F#???????}}[0-9a-f]*/<COMMIT-F>/g" \ | |
94 | -e "s/${G%${G#???????}}[0-9a-f]*/<COMMIT-G>/g" \ | |
95 | -e "s/${H%${H#???????}}[0-9a-f]*/<COMMIT-H>/g" \ | |
96 | -e "s/${I%${I#???????}}[0-9a-f]*/<COMMIT-I>/g" \ | |
97 | -e "s/${J%${J#???????}}[0-9a-f]*/<COMMIT-J>/g" \ | |
98 | -e "s/${K%${K#???????}}[0-9a-f]*/<COMMIT-K>/g" \ | |
99 | -e "s/${L%${L#???????}}[0-9a-f]*/<COMMIT-L>/g" \ | |
100 | -e "s/${M%${M#???????}}[0-9a-f]*/<COMMIT-M>/g" \ | |
101 | -e "s/${N%${N#???????}}[0-9a-f]*/<COMMIT-N>/g" \ | |
102 | -e "s/${O%${O#???????}}[0-9a-f]*/<COMMIT-O>/g" \ | |
103 | -e "s/${P%${P#???????}}[0-9a-f]*/<COMMIT-P>/g" \ | |
104 | -e "s/${TAG1%${TAG1#???????}}[0-9a-f]*/<TAG-1>/g" \ | |
105 | -e "s/${TAG2%${TAG2#???????}}[0-9a-f]*/<TAG-2>/g" \ | |
106 | -e "s/${TAG3%${TAG3#???????}}[0-9a-f]*/<TAG-3>/g" \ | |
107 | -e "s/ *\$//" | |
108 | } | |
109 | ||
110 | # (C) (D, pull/1/head, topic/1) | |
111 | # o --- o | |
112 | # / \ (L) | |
113 | # / \ o (H, topic/2) (M, tag:v2) | |
114 | # / (F) \ / (N, tag:v3) | |
115 | # / o --------- o (G, pull/2/head) o --- o --- o (release) | |
116 | # / / \ \ / \ | |
117 | # o --- o --- o -------- o -- o ------------------ o ------- o --- o (main) | |
118 | # (A) (B) (E, tag:v1) (I) (J) (K) (O) (P) | |
119 | # | |
120 | test_expect_success 'setup' ' | |
121 | # Try to make a stable fixed width for abbreviated commit ID, | |
122 | # this fixed-width oid will be replaced with "<OID>". | |
123 | git config core.abbrev 7 && | |
124 | ||
125 | # branch main: commit A & B | |
126 | test_commit_setvar A "Commit A" main.txt && | |
127 | test_commit_setvar B "Commit B" main.txt && | |
128 | ||
129 | # branch topic/1: commit C & D, refs/pull/1/head | |
130 | git checkout -b topic/1 && | |
131 | test_commit_setvar C "Commit C" topic-1.txt && | |
132 | test_commit_setvar D "Commit D" topic-1.txt && | |
133 | git update-ref refs/pull/1/head HEAD && | |
134 | ||
135 | # branch topic/1: commit E, tag v1 | |
136 | git checkout main && | |
137 | test_commit_setvar E "Commit E" main.txt && | |
138 | test_commit_setvar --tag TAG1 v1 && | |
139 | ||
140 | # branch topic/2: commit F & G, refs/pull/2/head | |
141 | git checkout -b topic/2 && | |
142 | test_commit_setvar F "Commit F" topic-2.txt && | |
143 | test_commit_setvar G "Commit G" topic-2.txt && | |
144 | git update-ref refs/pull/2/head HEAD && | |
145 | test_commit_setvar H "Commit H" topic-2.txt && | |
146 | ||
147 | # branch main: merge commit I & J | |
148 | git checkout main && | |
149 | test_commit_setvar --merge I topic/1 "Merge commit I" && | |
150 | test_commit_setvar --merge J refs/pull/2/head "Merge commit J" && | |
151 | ||
152 | # branch main: commit K | |
153 | git checkout main && | |
154 | test_commit_setvar K "Commit K" main.txt && | |
155 | ||
156 | # branch release: | |
157 | git checkout -b release && | |
158 | test_commit_setvar L "Commit L" release.txt && | |
159 | test_commit_setvar M "Commit M" release.txt && | |
160 | test_commit_setvar --tag TAG2 v2 && | |
161 | test_commit_setvar N "Commit N" release.txt && | |
162 | test_commit_setvar --tag TAG3 v3 && | |
163 | ||
164 | # branch main: merge commit O, commit P | |
165 | git checkout main && | |
166 | test_commit_setvar --merge O tags/v2 "Merge commit O" && | |
167 | test_commit_setvar P "Commit P" main.txt | |
168 | ' | |
169 | ||
ce1d6d9f | 170 | test_expect_success 'create bundle from special rev: main^!' ' |
9901164d JX |
171 | git bundle create special-rev.bdl "main^!" && |
172 | ||
173 | git bundle list-heads special-rev.bdl | | |
174 | make_user_friendly_and_stable_output >actual && | |
175 | cat >expect <<-\EOF && | |
176 | <COMMIT-P> refs/heads/main | |
177 | EOF | |
1108cea7 | 178 | test_cmp expect actual && |
9901164d JX |
179 | |
180 | git bundle verify special-rev.bdl | | |
181 | make_user_friendly_and_stable_output >actual && | |
182 | cat >expect <<-\EOF && | |
183 | The bundle contains this ref: | |
184 | <COMMIT-P> refs/heads/main | |
185 | The bundle requires this ref: | |
186 | <COMMIT-O> | |
187 | EOF | |
1108cea7 | 188 | test_cmp expect actual && |
9901164d JX |
189 | |
190 | test_bundle_object_count special-rev.bdl 3 | |
191 | ' | |
192 | ||
193 | test_expect_success 'create bundle with --max-count option' ' | |
194 | git bundle create max-count.bdl --max-count 1 \ | |
195 | main \ | |
196 | "^release" \ | |
197 | refs/tags/v1 \ | |
198 | refs/pull/1/head \ | |
199 | refs/pull/2/head && | |
200 | ||
201 | git bundle verify max-count.bdl | | |
202 | make_user_friendly_and_stable_output >actual && | |
203 | cat >expect <<-\EOF && | |
204 | The bundle contains these 2 refs: | |
205 | <COMMIT-P> refs/heads/main | |
206 | <TAG-1> refs/tags/v1 | |
207 | The bundle requires this ref: | |
208 | <COMMIT-O> | |
209 | EOF | |
1108cea7 | 210 | test_cmp expect actual && |
9901164d JX |
211 | |
212 | test_bundle_object_count max-count.bdl 4 | |
213 | ' | |
214 | ||
215 | test_expect_success 'create bundle with --since option' ' | |
216 | git log -1 --pretty="%ad" $M >actual && | |
217 | cat >expect <<-\EOF && | |
218 | Thu Apr 7 15:26:13 2005 -0700 | |
219 | EOF | |
220 | test_cmp expect actual && | |
221 | ||
222 | git bundle create since.bdl \ | |
223 | --since "Thu Apr 7 15:27:00 2005 -0700" \ | |
224 | --all && | |
225 | ||
226 | git bundle verify since.bdl | | |
227 | make_user_friendly_and_stable_output >actual && | |
228 | cat >expect <<-\EOF && | |
229 | The bundle contains these 5 refs: | |
230 | <COMMIT-P> refs/heads/main | |
231 | <COMMIT-N> refs/heads/release | |
232 | <TAG-2> refs/tags/v2 | |
233 | <TAG-3> refs/tags/v3 | |
234 | <COMMIT-P> HEAD | |
235 | The bundle requires these 2 refs: | |
236 | <COMMIT-M> | |
237 | <COMMIT-K> | |
238 | EOF | |
1108cea7 | 239 | test_cmp expect actual && |
9901164d JX |
240 | |
241 | test_bundle_object_count --thin since.bdl 13 | |
242 | ' | |
243 | ||
244 | test_expect_success 'create bundle 1 - no prerequisites' ' | |
5bb0fd2c | 245 | # create bundle from args |
9901164d JX |
246 | git bundle create 1.bdl topic/1 topic/2 && |
247 | ||
5bb0fd2c JX |
248 | # create bundle from stdin |
249 | cat >input <<-\EOF && | |
250 | topic/1 | |
251 | topic/2 | |
252 | EOF | |
253 | git bundle create stdin-1.bdl --stdin <input && | |
254 | ||
9901164d JX |
255 | cat >expect <<-\EOF && |
256 | The bundle contains these 2 refs: | |
257 | <COMMIT-D> refs/heads/topic/1 | |
258 | <COMMIT-H> refs/heads/topic/2 | |
259 | The bundle records a complete history. | |
260 | EOF | |
261 | ||
262 | # verify bundle, which has no prerequisites | |
263 | git bundle verify 1.bdl | | |
264 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 265 | test_cmp expect actual && |
9901164d | 266 | |
5bb0fd2c JX |
267 | git bundle verify stdin-1.bdl | |
268 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 269 | test_cmp expect actual && |
5bb0fd2c JX |
270 | |
271 | test_bundle_object_count 1.bdl 24 && | |
272 | test_bundle_object_count stdin-1.bdl 24 | |
9901164d JX |
273 | ' |
274 | ||
275 | test_expect_success 'create bundle 2 - has prerequisites' ' | |
5bb0fd2c | 276 | # create bundle from args |
9901164d JX |
277 | git bundle create 2.bdl \ |
278 | --ignore-missing \ | |
279 | ^topic/deleted \ | |
280 | ^$D \ | |
281 | ^topic/2 \ | |
282 | release && | |
283 | ||
5bb0fd2c JX |
284 | # create bundle from stdin |
285 | # input has a non-exist reference: "topic/deleted" | |
286 | cat >input <<-EOF && | |
287 | ^topic/deleted | |
288 | ^$D | |
289 | ^topic/2 | |
290 | EOF | |
291 | git bundle create stdin-2.bdl \ | |
292 | --ignore-missing \ | |
293 | --stdin \ | |
294 | release <input && | |
295 | ||
9901164d JX |
296 | cat >expect <<-\EOF && |
297 | The bundle contains this ref: | |
298 | <COMMIT-N> refs/heads/release | |
299 | The bundle requires these 3 refs: | |
300 | <COMMIT-D> | |
301 | <COMMIT-E> | |
302 | <COMMIT-G> | |
303 | EOF | |
304 | ||
305 | git bundle verify 2.bdl | | |
306 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 307 | test_cmp expect actual && |
9901164d | 308 | |
5bb0fd2c JX |
309 | git bundle verify stdin-2.bdl | |
310 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 311 | test_cmp expect actual && |
5bb0fd2c JX |
312 | |
313 | test_bundle_object_count 2.bdl 16 && | |
314 | test_bundle_object_count stdin-2.bdl 16 | |
9901164d JX |
315 | ' |
316 | ||
317 | test_expect_success 'fail to verify bundle without prerequisites' ' | |
318 | git init --bare test1.git && | |
319 | ||
320 | cat >expect <<-\EOF && | |
321 | error: Repository lacks these prerequisite commits: | |
322 | error: <COMMIT-D> | |
323 | error: <COMMIT-E> | |
324 | error: <COMMIT-G> | |
325 | EOF | |
326 | ||
327 | test_must_fail git -C test1.git bundle verify ../2.bdl 2>&1 | | |
328 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 329 | test_cmp expect actual && |
5bb0fd2c JX |
330 | |
331 | test_must_fail git -C test1.git bundle verify ../stdin-2.bdl 2>&1 | | |
332 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 333 | test_cmp expect actual |
9901164d JX |
334 | ' |
335 | ||
336 | test_expect_success 'create bundle 3 - two refs, same object' ' | |
5bb0fd2c | 337 | # create bundle from args |
9901164d JX |
338 | git bundle create --version=3 3.bdl \ |
339 | ^release \ | |
340 | ^topic/1 \ | |
341 | ^topic/2 \ | |
342 | main \ | |
343 | HEAD && | |
344 | ||
5bb0fd2c JX |
345 | # create bundle from stdin |
346 | cat >input <<-\EOF && | |
347 | ^release | |
348 | ^topic/1 | |
349 | ^topic/2 | |
350 | EOF | |
351 | git bundle create --version=3 stdin-3.bdl \ | |
352 | --stdin \ | |
353 | main HEAD <input && | |
354 | ||
9901164d JX |
355 | cat >expect <<-\EOF && |
356 | The bundle contains these 2 refs: | |
357 | <COMMIT-P> refs/heads/main | |
358 | <COMMIT-P> HEAD | |
359 | The bundle requires these 2 refs: | |
360 | <COMMIT-M> | |
361 | <COMMIT-K> | |
362 | EOF | |
363 | ||
364 | git bundle verify 3.bdl | | |
365 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 366 | test_cmp expect actual && |
9901164d | 367 | |
5bb0fd2c JX |
368 | git bundle verify stdin-3.bdl | |
369 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 370 | test_cmp expect actual && |
5bb0fd2c JX |
371 | |
372 | test_bundle_object_count 3.bdl 4 && | |
373 | test_bundle_object_count stdin-3.bdl 4 | |
9901164d JX |
374 | ' |
375 | ||
376 | test_expect_success 'create bundle 4 - with tags' ' | |
5bb0fd2c | 377 | # create bundle from args |
9901164d JX |
378 | git bundle create 4.bdl \ |
379 | ^main \ | |
380 | ^release \ | |
381 | ^topic/1 \ | |
382 | ^topic/2 \ | |
383 | --all && | |
384 | ||
5bb0fd2c JX |
385 | # create bundle from stdin |
386 | cat >input <<-\EOF && | |
387 | ^main | |
388 | ^release | |
389 | ^topic/1 | |
390 | ^topic/2 | |
391 | EOF | |
392 | git bundle create stdin-4.bdl \ | |
393 | --ignore-missing \ | |
394 | --stdin \ | |
395 | --all <input && | |
396 | ||
9901164d JX |
397 | cat >expect <<-\EOF && |
398 | The bundle contains these 3 refs: | |
399 | <TAG-1> refs/tags/v1 | |
400 | <TAG-2> refs/tags/v2 | |
401 | <TAG-3> refs/tags/v3 | |
402 | The bundle records a complete history. | |
403 | EOF | |
404 | ||
405 | git bundle verify 4.bdl | | |
406 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 407 | test_cmp expect actual && |
9901164d | 408 | |
5bb0fd2c JX |
409 | git bundle verify stdin-4.bdl | |
410 | make_user_friendly_and_stable_output >actual && | |
1108cea7 | 411 | test_cmp expect actual && |
5bb0fd2c JX |
412 | |
413 | test_bundle_object_count 4.bdl 3 && | |
414 | test_bundle_object_count stdin-4.bdl 3 | |
9901164d JX |
415 | ' |
416 | ||
417 | test_expect_success 'clone from bundle' ' | |
418 | git clone --mirror 1.bdl mirror.git && | |
419 | git -C mirror.git show-ref | | |
420 | make_user_friendly_and_stable_output >actual && | |
421 | cat >expect <<-\EOF && | |
422 | <COMMIT-D> refs/heads/topic/1 | |
423 | <COMMIT-H> refs/heads/topic/2 | |
424 | EOF | |
425 | test_cmp expect actual && | |
426 | ||
427 | git -C mirror.git fetch ../2.bdl "+refs/*:refs/*" && | |
428 | git -C mirror.git show-ref | | |
429 | make_user_friendly_and_stable_output >actual && | |
430 | cat >expect <<-\EOF && | |
431 | <COMMIT-N> refs/heads/release | |
432 | <COMMIT-D> refs/heads/topic/1 | |
433 | <COMMIT-H> refs/heads/topic/2 | |
434 | EOF | |
435 | test_cmp expect actual && | |
436 | ||
437 | git -C mirror.git fetch ../3.bdl "+refs/*:refs/*" && | |
438 | git -C mirror.git show-ref | | |
439 | make_user_friendly_and_stable_output >actual && | |
440 | cat >expect <<-\EOF && | |
441 | <COMMIT-P> refs/heads/main | |
442 | <COMMIT-N> refs/heads/release | |
443 | <COMMIT-D> refs/heads/topic/1 | |
444 | <COMMIT-H> refs/heads/topic/2 | |
445 | EOF | |
446 | test_cmp expect actual && | |
447 | ||
448 | git -C mirror.git fetch ../4.bdl "+refs/*:refs/*" && | |
449 | git -C mirror.git show-ref | | |
450 | make_user_friendly_and_stable_output >actual && | |
451 | cat >expect <<-\EOF && | |
452 | <COMMIT-P> refs/heads/main | |
453 | <COMMIT-N> refs/heads/release | |
454 | <COMMIT-D> refs/heads/topic/1 | |
455 | <COMMIT-H> refs/heads/topic/2 | |
456 | <TAG-1> refs/tags/v1 | |
457 | <TAG-2> refs/tags/v2 | |
458 | <TAG-3> refs/tags/v3 | |
459 | EOF | |
460 | test_cmp expect actual | |
461 | ' | |
462 | ||
463 | test_done |