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