]> git.ipfire.org Git - thirdparty/git.git/blame - t/t3800-mktag.sh
Start the 2.46 cycle
[thirdparty/git.git] / t / t3800-mktag.sh
CommitLineData
446c6fae
RJ
1#!/bin/sh
2#
3#
4
0cb0e143 5test_description='git mktag: tag object verify test'
446c6fae 6
b2e5d75d 7TEST_PASSES_SANITIZE_LEAK=true
446c6fae
RJ
8. ./test-lib.sh
9
10###########################################################
11# check the tag.sig file, expecting verify_tag() to fail,
12# and checking that the error message matches the pattern
13# given in the expect.pat file.
14
15check_verify_failure () {
fce3b089
ÆAB
16 subject=$1 &&
17 message=$2 &&
18 shift 2 &&
19
47c0cb1a
ÆAB
20 no_strict= &&
21 fsck_obj_ok= &&
fce3b089
ÆAB
22 no_strict= &&
23 while test $# != 0
24 do
25 case "$1" in
26 --no-strict)
27 no_strict=yes
28 ;;
47c0cb1a
ÆAB
29 --fsck-obj-ok)
30 fsck_obj_ok=yes
31 ;;
fce3b089
ÆAB
32 esac &&
33 shift
34 done &&
35
36 test_expect_success "fail with [--[no-]strict]: $subject" '
37 test_must_fail git mktag <tag.sig 2>err &&
38 if test -z "$no_strict"
06ce7915 39 then
fce3b089
ÆAB
40 test_must_fail git mktag <tag.sig 2>err2 &&
41 test_cmp err err2
6a748c2c
ÆAB
42 else
43 git mktag --no-strict <tag.sig
06ce7915 44 fi
fce3b089 45 '
47c0cb1a
ÆAB
46
47 test_expect_success "setup: $subject" '
eddc1f55
ÆAB
48 tag_ref=refs/tags/bad_tag &&
49
47c0cb1a
ÆAB
50 # Reset any leftover state from the last $subject
51 rm -rf bad-tag &&
52
53 git init --bare bad-tag &&
eddc1f55 54 bad_tag=$(git -C bad-tag hash-object -t tag -w --stdin --literally <tag.sig)
47c0cb1a
ÆAB
55 '
56
57 test_expect_success "hash-object & fsck unreachable: $subject" '
58 if test -n "$fsck_obj_ok"
59 then
60 git -C bad-tag fsck
61 else
62 test_must_fail git -C bad-tag fsck
63 fi
64 '
eddc1f55
ÆAB
65
66 test_expect_success "update-ref & fsck reachable: $subject" '
67 # Make sure the earlier test created it for us
68 git rev-parse "$bad_tag" &&
69
70 # The update-ref of the bad content will fail, do it
71 # anyway to see if it segfaults
72 test_might_fail git -C bad-tag update-ref "$tag_ref" "$bad_tag" &&
73
74 # Manually create the broken, we cannot do it with
75 # update-ref
e9706a18
HWN
76 test-tool -C bad-tag ref-store main delete-refs 0 msg "$tag_ref" &&
77 test-tool -C bad-tag ref-store main update-ref msg "$tag_ref" $bad_tag $ZERO_OID REF_SKIP_OID_VERIFICATION &&
eddc1f55
ÆAB
78
79 # Unlike fsck-ing unreachable content above, this
80 # will always fail.
81 test_must_fail git -C bad-tag fsck
82 '
b48015b3
ÆAB
83
84 test_expect_success "for-each-ref: $subject" '
85 # Make sure the earlier test created it for us
86 git rev-parse "$bad_tag" &&
87
e9706a18
HWN
88 test-tool -C bad-tag ref-store main delete-refs 0 msg "$tag_ref" &&
89 test-tool -C bad-tag ref-store main update-ref msg "$tag_ref" $bad_tag $ZERO_OID REF_SKIP_OID_VERIFICATION &&
b48015b3
ÆAB
90
91 printf "%s tag\t%s\n" "$bad_tag" "$tag_ref" >expected &&
92 git -C bad-tag for-each-ref "$tag_ref" >actual &&
93 test_cmp expected actual &&
94
95 test_must_fail git -C bad-tag for-each-ref --format="%(*objectname)"
96 '
2f61b3ee
ÆAB
97
98 test_expect_success "fast-export & fast-import: $subject" '
99 # Make sure the earlier test created it for us
100 git rev-parse "$bad_tag" &&
101
102 test_must_fail git -C bad-tag fast-export --all &&
103 test_must_fail git -C bad-tag fast-export "$bad_tag"
104 '
446c6fae
RJ
105}
106
ca9a1ed9
ÆAB
107test_expect_mktag_success() {
108 test_expect_success "$1" '
109 git hash-object -t tag -w --stdin <tag.sig >expected &&
110 git fsck --strict &&
111
112 git mktag <tag.sig >hash &&
113 test_cmp expected hash &&
114 test_when_finished "git update-ref -d refs/tags/mytag $(cat hash)" &&
115 git update-ref refs/tags/mytag $(cat hash) $(test_oid zero) &&
116 git fsck --strict
117 '
118}
119
446c6fae
RJ
120###########################################################
121# first create a commit, so we have a valid object/type
122# for the tag.
4a45f7dd 123test_expect_success 'setup' '
b5ca549c 124 test_commit A &&
692654dc
ÆAB
125 test_commit B &&
126 head=$(git rev-parse --verify HEAD) &&
127 head_parent=$(git rev-parse --verify HEAD~) &&
128 tree=$(git rev-parse HEAD^{tree}) &&
129 blob=$(git rev-parse --verify HEAD:B.t)
4a45f7dd 130'
446c6fae 131
3f390a36
ÆAB
132test_expect_success 'basic usage' '
133 cat >tag.sig <<-EOF &&
134 object $head
135 type commit
136 tag mytag
137 tagger T A Gger <tagger@example.com> 1206478233 -0500
138 EOF
139 git mktag <tag.sig &&
140 git mktag --end-of-options <tag.sig &&
141 test_expect_code 129 git mktag --unknown-option
142'
143
446c6fae
RJ
144############################################################
145# 1. length check
146
147cat >tag.sig <<EOF
148too short for a tag
149EOF
150
e9b20943 151check_verify_failure 'Tag object length check' \
06ce7915 152 '^error:.* missingObject:' 'strict'
446c6fae
RJ
153
154############################################################
155# 2. object line label check
156
157cat >tag.sig <<EOF
0d35ccb5 158xxxxxx $head
446c6fae
RJ
159type tag
160tag mytag
e0aaf781
BC
161tagger . <> 0 +0000
162
446c6fae
RJ
163EOF
164
acf9de4c 165check_verify_failure '"object" line label check' '^error:.* missingObject:'
446c6fae
RJ
166
167############################################################
0d35ccb5 168# 3. object line hash check
446c6fae
RJ
169
170cat >tag.sig <<EOF
0d35ccb5 171object $(echo $head | tr 0-9a-f z)
446c6fae
RJ
172type tag
173tag mytag
e0aaf781
BC
174tagger . <> 0 +0000
175
446c6fae
RJ
176EOF
177
acf9de4c 178check_verify_failure '"object" line check' '^error:.* badObjectSha1:'
446c6fae
RJ
179
180############################################################
181# 4. type line label check
182
183cat >tag.sig <<EOF
acb49d1c 184object $head
446c6fae
RJ
185xxxx tag
186tag mytag
e0aaf781
BC
187tagger . <> 0 +0000
188
446c6fae
RJ
189EOF
190
acf9de4c 191check_verify_failure '"type" line label check' '^error:.* missingTypeEntry:'
446c6fae
RJ
192
193############################################################
194# 5. type line eol check
195
acb49d1c 196echo "object $head" >tag.sig
2aad957a 197printf "type tagsssssssssssssssssssssssssssssss" >>tag.sig
446c6fae 198
acf9de4c 199check_verify_failure '"type" line eol check' '^error:.* unterminatedHeader:'
446c6fae
RJ
200
201############################################################
202# 6. tag line label check #1
203
204cat >tag.sig <<EOF
acb49d1c 205object $head
446c6fae
RJ
206type tag
207xxx mytag
e0aaf781
BC
208tagger . <> 0 +0000
209
446c6fae
RJ
210EOF
211
e9b20943 212check_verify_failure '"tag" line label check #1' \
acf9de4c 213 '^error:.* missingTagEntry:'
446c6fae
RJ
214
215############################################################
216# 7. tag line label check #2
217
218cat >tag.sig <<EOF
acb49d1c 219object $head
446c6fae
RJ
220type taggggggggggggggggggggggggggggggg
221tag
222EOF
223
e9b20943 224check_verify_failure '"tag" line label check #2' \
acf9de4c 225 '^error:.* badType:'
446c6fae
RJ
226
227############################################################
228# 8. type line type-name length check
229
230cat >tag.sig <<EOF
acb49d1c 231object $head
446c6fae
RJ
232type taggggggggggggggggggggggggggggggg
233tag mytag
234EOF
235
e9b20943 236check_verify_failure '"type" line type-name length check' \
acf9de4c 237 '^error:.* badType:'
446c6fae
RJ
238
239############################################################
30f882c1 240# 9. verify object (hash/type) check
446c6fae
RJ
241
242cat >tag.sig <<EOF
acb49d1c 243object $(test_oid deadbeef)
30f882c1
ÆAB
244type tag
245tag mytag
246tagger . <> 0 +0000
247
248EOF
249
250check_verify_failure 'verify object (hash/type) check -- correct type, nonexisting object' \
47c0cb1a
ÆAB
251 '^fatal: could not read tagged object' \
252 --fsck-obj-ok
30f882c1
ÆAB
253
254cat >tag.sig <<EOF
255object $head
446c6fae
RJ
256type tagggg
257tag mytag
e0aaf781
BC
258tagger . <> 0 +0000
259
446c6fae
RJ
260EOF
261
30f882c1 262check_verify_failure 'verify object (hash/type) check -- made-up type, valid object' \
acf9de4c 263 '^error:.* badType:'
30f882c1
ÆAB
264
265cat >tag.sig <<EOF
266object $(test_oid deadbeef)
267type tagggg
268tag mytag
269tagger . <> 0 +0000
270
271EOF
272
273check_verify_failure 'verify object (hash/type) check -- made-up type, nonexisting object' \
acf9de4c 274 '^error:.* badType:'
446c6fae 275
30f882c1
ÆAB
276cat >tag.sig <<EOF
277object $head
278type tree
279tag mytag
280tagger . <> 0 +0000
281
282EOF
283
692654dc 284check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \
47c0cb1a
ÆAB
285 '^fatal: object.*tagged as.*tree.*but is.*commit' \
286 --fsck-obj-ok
692654dc
ÆAB
287
288############################################################
289# 9.5. verify object (hash/type) check -- replacement
290
291test_expect_success 'setup replacement of commit -> commit and tree -> blob' '
292 git replace $head_parent $head &&
293 git replace -f $tree $blob
294'
295
296cat >tag.sig <<EOF
297object $head_parent
298type commit
299tag mytag
300tagger . <> 0 +0000
301
302EOF
303
304test_expect_mktag_success 'tag to a commit replaced by another commit'
305
306cat >tag.sig <<EOF
307object $tree
308type tree
309tag mytag
310tagger . <> 0 +0000
311
312EOF
313
30f882c1 314check_verify_failure 'verify object (hash/type) check -- mismatched type, valid object' \
47c0cb1a
ÆAB
315 '^fatal: object.*tagged as.*tree.*but is.*blob' \
316 --fsck-obj-ok
30f882c1 317
446c6fae
RJ
318############################################################
319# 10. verify tag-name check
320
321cat >tag.sig <<EOF
322object $head
323type commit
324tag my tag
e0aaf781
BC
325tagger . <> 0 +0000
326
446c6fae
RJ
327EOF
328
e9b20943 329check_verify_failure 'verify tag-name check' \
fce3b089 330 '^error:.* badTagName:' \
47c0cb1a
ÆAB
331 --no-strict \
332 --fsck-obj-ok
446c6fae
RJ
333
334############################################################
3dff5379 335# 11. tagger line label check #1
446c6fae
RJ
336
337cat >tag.sig <<EOF
338object $head
339type commit
340tag mytag
e0aaf781
BC
341
342This is filler
446c6fae
RJ
343EOF
344
e9b20943 345check_verify_failure '"tagger" line label check #1' \
fce3b089 346 '^error:.* missingTaggerEntry:' \
47c0cb1a
ÆAB
347 --no-strict \
348 --fsck-obj-ok
446c6fae
RJ
349
350############################################################
3dff5379 351# 12. tagger line label check #2
446c6fae
RJ
352
353cat >tag.sig <<EOF
354object $head
355type commit
356tag mytag
357tagger
e0aaf781
BC
358
359This is filler
446c6fae
RJ
360EOF
361
e9b20943 362check_verify_failure '"tagger" line label check #2' \
fce3b089 363 '^error:.* missingTaggerEntry:' \
47c0cb1a
ÆAB
364 --no-strict \
365 --fsck-obj-ok
446c6fae
RJ
366
367############################################################
acf9de4c 368# 13. allow missing tag author name like fsck
446c6fae
RJ
369
370cat >tag.sig <<EOF
371object $head
372type commit
373tag mytag
e0aaf781
BC
374tagger <> 0 +0000
375
376This is filler
377EOF
378
acf9de4c 379test_expect_mktag_success 'allow missing tag author name'
e0aaf781
BC
380
381############################################################
ba26ab99 382# 14. disallow missing tag author name
e0aaf781
BC
383
384cat >tag.sig <<EOF
385object $head
386type commit
387tag mytag
388tagger T A Gger <
389 > 0 +0000
390
391EOF
392
ba26ab99 393check_verify_failure 'disallow malformed tagger' \
fce3b089 394 '^error:.* badEmail:' \
47c0cb1a
ÆAB
395 --no-strict \
396 --fsck-obj-ok
e0aaf781
BC
397
398############################################################
399# 15. allow empty tag email
400
401cat >tag.sig <<EOF
402object $head
403type commit
404tag mytag
405tagger T A Gger <> 0 +0000
406
407EOF
408
ca9a1ed9 409test_expect_mktag_success 'allow empty tag email'
e0aaf781
BC
410
411############################################################
acf9de4c 412# 16. allow spaces in tag email like fsck
ba26ab99
BC
413
414cat >tag.sig <<EOF
415object $head
416type commit
417tag mytag
418tagger T A Gger <tag ger@example.com> 0 +0000
419
420EOF
421
acf9de4c 422test_expect_mktag_success 'allow spaces in tag email like fsck'
ba26ab99
BC
423
424############################################################
425# 17. disallow missing tag timestamp
e0aaf781 426
74f16b0c 427tr '_' ' ' >tag.sig <<EOF
e0aaf781
BC
428object $head
429type commit
430tag mytag
74f16b0c 431tagger T A Gger <tagger@example.com>__
e0aaf781
BC
432
433EOF
434
ba26ab99 435check_verify_failure 'disallow missing tag timestamp' \
acf9de4c 436 '^error:.* badDate:'
e0aaf781
BC
437
438############################################################
ba26ab99 439# 18. detect invalid tag timestamp1
e0aaf781
BC
440
441cat >tag.sig <<EOF
442object $head
443type commit
444tag mytag
445tagger T A Gger <tagger@example.com> Tue Mar 25 15:47:44 2008
446
447EOF
448
ba26ab99 449check_verify_failure 'detect invalid tag timestamp1' \
acf9de4c 450 '^error:.* badDate:'
e0aaf781
BC
451
452############################################################
ba26ab99
BC
453# 19. detect invalid tag timestamp2
454
455cat >tag.sig <<EOF
456object $head
457type commit
458tag mytag
459tagger T A Gger <tagger@example.com> 2008-03-31T12:20:15-0500
460
461EOF
462
463check_verify_failure 'detect invalid tag timestamp2' \
acf9de4c 464 '^error:.* badDate:'
ba26ab99
BC
465
466############################################################
467# 20. detect invalid tag timezone1
e0aaf781
BC
468
469cat >tag.sig <<EOF
470object $head
471type commit
472tag mytag
473tagger T A Gger <tagger@example.com> 1206478233 GMT
474
475EOF
476
ba26ab99 477check_verify_failure 'detect invalid tag timezone1' \
acf9de4c 478 '^error:.* badTimezone:'
ba26ab99
BC
479
480############################################################
481# 21. detect invalid tag timezone2
482
483cat >tag.sig <<EOF
484object $head
485type commit
486tag mytag
487tagger T A Gger <tagger@example.com> 1206478233 + 30
488
489EOF
490
491check_verify_failure 'detect invalid tag timezone2' \
acf9de4c 492 '^error:.* badTimezone:'
ba26ab99
BC
493
494############################################################
acf9de4c 495# 22. allow invalid tag timezone3 (the maximum is -1200/+1400)
ba26ab99
BC
496
497cat >tag.sig <<EOF
498object $head
499type commit
500tag mytag
501tagger T A Gger <tagger@example.com> 1206478233 -1430
502
503EOF
504
acf9de4c 505test_expect_mktag_success 'allow invalid tag timezone'
e0aaf781
BC
506
507############################################################
ba26ab99 508# 23. detect invalid header entry
e0aaf781
BC
509
510cat >tag.sig <<EOF
511object $head
512type commit
513tag mytag
514tagger T A Gger <tagger@example.com> 1206478233 -0500
515this line should not be here
516
517EOF
518
519check_verify_failure 'detect invalid header entry' \
fce3b089 520 '^error:.* extraHeaderEntry:' \
47c0cb1a
ÆAB
521 --no-strict \
522 --fsck-obj-ok
e0aaf781 523
acfc0133
ÆAB
524test_expect_success 'invalid header entry config & fsck' '
525 test_must_fail git mktag <tag.sig &&
06ce7915
ÆAB
526 git mktag --no-strict <tag.sig &&
527
acfc0133 528 test_must_fail git -c fsck.extraHeaderEntry=error mktag <tag.sig &&
06ce7915
ÆAB
529 test_must_fail git -c fsck.extraHeaderEntry=error mktag --no-strict <tag.sig &&
530
acfc0133 531 test_must_fail git -c fsck.extraHeaderEntry=warn mktag <tag.sig &&
06ce7915
ÆAB
532 git -c fsck.extraHeaderEntry=warn mktag --no-strict <tag.sig &&
533
acfc0133 534 git -c fsck.extraHeaderEntry=ignore mktag <tag.sig &&
06ce7915
ÆAB
535 git -c fsck.extraHeaderEntry=ignore mktag --no-strict <tag.sig &&
536
acfc0133 537 git fsck &&
780aa0a2 538 git -c fsck.extraHeaderEntry=warn fsck 2>err &&
acfc0133 539 grep "warning .*extraHeaderEntry:" err &&
780aa0a2 540 test_must_fail git -c fsck.extraHeaderEntry=error 2>err fsck &&
acfc0133
ÆAB
541 grep "error .* extraHeaderEntry:" err
542'
543
47c95e77
ÆAB
544cat >tag.sig <<EOF
545object $head
546type commit
547tag mytag
548tagger T A Gger <tagger@example.com> 1206478233 -0500
549
550
551this line comes after an extra newline
552EOF
553
ca9a1ed9 554test_expect_mktag_success 'allow extra newlines at start of body'
47c95e77
ÆAB
555
556cat >tag.sig <<EOF
557object $head
558type commit
559tag mytag
560tagger T A Gger <tagger@example.com> 1206478233 -0500
561
562EOF
563
9a1a3a4d 564test_expect_mktag_success 'allow a blank line before an empty body (1)'
47c95e77
ÆAB
565
566cat >tag.sig <<EOF
567object $head
568type commit
569tag mytag
570tagger T A Gger <tagger@example.com> 1206478233 -0500
571EOF
572
9a1a3a4d 573test_expect_mktag_success 'allow no blank line before an empty body (2)'
47c95e77 574
e0aaf781 575############################################################
ba26ab99 576# 24. create valid tag
e0aaf781
BC
577
578cat >tag.sig <<EOF
579object $head
580type commit
581tag mytag
582tagger T A Gger <tagger@example.com> 1206478233 -0500
446c6fae
RJ
583EOF
584
ca9a1ed9 585test_expect_mktag_success 'create valid tag object'
446c6fae
RJ
586
587test_done