Sync with Git 2.16.4
[git] / t / t7004-tag.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Carlos Rica
4 #
5
6 test_description='git tag
7
8 Tests for operations with tags.'
9
10 . ./test-lib.sh
11 . "$TEST_DIRECTORY"/lib-gpg.sh
12 . "$TEST_DIRECTORY"/lib-terminal.sh
13
14 # creating and listing lightweight tags:
15
16 tag_exists () {
17         git show-ref --quiet --verify refs/tags/"$1"
18 }
19
20 test_expect_success 'listing all tags in an empty tree should succeed' '
21         git tag -l &&
22         git tag
23 '
24
25 test_expect_success 'listing all tags in an empty tree should output nothing' '
26         test $(git tag -l | wc -l) -eq 0 &&
27         test $(git tag | wc -l) -eq 0
28 '
29
30 test_expect_success 'sort tags, ignore case' '
31         (
32                 git init sort &&
33                 cd sort &&
34                 test_commit initial &&
35                 git tag tag-one &&
36                 git tag TAG-two &&
37                 git tag -l >actual &&
38                 cat >expected <<-\EOF &&
39                 TAG-two
40                 initial
41                 tag-one
42                 EOF
43                 test_cmp expected actual &&
44                 git tag -l -i >actual &&
45                 cat >expected <<-\EOF &&
46                 initial
47                 tag-one
48                 TAG-two
49                 EOF
50                 test_cmp expected actual
51         )
52 '
53
54 test_expect_success 'looking for a tag in an empty tree should fail' \
55         '! (tag_exists mytag)'
56
57 test_expect_success 'creating a tag in an empty tree should fail' '
58         test_must_fail git tag mynotag &&
59         ! tag_exists mynotag
60 '
61
62 test_expect_success 'creating a tag for HEAD in an empty tree should fail' '
63         test_must_fail git tag mytaghead HEAD &&
64         ! tag_exists mytaghead
65 '
66
67 test_expect_success 'creating a tag for an unknown revision should fail' '
68         test_must_fail git tag mytagnorev aaaaaaaaaaa &&
69         ! tag_exists mytagnorev
70 '
71
72 # commit used in the tests, test_tick is also called here to freeze the date:
73 test_expect_success 'creating a tag using default HEAD should succeed' '
74         test_config core.logAllRefUpdates true &&
75         test_tick &&
76         echo foo >foo &&
77         git add foo &&
78         git commit -m Foo &&
79         git tag mytag &&
80         test_must_fail git reflog exists refs/tags/mytag
81 '
82
83 test_expect_success 'creating a tag with --create-reflog should create reflog' '
84         git log -1 \
85                 --format="format:tag: tagging %h (%s, %cd)%n" \
86                 --date=format:%Y-%m-%d >expected &&
87         test_when_finished "git tag -d tag_with_reflog" &&
88         git tag --create-reflog tag_with_reflog &&
89         git reflog exists refs/tags/tag_with_reflog &&
90         sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
91         test_i18ncmp expected actual
92 '
93
94 test_expect_success 'annotated tag with --create-reflog has correct message' '
95         git log -1 \
96                 --format="format:tag: tagging %h (%s, %cd)%n" \
97                 --date=format:%Y-%m-%d >expected &&
98         test_when_finished "git tag -d tag_with_reflog" &&
99         git tag -m "annotated tag" --create-reflog tag_with_reflog &&
100         git reflog exists refs/tags/tag_with_reflog &&
101         sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
102         test_i18ncmp expected actual
103 '
104
105 test_expect_success '--create-reflog does not create reflog on failure' '
106         test_must_fail git tag --create-reflog mytag &&
107         test_must_fail git reflog exists refs/tags/mytag
108 '
109
110 test_expect_success 'option core.logAllRefUpdates=always creates reflog' '
111         test_when_finished "git tag -d tag_with_reflog" &&
112         test_config core.logAllRefUpdates always &&
113         git tag tag_with_reflog &&
114         git reflog exists refs/tags/tag_with_reflog
115 '
116
117 test_expect_success 'listing all tags if one exists should succeed' '
118         git tag -l &&
119         git tag
120 '
121
122 cat >expect <<EOF
123 mytag
124 EOF
125 test_expect_success 'Multiple -l or --list options are equivalent to one -l option' '
126         git tag -l -l >actual &&
127         test_cmp expect actual &&
128         git tag --list --list >actual &&
129         test_cmp expect actual &&
130         git tag --list -l --list >actual &&
131         test_cmp expect actual
132 '
133
134 test_expect_success 'listing all tags if one exists should output that tag' '
135         test $(git tag -l) = mytag &&
136         test $(git tag) = mytag
137 '
138
139 # pattern matching:
140
141 test_expect_success 'listing a tag using a matching pattern should succeed' \
142         'git tag -l mytag'
143
144 test_expect_success 'listing a tag with --ignore-case' \
145         'test $(git tag -l --ignore-case MYTAG) = mytag'
146
147 test_expect_success \
148         'listing a tag using a matching pattern should output that tag' \
149         'test $(git tag -l mytag) = mytag'
150
151 test_expect_success \
152         'listing tags using a non-matching pattern should succeed' \
153         'git tag -l xxx'
154
155 test_expect_success \
156         'listing tags using a non-matching pattern should output nothing' \
157         'test $(git tag -l xxx | wc -l) -eq 0'
158
159 # special cases for creating tags:
160
161 test_expect_success \
162         'trying to create a tag with the name of one existing should fail' \
163         'test_must_fail git tag mytag'
164
165 test_expect_success \
166         'trying to create a tag with a non-valid name should fail' '
167         test $(git tag -l | wc -l) -eq 1 &&
168         test_must_fail git tag "" &&
169         test_must_fail git tag .othertag &&
170         test_must_fail git tag "other tag" &&
171         test_must_fail git tag "othertag^" &&
172         test_must_fail git tag "other~tag" &&
173         test $(git tag -l | wc -l) -eq 1
174 '
175
176 test_expect_success 'creating a tag using HEAD directly should succeed' '
177         git tag myhead HEAD &&
178         tag_exists myhead
179 '
180
181 test_expect_success '--force can create a tag with the name of one existing' '
182         tag_exists mytag &&
183         git tag --force mytag &&
184         tag_exists mytag'
185
186 test_expect_success '--force is moot with a non-existing tag name' '
187         test_when_finished git tag -d newtag forcetag &&
188         git tag newtag >expect &&
189         git tag --force forcetag >actual &&
190         test_cmp expect actual
191 '
192
193 # deleting tags:
194
195 test_expect_success 'trying to delete an unknown tag should fail' '
196         ! tag_exists unknown-tag &&
197         test_must_fail git tag -d unknown-tag
198 '
199
200 cat >expect <<EOF
201 myhead
202 mytag
203 EOF
204 test_expect_success \
205         'trying to delete tags without params should succeed and do nothing' '
206         git tag -l > actual && test_cmp expect actual &&
207         git tag -d &&
208         git tag -l > actual && test_cmp expect actual
209 '
210
211 test_expect_success \
212         'deleting two existing tags in one command should succeed' '
213         tag_exists mytag &&
214         tag_exists myhead &&
215         git tag -d mytag myhead &&
216         ! tag_exists mytag &&
217         ! tag_exists myhead
218 '
219
220 test_expect_success \
221         'creating a tag with the name of another deleted one should succeed' '
222         ! tag_exists mytag &&
223         git tag mytag &&
224         tag_exists mytag
225 '
226
227 test_expect_success \
228         'trying to delete two tags, existing and not, should fail in the 2nd' '
229         tag_exists mytag &&
230         ! tag_exists myhead &&
231         test_must_fail git tag -d mytag anothertag &&
232         ! tag_exists mytag &&
233         ! tag_exists myhead
234 '
235
236 test_expect_success 'trying to delete an already deleted tag should fail' \
237         'test_must_fail git tag -d mytag'
238
239 # listing various tags with pattern matching:
240
241 cat >expect <<EOF
242 a1
243 aa1
244 cba
245 t210
246 t211
247 v0.2.1
248 v1.0
249 v1.0.1
250 v1.1.3
251 EOF
252 test_expect_success 'listing all tags should print them ordered' '
253         git tag v1.0.1 &&
254         git tag t211 &&
255         git tag aa1 &&
256         git tag v0.2.1 &&
257         git tag v1.1.3 &&
258         git tag cba &&
259         git tag a1 &&
260         git tag v1.0 &&
261         git tag t210 &&
262         git tag -l > actual &&
263         test_cmp expect actual &&
264         git tag > actual &&
265         test_cmp expect actual
266 '
267
268 cat >expect <<EOF
269 a1
270 aa1
271 cba
272 EOF
273 test_expect_success \
274         'listing tags with substring as pattern must print those matching' '
275         rm *a* &&
276         git tag -l "*a*" > current &&
277         test_cmp expect current
278 '
279
280 cat >expect <<EOF
281 v0.2.1
282 v1.0.1
283 EOF
284 test_expect_success \
285         'listing tags with a suffix as pattern must print those matching' '
286         git tag -l "*.1" > actual &&
287         test_cmp expect actual
288 '
289
290 cat >expect <<EOF
291 t210
292 t211
293 EOF
294 test_expect_success \
295         'listing tags with a prefix as pattern must print those matching' '
296         git tag -l "t21*" > actual &&
297         test_cmp expect actual
298 '
299
300 cat >expect <<EOF
301 a1
302 EOF
303 test_expect_success \
304         'listing tags using a name as pattern must print that one matching' '
305         git tag -l a1 > actual &&
306         test_cmp expect actual
307 '
308
309 cat >expect <<EOF
310 v1.0
311 EOF
312 test_expect_success \
313         'listing tags using a name as pattern must print that one matching' '
314         git tag -l v1.0 > actual &&
315         test_cmp expect actual
316 '
317
318 cat >expect <<EOF
319 v1.0.1
320 v1.1.3
321 EOF
322 test_expect_success \
323         'listing tags with ? in the pattern should print those matching' '
324         git tag -l "v1.?.?" > actual &&
325         test_cmp expect actual
326 '
327
328 >expect
329 test_expect_success \
330         'listing tags using v.* should print nothing because none have v.' '
331         git tag -l "v.*" > actual &&
332         test_cmp expect actual
333 '
334
335 cat >expect <<EOF
336 v0.2.1
337 v1.0
338 v1.0.1
339 v1.1.3
340 EOF
341 test_expect_success \
342         'listing tags using v* should print only those having v' '
343         git tag -l "v*" > actual &&
344         test_cmp expect actual
345 '
346
347 test_expect_success 'tag -l can accept multiple patterns' '
348         git tag -l "v1*" "v0*" >actual &&
349         test_cmp expect actual
350 '
351
352 # Between v1.7.7 & v2.13.0 a fair reading of the git-tag documentation
353 # could leave you with the impression that "-l <pattern> -l <pattern>"
354 # was how we wanted to accept multiple patterns.
355 #
356 # This test should not imply that this is a sane thing to support. but
357 # since the documentation was worded like it was let's at least find
358 # out if we're going to break this long-documented form of taking
359 # multiple patterns.
360 test_expect_success 'tag -l <pattern> -l <pattern> works, as our buggy documentation previously suggested' '
361         git tag -l "v1*" -l "v0*" >actual &&
362         test_cmp expect actual
363 '
364
365 test_expect_success 'listing tags in column' '
366         COLUMNS=40 git tag -l --column=row >actual &&
367         cat >expected <<\EOF &&
368 a1      aa1     cba     t210    t211
369 v0.2.1  v1.0    v1.0.1  v1.1.3
370 EOF
371         test_cmp expected actual
372 '
373
374 test_expect_success 'listing tags in column with column.*' '
375         test_config column.tag row &&
376         test_config column.ui dense &&
377         COLUMNS=40 git tag -l >actual &&
378         cat >expected <<\EOF &&
379 a1      aa1   cba     t210    t211
380 v0.2.1  v1.0  v1.0.1  v1.1.3
381 EOF
382         test_cmp expected actual
383 '
384
385 test_expect_success 'listing tag with -n --column should fail' '
386         test_must_fail git tag --column -n
387 '
388
389 test_expect_success 'listing tags -n in column with column.ui ignored' '
390         test_config column.ui "row dense" &&
391         COLUMNS=40 git tag -l -n >actual &&
392         cat >expected <<\EOF &&
393 a1              Foo
394 aa1             Foo
395 cba             Foo
396 t210            Foo
397 t211            Foo
398 v0.2.1          Foo
399 v1.0            Foo
400 v1.0.1          Foo
401 v1.1.3          Foo
402 EOF
403         test_cmp expected actual
404 '
405
406 # creating and verifying lightweight tags:
407
408 test_expect_success \
409         'a non-annotated tag created without parameters should point to HEAD' '
410         git tag non-annotated-tag &&
411         test $(git cat-file -t non-annotated-tag) = commit &&
412         test $(git rev-parse non-annotated-tag) = $(git rev-parse HEAD)
413 '
414
415 test_expect_success 'trying to verify an unknown tag should fail' \
416         'test_must_fail git tag -v unknown-tag'
417
418 test_expect_success \
419         'trying to verify a non-annotated and non-signed tag should fail' \
420         'test_must_fail git tag -v non-annotated-tag'
421
422 test_expect_success \
423         'trying to verify many non-annotated or unknown tags, should fail' \
424         'test_must_fail git tag -v unknown-tag1 non-annotated-tag unknown-tag2'
425
426 # creating annotated tags:
427
428 get_tag_msg () {
429         git cat-file tag "$1" | sed -e "/BEGIN PGP/q"
430 }
431
432 # run test_tick before committing always gives the time in that timezone
433 get_tag_header () {
434 cat <<EOF
435 object $2
436 type $3
437 tag $1
438 tagger C O Mitter <committer@example.com> $4 -0700
439
440 EOF
441 }
442
443 commit=$(git rev-parse HEAD)
444 time=$test_tick
445
446 get_tag_header annotated-tag $commit commit $time >expect
447 echo "A message" >>expect
448 test_expect_success \
449         'creating an annotated tag with -m message should succeed' '
450         git tag -m "A message" annotated-tag &&
451         get_tag_msg annotated-tag >actual &&
452         test_cmp expect actual
453 '
454
455 get_tag_header annotated-tag-edit $commit commit $time >expect
456 echo "An edited message" >>expect
457 test_expect_success 'set up editor' '
458         write_script fakeeditor <<-\EOF
459         sed -e "s/A message/An edited message/g" <"$1" >"$1-"
460         mv "$1-" "$1"
461         EOF
462 '
463 test_expect_success \
464         'creating an annotated tag with -m message --edit should succeed' '
465         GIT_EDITOR=./fakeeditor git tag -m "A message" --edit annotated-tag-edit &&
466         get_tag_msg annotated-tag-edit >actual &&
467         test_cmp expect actual
468 '
469
470 cat >msgfile <<EOF
471 Another message
472 in a file.
473 EOF
474 get_tag_header file-annotated-tag $commit commit $time >expect
475 cat msgfile >>expect
476 test_expect_success \
477         'creating an annotated tag with -F messagefile should succeed' '
478         git tag -F msgfile file-annotated-tag &&
479         get_tag_msg file-annotated-tag >actual &&
480         test_cmp expect actual
481 '
482
483 get_tag_header file-annotated-tag-edit $commit commit $time >expect
484 sed -e "s/Another message/Another edited message/g" msgfile >>expect
485 test_expect_success 'set up editor' '
486         write_script fakeeditor <<-\EOF
487         sed -e "s/Another message/Another edited message/g" <"$1" >"$1-"
488         mv "$1-" "$1"
489         EOF
490 '
491 test_expect_success \
492         'creating an annotated tag with -F messagefile --edit should succeed' '
493         GIT_EDITOR=./fakeeditor git tag -F msgfile --edit file-annotated-tag-edit &&
494         get_tag_msg file-annotated-tag-edit >actual &&
495         test_cmp expect actual
496 '
497
498 cat >inputmsg <<EOF
499 A message from the
500 standard input
501 EOF
502 get_tag_header stdin-annotated-tag $commit commit $time >expect
503 cat inputmsg >>expect
504 test_expect_success 'creating an annotated tag with -F - should succeed' '
505         git tag -F - stdin-annotated-tag <inputmsg &&
506         get_tag_msg stdin-annotated-tag >actual &&
507         test_cmp expect actual
508 '
509
510 test_expect_success \
511         'trying to create a tag with a non-existing -F file should fail' '
512         ! test -f nonexistingfile &&
513         ! tag_exists notag &&
514         test_must_fail git tag -F nonexistingfile notag &&
515         ! tag_exists notag
516 '
517
518 test_expect_success \
519         'trying to create tags giving both -m or -F options should fail' '
520         echo "message file 1" >msgfile1 &&
521         echo "message file 2" >msgfile2 &&
522         ! tag_exists msgtag &&
523         test_must_fail git tag -m "message 1" -F msgfile1 msgtag &&
524         ! tag_exists msgtag &&
525         test_must_fail git tag -F msgfile1 -m "message 1" msgtag &&
526         ! tag_exists msgtag &&
527         test_must_fail git tag -m "message 1" -F msgfile1 \
528                 -m "message 2" msgtag &&
529         ! tag_exists msgtag
530 '
531
532 # blank and empty messages:
533
534 get_tag_header empty-annotated-tag $commit commit $time >expect
535 test_expect_success \
536         'creating a tag with an empty -m message should succeed' '
537         git tag -m "" empty-annotated-tag &&
538         get_tag_msg empty-annotated-tag >actual &&
539         test_cmp expect actual
540 '
541
542 >emptyfile
543 get_tag_header emptyfile-annotated-tag $commit commit $time >expect
544 test_expect_success \
545         'creating a tag with an empty -F messagefile should succeed' '
546         git tag -F emptyfile emptyfile-annotated-tag &&
547         get_tag_msg emptyfile-annotated-tag >actual &&
548         test_cmp expect actual
549 '
550
551 printf '\n\n  \n\t\nLeading blank lines\n' >blanksfile
552 printf '\n\t \t  \nRepeated blank lines\n' >>blanksfile
553 printf '\n\n\nTrailing spaces      \t  \n' >>blanksfile
554 printf '\nTrailing blank lines\n\n\t \n\n' >>blanksfile
555 get_tag_header blanks-annotated-tag $commit commit $time >expect
556 cat >>expect <<EOF
557 Leading blank lines
558
559 Repeated blank lines
560
561 Trailing spaces
562
563 Trailing blank lines
564 EOF
565 test_expect_success \
566         'extra blanks in the message for an annotated tag should be removed' '
567         git tag -F blanksfile blanks-annotated-tag &&
568         get_tag_msg blanks-annotated-tag >actual &&
569         test_cmp expect actual
570 '
571
572 get_tag_header blank-annotated-tag $commit commit $time >expect
573 test_expect_success \
574         'creating a tag with blank -m message with spaces should succeed' '
575         git tag -m "     " blank-annotated-tag &&
576         get_tag_msg blank-annotated-tag >actual &&
577         test_cmp expect actual
578 '
579
580 echo '     ' >blankfile
581 echo ''      >>blankfile
582 echo '  '    >>blankfile
583 get_tag_header blankfile-annotated-tag $commit commit $time >expect
584 test_expect_success \
585         'creating a tag with blank -F messagefile with spaces should succeed' '
586         git tag -F blankfile blankfile-annotated-tag &&
587         get_tag_msg blankfile-annotated-tag >actual &&
588         test_cmp expect actual
589 '
590
591 printf '      ' >blanknonlfile
592 get_tag_header blanknonlfile-annotated-tag $commit commit $time >expect
593 test_expect_success \
594         'creating a tag with -F file of spaces and no newline should succeed' '
595         git tag -F blanknonlfile blanknonlfile-annotated-tag &&
596         get_tag_msg blanknonlfile-annotated-tag >actual &&
597         test_cmp expect actual
598 '
599
600 # messages with commented lines:
601
602 cat >commentsfile <<EOF
603 # A comment
604
605 ############
606 The message.
607 ############
608 One line.
609
610
611 # commented lines
612 # commented lines
613
614 Another line.
615 # comments
616
617 Last line.
618 EOF
619 get_tag_header comments-annotated-tag $commit commit $time >expect
620 cat >>expect <<EOF
621 The message.
622 One line.
623
624 Another line.
625
626 Last line.
627 EOF
628 test_expect_success \
629         'creating a tag using a -F messagefile with #comments should succeed' '
630         git tag -F commentsfile comments-annotated-tag &&
631         get_tag_msg comments-annotated-tag >actual &&
632         test_cmp expect actual
633 '
634
635 get_tag_header comment-annotated-tag $commit commit $time >expect
636 test_expect_success \
637         'creating a tag with a #comment in the -m message should succeed' '
638         git tag -m "#comment" comment-annotated-tag &&
639         get_tag_msg comment-annotated-tag >actual &&
640         test_cmp expect actual
641 '
642
643 echo '#comment' >commentfile
644 echo ''         >>commentfile
645 echo '####'     >>commentfile
646 get_tag_header commentfile-annotated-tag $commit commit $time >expect
647 test_expect_success \
648         'creating a tag with #comments in the -F messagefile should succeed' '
649         git tag -F commentfile commentfile-annotated-tag &&
650         get_tag_msg commentfile-annotated-tag >actual &&
651         test_cmp expect actual
652 '
653
654 printf '#comment' >commentnonlfile
655 get_tag_header commentnonlfile-annotated-tag $commit commit $time >expect
656 test_expect_success \
657         'creating a tag with a file of #comment and no newline should succeed' '
658         git tag -F commentnonlfile commentnonlfile-annotated-tag &&
659         get_tag_msg commentnonlfile-annotated-tag >actual &&
660         test_cmp expect actual
661 '
662
663 # listing messages for annotated non-signed tags:
664
665 test_expect_success \
666         'listing the one-line message of a non-signed tag should succeed' '
667         git tag -m "A msg" tag-one-line &&
668
669         echo "tag-one-line" >expect &&
670         git tag -l | grep "^tag-one-line" >actual &&
671         test_cmp expect actual &&
672         git tag -n0 -l | grep "^tag-one-line" >actual &&
673         test_cmp expect actual &&
674         git tag -n0 -l tag-one-line >actual &&
675         test_cmp expect actual &&
676
677         git tag -n0 | grep "^tag-one-line" >actual &&
678         test_cmp expect actual &&
679         git tag -n0 tag-one-line >actual &&
680         test_cmp expect actual &&
681
682         echo "tag-one-line    A msg" >expect &&
683         git tag -n1 -l | grep "^tag-one-line" >actual &&
684         test_cmp expect actual &&
685         git tag -n -l | grep "^tag-one-line" >actual &&
686         test_cmp expect actual &&
687         git tag -n1 -l tag-one-line >actual &&
688         test_cmp expect actual &&
689         git tag -n2 -l tag-one-line >actual &&
690         test_cmp expect actual &&
691         git tag -n999 -l tag-one-line >actual &&
692         test_cmp expect actual
693 '
694
695 test_expect_success 'The -n 100 invocation means -n --list 100, not -n100' '
696         >expect &&
697         git tag -n 100 >actual &&
698         test_cmp expect actual &&
699
700         git tag -m "A msg" 100 &&
701         echo "100             A msg" >expect &&
702         git tag -n 100 >actual &&
703         test_cmp expect actual
704 '
705
706 test_expect_success \
707         'listing the zero-lines message of a non-signed tag should succeed' '
708         git tag -m "" tag-zero-lines &&
709
710         echo "tag-zero-lines" >expect &&
711         git tag -l | grep "^tag-zero-lines" >actual &&
712         test_cmp expect actual &&
713         git tag -n0 -l | grep "^tag-zero-lines" >actual &&
714         test_cmp expect actual &&
715         git tag -n0 -l tag-zero-lines >actual &&
716         test_cmp expect actual &&
717
718         echo "tag-zero-lines  " >expect &&
719         git tag -n1 -l | grep "^tag-zero-lines" >actual &&
720         test_cmp expect actual &&
721         git tag -n -l | grep "^tag-zero-lines" >actual &&
722         test_cmp expect actual &&
723         git tag -n1 -l tag-zero-lines >actual &&
724         test_cmp expect actual &&
725         git tag -n2 -l tag-zero-lines >actual &&
726         test_cmp expect actual &&
727         git tag -n999 -l tag-zero-lines >actual &&
728         test_cmp expect actual
729 '
730
731 echo 'tag line one' >annotagmsg
732 echo 'tag line two' >>annotagmsg
733 echo 'tag line three' >>annotagmsg
734 test_expect_success \
735         'listing many message lines of a non-signed tag should succeed' '
736         git tag -F annotagmsg tag-lines &&
737
738         echo "tag-lines" >expect &&
739         git tag -l | grep "^tag-lines" >actual &&
740         test_cmp expect actual &&
741         git tag -n0 -l | grep "^tag-lines" >actual &&
742         test_cmp expect actual &&
743         git tag -n0 -l tag-lines >actual &&
744         test_cmp expect actual &&
745
746         echo "tag-lines       tag line one" >expect &&
747         git tag -n1 -l | grep "^tag-lines" >actual &&
748         test_cmp expect actual &&
749         git tag -n -l | grep "^tag-lines" >actual &&
750         test_cmp expect actual &&
751         git tag -n1 -l tag-lines >actual &&
752         test_cmp expect actual &&
753
754         echo "    tag line two" >>expect &&
755         git tag -n2 -l | grep "^ *tag.line" >actual &&
756         test_cmp expect actual &&
757         git tag -n2 -l tag-lines >actual &&
758         test_cmp expect actual &&
759
760         echo "    tag line three" >>expect &&
761         git tag -n3 -l | grep "^ *tag.line" >actual &&
762         test_cmp expect actual &&
763         git tag -n3 -l tag-lines >actual &&
764         test_cmp expect actual &&
765         git tag -n4 -l | grep "^ *tag.line" >actual &&
766         test_cmp expect actual &&
767         git tag -n4 -l tag-lines >actual &&
768         test_cmp expect actual &&
769         git tag -n99 -l | grep "^ *tag.line" >actual &&
770         test_cmp expect actual &&
771         git tag -n99 -l tag-lines >actual &&
772         test_cmp expect actual
773 '
774
775 test_expect_success 'annotations for blobs are empty' '
776         blob=$(git hash-object -w --stdin <<-\EOF
777         Blob paragraph 1.
778
779         Blob paragraph 2.
780         EOF
781         ) &&
782         git tag tag-blob $blob &&
783         echo "tag-blob        " >expect &&
784         git tag -n1 -l tag-blob >actual &&
785         test_cmp expect actual
786 '
787
788 # trying to verify annotated non-signed tags:
789
790 test_expect_success GPG \
791         'trying to verify an annotated non-signed tag should fail' '
792         tag_exists annotated-tag &&
793         test_must_fail git tag -v annotated-tag
794 '
795
796 test_expect_success GPG \
797         'trying to verify a file-annotated non-signed tag should fail' '
798         tag_exists file-annotated-tag &&
799         test_must_fail git tag -v file-annotated-tag
800 '
801
802 test_expect_success GPG \
803         'trying to verify two annotated non-signed tags should fail' '
804         tag_exists annotated-tag file-annotated-tag &&
805         test_must_fail git tag -v annotated-tag file-annotated-tag
806 '
807
808 # creating and verifying signed tags:
809
810 get_tag_header signed-tag $commit commit $time >expect
811 echo 'A signed tag message' >>expect
812 echo '-----BEGIN PGP SIGNATURE-----' >>expect
813 test_expect_success GPG 'creating a signed tag with -m message should succeed' '
814         git tag -s -m "A signed tag message" signed-tag &&
815         get_tag_msg signed-tag >actual &&
816         test_cmp expect actual
817 '
818
819 get_tag_header u-signed-tag $commit commit $time >expect
820 echo 'Another message' >>expect
821 echo '-----BEGIN PGP SIGNATURE-----' >>expect
822 test_expect_success GPG 'sign with a given key id' '
823
824         git tag -u committer@example.com -m "Another message" u-signed-tag &&
825         get_tag_msg u-signed-tag >actual &&
826         test_cmp expect actual
827
828 '
829
830 test_expect_success GPG 'sign with an unknown id (1)' '
831
832         test_must_fail git tag -u author@example.com \
833                 -m "Another message" o-signed-tag
834
835 '
836
837 test_expect_success GPG 'sign with an unknown id (2)' '
838
839         test_must_fail git tag -u DEADBEEF -m "Another message" o-signed-tag
840
841 '
842
843 cat >fakeeditor <<'EOF'
844 #!/bin/sh
845 test -n "$1" && exec >"$1"
846 echo A signed tag message
847 echo from a fake editor.
848 EOF
849 chmod +x fakeeditor
850
851 get_tag_header implied-sign $commit commit $time >expect
852 ./fakeeditor >>expect
853 echo '-----BEGIN PGP SIGNATURE-----' >>expect
854 test_expect_success GPG '-u implies signed tag' '
855         GIT_EDITOR=./fakeeditor git tag -u CDDE430D implied-sign &&
856         get_tag_msg implied-sign >actual &&
857         test_cmp expect actual
858 '
859
860 cat >sigmsgfile <<EOF
861 Another signed tag
862 message in a file.
863 EOF
864 get_tag_header file-signed-tag $commit commit $time >expect
865 cat sigmsgfile >>expect
866 echo '-----BEGIN PGP SIGNATURE-----' >>expect
867 test_expect_success GPG \
868         'creating a signed tag with -F messagefile should succeed' '
869         git tag -s -F sigmsgfile file-signed-tag &&
870         get_tag_msg file-signed-tag >actual &&
871         test_cmp expect actual
872 '
873
874 cat >siginputmsg <<EOF
875 A signed tag message from
876 the standard input
877 EOF
878 get_tag_header stdin-signed-tag $commit commit $time >expect
879 cat siginputmsg >>expect
880 echo '-----BEGIN PGP SIGNATURE-----' >>expect
881 test_expect_success GPG 'creating a signed tag with -F - should succeed' '
882         git tag -s -F - stdin-signed-tag <siginputmsg &&
883         get_tag_msg stdin-signed-tag >actual &&
884         test_cmp expect actual
885 '
886
887 get_tag_header implied-annotate $commit commit $time >expect
888 ./fakeeditor >>expect
889 echo '-----BEGIN PGP SIGNATURE-----' >>expect
890 test_expect_success GPG '-s implies annotated tag' '
891         GIT_EDITOR=./fakeeditor git tag -s implied-annotate &&
892         get_tag_msg implied-annotate >actual &&
893         test_cmp expect actual
894 '
895
896 get_tag_header forcesignannotated-implied-sign $commit commit $time >expect
897 echo "A message" >>expect
898 echo '-----BEGIN PGP SIGNATURE-----' >>expect
899 test_expect_success GPG \
900         'git tag -s implied if configured with tag.forcesignannotated' \
901         'test_config tag.forcesignannotated true &&
902         git tag -m "A message" forcesignannotated-implied-sign &&
903         get_tag_msg forcesignannotated-implied-sign >actual &&
904         test_cmp expect actual
905 '
906
907 test_expect_success GPG \
908         'lightweight with no message when configured with tag.forcesignannotated' \
909         'test_config tag.forcesignannotated true &&
910         git tag forcesignannotated-lightweight &&
911         tag_exists forcesignannotated-lightweight &&
912         test_must_fail git tag -v forcesignannotated-no-message
913 '
914
915 get_tag_header forcesignannotated-annotate $commit commit $time >expect
916 echo "A message" >>expect
917 test_expect_success GPG \
918         'git tag -a disable configured tag.forcesignannotated' \
919         'test_config tag.forcesignannotated true &&
920         git tag -a -m "A message" forcesignannotated-annotate &&
921         get_tag_msg forcesignannotated-annotate >actual &&
922         test_cmp expect actual &&
923         test_must_fail git tag -v forcesignannotated-annotate
924 '
925
926 get_tag_header forcesignannotated-disabled $commit commit $time >expect
927 echo "A message" >>expect
928 echo '-----BEGIN PGP SIGNATURE-----' >>expect
929 test_expect_success GPG \
930         'git tag --sign enable GPG sign' \
931         'test_config tag.forcesignannotated false &&
932         git tag --sign -m "A message" forcesignannotated-disabled &&
933         get_tag_msg forcesignannotated-disabled >actual &&
934         test_cmp expect actual
935 '
936
937 test_expect_success GPG \
938         'trying to create a signed tag with non-existing -F file should fail' '
939         ! test -f nonexistingfile &&
940         ! tag_exists nosigtag &&
941         test_must_fail git tag -s -F nonexistingfile nosigtag &&
942         ! tag_exists nosigtag
943 '
944
945 test_expect_success GPG 'verifying a signed tag should succeed' \
946         'git tag -v signed-tag'
947
948 test_expect_success GPG 'verifying two signed tags in one command should succeed' \
949         'git tag -v signed-tag file-signed-tag'
950
951 test_expect_success GPG \
952         'verifying many signed and non-signed tags should fail' '
953         test_must_fail git tag -v signed-tag annotated-tag &&
954         test_must_fail git tag -v file-annotated-tag file-signed-tag &&
955         test_must_fail git tag -v annotated-tag \
956                 file-signed-tag file-annotated-tag &&
957         test_must_fail git tag -v signed-tag annotated-tag file-signed-tag
958 '
959
960 test_expect_success GPG 'verifying a forged tag should fail' '
961         forged=$(git cat-file tag signed-tag |
962                 sed -e "s/signed-tag/forged-tag/" |
963                 git mktag) &&
964         git tag forged-tag $forged &&
965         test_must_fail git tag -v forged-tag
966 '
967
968 test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly' '
969         cat >expect <<-\EOF &&
970         tagname : signed-tag
971         EOF
972         git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
973         test_cmp expect actual
974 '
975
976 test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
977         >expect &&
978         test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
979         test_cmp expect actual
980 '
981
982 # blank and empty messages for signed tags:
983
984 get_tag_header empty-signed-tag $commit commit $time >expect
985 echo '-----BEGIN PGP SIGNATURE-----' >>expect
986 test_expect_success GPG \
987         'creating a signed tag with an empty -m message should succeed' '
988         git tag -s -m "" empty-signed-tag &&
989         get_tag_msg empty-signed-tag >actual &&
990         test_cmp expect actual &&
991         git tag -v empty-signed-tag
992 '
993
994 >sigemptyfile
995 get_tag_header emptyfile-signed-tag $commit commit $time >expect
996 echo '-----BEGIN PGP SIGNATURE-----' >>expect
997 test_expect_success GPG \
998         'creating a signed tag with an empty -F messagefile should succeed' '
999         git tag -s -F sigemptyfile emptyfile-signed-tag &&
1000         get_tag_msg emptyfile-signed-tag >actual &&
1001         test_cmp expect actual &&
1002         git tag -v emptyfile-signed-tag
1003 '
1004
1005 printf '\n\n  \n\t\nLeading blank lines\n' > sigblanksfile
1006 printf '\n\t \t  \nRepeated blank lines\n' >>sigblanksfile
1007 printf '\n\n\nTrailing spaces      \t  \n' >>sigblanksfile
1008 printf '\nTrailing blank lines\n\n\t \n\n' >>sigblanksfile
1009 get_tag_header blanks-signed-tag $commit commit $time >expect
1010 cat >>expect <<EOF
1011 Leading blank lines
1012
1013 Repeated blank lines
1014
1015 Trailing spaces
1016
1017 Trailing blank lines
1018 EOF
1019 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1020 test_expect_success GPG \
1021         'extra blanks in the message for a signed tag should be removed' '
1022         git tag -s -F sigblanksfile blanks-signed-tag &&
1023         get_tag_msg blanks-signed-tag >actual &&
1024         test_cmp expect actual &&
1025         git tag -v blanks-signed-tag
1026 '
1027
1028 get_tag_header blank-signed-tag $commit commit $time >expect
1029 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1030 test_expect_success GPG \
1031         'creating a signed tag with a blank -m message should succeed' '
1032         git tag -s -m "     " blank-signed-tag &&
1033         get_tag_msg blank-signed-tag >actual &&
1034         test_cmp expect actual &&
1035         git tag -v blank-signed-tag
1036 '
1037
1038 echo '     ' >sigblankfile
1039 echo ''      >>sigblankfile
1040 echo '  '    >>sigblankfile
1041 get_tag_header blankfile-signed-tag $commit commit $time >expect
1042 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1043 test_expect_success GPG \
1044         'creating a signed tag with blank -F file with spaces should succeed' '
1045         git tag -s -F sigblankfile blankfile-signed-tag &&
1046         get_tag_msg blankfile-signed-tag >actual &&
1047         test_cmp expect actual &&
1048         git tag -v blankfile-signed-tag
1049 '
1050
1051 printf '      ' >sigblanknonlfile
1052 get_tag_header blanknonlfile-signed-tag $commit commit $time >expect
1053 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1054 test_expect_success GPG \
1055         'creating a signed tag with spaces and no newline should succeed' '
1056         git tag -s -F sigblanknonlfile blanknonlfile-signed-tag &&
1057         get_tag_msg blanknonlfile-signed-tag >actual &&
1058         test_cmp expect actual &&
1059         git tag -v signed-tag
1060 '
1061
1062 # messages with commented lines for signed tags:
1063
1064 cat >sigcommentsfile <<EOF
1065 # A comment
1066
1067 ############
1068 The message.
1069 ############
1070 One line.
1071
1072
1073 # commented lines
1074 # commented lines
1075
1076 Another line.
1077 # comments
1078
1079 Last line.
1080 EOF
1081 get_tag_header comments-signed-tag $commit commit $time >expect
1082 cat >>expect <<EOF
1083 The message.
1084 One line.
1085
1086 Another line.
1087
1088 Last line.
1089 EOF
1090 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1091 test_expect_success GPG \
1092         'creating a signed tag with a -F file with #comments should succeed' '
1093         git tag -s -F sigcommentsfile comments-signed-tag &&
1094         get_tag_msg comments-signed-tag >actual &&
1095         test_cmp expect actual &&
1096         git tag -v comments-signed-tag
1097 '
1098
1099 get_tag_header comment-signed-tag $commit commit $time >expect
1100 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1101 test_expect_success GPG \
1102         'creating a signed tag with #commented -m message should succeed' '
1103         git tag -s -m "#comment" comment-signed-tag &&
1104         get_tag_msg comment-signed-tag >actual &&
1105         test_cmp expect actual &&
1106         git tag -v comment-signed-tag
1107 '
1108
1109 echo '#comment' >sigcommentfile
1110 echo ''         >>sigcommentfile
1111 echo '####'     >>sigcommentfile
1112 get_tag_header commentfile-signed-tag $commit commit $time >expect
1113 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1114 test_expect_success GPG \
1115         'creating a signed tag with #commented -F messagefile should succeed' '
1116         git tag -s -F sigcommentfile commentfile-signed-tag &&
1117         get_tag_msg commentfile-signed-tag >actual &&
1118         test_cmp expect actual &&
1119         git tag -v commentfile-signed-tag
1120 '
1121
1122 printf '#comment' >sigcommentnonlfile
1123 get_tag_header commentnonlfile-signed-tag $commit commit $time >expect
1124 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1125 test_expect_success GPG \
1126         'creating a signed tag with a #comment and no newline should succeed' '
1127         git tag -s -F sigcommentnonlfile commentnonlfile-signed-tag &&
1128         get_tag_msg commentnonlfile-signed-tag >actual &&
1129         test_cmp expect actual &&
1130         git tag -v commentnonlfile-signed-tag
1131 '
1132
1133 # listing messages for signed tags:
1134
1135 test_expect_success GPG \
1136         'listing the one-line message of a signed tag should succeed' '
1137         git tag -s -m "A message line signed" stag-one-line &&
1138
1139         echo "stag-one-line" >expect &&
1140         git tag -l | grep "^stag-one-line" >actual &&
1141         test_cmp expect actual &&
1142         git tag -n0 -l | grep "^stag-one-line" >actual &&
1143         test_cmp expect actual &&
1144         git tag -n0 -l stag-one-line >actual &&
1145         test_cmp expect actual &&
1146
1147         echo "stag-one-line   A message line signed" >expect &&
1148         git tag -n1 -l | grep "^stag-one-line" >actual &&
1149         test_cmp expect actual &&
1150         git tag -n -l | grep "^stag-one-line" >actual &&
1151         test_cmp expect actual &&
1152         git tag -n1 -l stag-one-line >actual &&
1153         test_cmp expect actual &&
1154         git tag -n2 -l stag-one-line >actual &&
1155         test_cmp expect actual &&
1156         git tag -n999 -l stag-one-line >actual &&
1157         test_cmp expect actual
1158 '
1159
1160 test_expect_success GPG \
1161         'listing the zero-lines message of a signed tag should succeed' '
1162         git tag -s -m "" stag-zero-lines &&
1163
1164         echo "stag-zero-lines" >expect &&
1165         git tag -l | grep "^stag-zero-lines" >actual &&
1166         test_cmp expect actual &&
1167         git tag -n0 -l | grep "^stag-zero-lines" >actual &&
1168         test_cmp expect actual &&
1169         git tag -n0 -l stag-zero-lines >actual &&
1170         test_cmp expect actual &&
1171
1172         echo "stag-zero-lines " >expect &&
1173         git tag -n1 -l | grep "^stag-zero-lines" >actual &&
1174         test_cmp expect actual &&
1175         git tag -n -l | grep "^stag-zero-lines" >actual &&
1176         test_cmp expect actual &&
1177         git tag -n1 -l stag-zero-lines >actual &&
1178         test_cmp expect actual &&
1179         git tag -n2 -l stag-zero-lines >actual &&
1180         test_cmp expect actual &&
1181         git tag -n999 -l stag-zero-lines >actual &&
1182         test_cmp expect actual
1183 '
1184
1185 echo 'stag line one' >sigtagmsg
1186 echo 'stag line two' >>sigtagmsg
1187 echo 'stag line three' >>sigtagmsg
1188 test_expect_success GPG \
1189         'listing many message lines of a signed tag should succeed' '
1190         git tag -s -F sigtagmsg stag-lines &&
1191
1192         echo "stag-lines" >expect &&
1193         git tag -l | grep "^stag-lines" >actual &&
1194         test_cmp expect actual &&
1195         git tag -n0 -l | grep "^stag-lines" >actual &&
1196         test_cmp expect actual &&
1197         git tag -n0 -l stag-lines >actual &&
1198         test_cmp expect actual &&
1199
1200         echo "stag-lines      stag line one" >expect &&
1201         git tag -n1 -l | grep "^stag-lines" >actual &&
1202         test_cmp expect actual &&
1203         git tag -n -l | grep "^stag-lines" >actual &&
1204         test_cmp expect actual &&
1205         git tag -n1 -l stag-lines >actual &&
1206         test_cmp expect actual &&
1207
1208         echo "    stag line two" >>expect &&
1209         git tag -n2 -l | grep "^ *stag.line" >actual &&
1210         test_cmp expect actual &&
1211         git tag -n2 -l stag-lines >actual &&
1212         test_cmp expect actual &&
1213
1214         echo "    stag line three" >>expect &&
1215         git tag -n3 -l | grep "^ *stag.line" >actual &&
1216         test_cmp expect actual &&
1217         git tag -n3 -l stag-lines >actual &&
1218         test_cmp expect actual &&
1219         git tag -n4 -l | grep "^ *stag.line" >actual &&
1220         test_cmp expect actual &&
1221         git tag -n4 -l stag-lines >actual &&
1222         test_cmp expect actual &&
1223         git tag -n99 -l | grep "^ *stag.line" >actual &&
1224         test_cmp expect actual &&
1225         git tag -n99 -l stag-lines >actual &&
1226         test_cmp expect actual
1227 '
1228
1229 # tags pointing to objects different from commits:
1230
1231 tree=$(git rev-parse HEAD^{tree})
1232 blob=$(git rev-parse HEAD:foo)
1233 tag=$(git rev-parse signed-tag 2>/dev/null)
1234
1235 get_tag_header tree-signed-tag $tree tree $time >expect
1236 echo "A message for a tree" >>expect
1237 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1238 test_expect_success GPG \
1239         'creating a signed tag pointing to a tree should succeed' '
1240         git tag -s -m "A message for a tree" tree-signed-tag HEAD^{tree} &&
1241         get_tag_msg tree-signed-tag >actual &&
1242         test_cmp expect actual
1243 '
1244
1245 get_tag_header blob-signed-tag $blob blob $time >expect
1246 echo "A message for a blob" >>expect
1247 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1248 test_expect_success GPG \
1249         'creating a signed tag pointing to a blob should succeed' '
1250         git tag -s -m "A message for a blob" blob-signed-tag HEAD:foo &&
1251         get_tag_msg blob-signed-tag >actual &&
1252         test_cmp expect actual
1253 '
1254
1255 get_tag_header tag-signed-tag $tag tag $time >expect
1256 echo "A message for another tag" >>expect
1257 echo '-----BEGIN PGP SIGNATURE-----' >>expect
1258 test_expect_success GPG \
1259         'creating a signed tag pointing to another tag should succeed' '
1260         git tag -s -m "A message for another tag" tag-signed-tag signed-tag &&
1261         get_tag_msg tag-signed-tag >actual &&
1262         test_cmp expect actual
1263 '
1264
1265 # usage with rfc1991 signatures
1266 get_tag_header rfc1991-signed-tag $commit commit $time >expect
1267 echo "RFC1991 signed tag" >>expect
1268 echo '-----BEGIN PGP MESSAGE-----' >>expect
1269 test_expect_success GPG,RFC1991 \
1270         'creating a signed tag with rfc1991' '
1271         echo "rfc1991" >gpghome/gpg.conf &&
1272         git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit &&
1273         get_tag_msg rfc1991-signed-tag >actual &&
1274         test_cmp expect actual
1275 '
1276
1277 cat >fakeeditor <<'EOF'
1278 #!/bin/sh
1279 cp "$1" actual
1280 EOF
1281 chmod +x fakeeditor
1282
1283 test_expect_success GPG,RFC1991 \
1284         'reediting a signed tag body omits signature' '
1285         echo "rfc1991" >gpghome/gpg.conf &&
1286         echo "RFC1991 signed tag" >expect &&
1287         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1288         test_cmp expect actual
1289 '
1290
1291 test_expect_success GPG,RFC1991 \
1292         'verifying rfc1991 signature' '
1293         echo "rfc1991" >gpghome/gpg.conf &&
1294         git tag -v rfc1991-signed-tag
1295 '
1296
1297 test_expect_success GPG,RFC1991 \
1298         'list tag with rfc1991 signature' '
1299         echo "rfc1991" >gpghome/gpg.conf &&
1300         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1301         git tag -l -n1 rfc1991-signed-tag >actual &&
1302         test_cmp expect actual &&
1303         git tag -l -n2 rfc1991-signed-tag >actual &&
1304         test_cmp expect actual &&
1305         git tag -l -n999 rfc1991-signed-tag >actual &&
1306         test_cmp expect actual
1307 '
1308
1309 rm -f gpghome/gpg.conf
1310
1311 test_expect_success GPG,RFC1991 \
1312         'verifying rfc1991 signature without --rfc1991' '
1313         git tag -v rfc1991-signed-tag
1314 '
1315
1316 test_expect_success GPG,RFC1991 \
1317         'list tag with rfc1991 signature without --rfc1991' '
1318         echo "rfc1991-signed-tag RFC1991 signed tag" >expect &&
1319         git tag -l -n1 rfc1991-signed-tag >actual &&
1320         test_cmp expect actual &&
1321         git tag -l -n2 rfc1991-signed-tag >actual &&
1322         test_cmp expect actual &&
1323         git tag -l -n999 rfc1991-signed-tag >actual &&
1324         test_cmp expect actual
1325 '
1326
1327 test_expect_success GPG,RFC1991 \
1328         'reediting a signed tag body omits signature' '
1329         echo "RFC1991 signed tag" >expect &&
1330         GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit &&
1331         test_cmp expect actual
1332 '
1333
1334 # try to sign with bad user.signingkey
1335 test_expect_success GPG \
1336         'git tag -s fails if gpg is misconfigured (bad key)' \
1337         'test_config user.signingkey BobTheMouse &&
1338         test_must_fail git tag -s -m tail tag-gpg-failure'
1339
1340 # try to produce invalid signature
1341 test_expect_success GPG \
1342         'git tag -s fails if gpg is misconfigured (bad signature format)' \
1343         'test_config gpg.program echo &&
1344          test_must_fail git tag -s -m tail tag-gpg-failure'
1345
1346
1347 # try to verify without gpg:
1348
1349 rm -rf gpghome
1350 test_expect_success GPG \
1351         'verify signed tag fails when public key is not present' \
1352         'test_must_fail git tag -v signed-tag'
1353
1354 test_expect_success \
1355         'git tag -a fails if tag annotation is empty' '
1356         ! (GIT_EDITOR=cat git tag -a initial-comment)
1357 '
1358
1359 test_expect_success \
1360         'message in editor has initial comment' '
1361         ! (GIT_EDITOR=cat git tag -a initial-comment > actual)
1362 '
1363
1364 test_expect_success 'message in editor has initial comment: first line' '
1365         # check the first line --- should be empty
1366         echo >first.expect &&
1367         sed -e 1q <actual >first.actual &&
1368         test_i18ncmp first.expect first.actual
1369 '
1370
1371 test_expect_success \
1372         'message in editor has initial comment: remainder' '
1373         # remove commented lines from the remainder -- should be empty
1374         >rest.expect &&
1375         sed -e 1d -e "/^#/d" <actual >rest.actual &&
1376         test_cmp rest.expect rest.actual
1377 '
1378
1379 get_tag_header reuse $commit commit $time >expect
1380 echo "An annotation to be reused" >> expect
1381 test_expect_success \
1382         'overwriting an annoted tag should use its previous body' '
1383         git tag -a -m "An annotation to be reused" reuse &&
1384         GIT_EDITOR=true git tag -f -a reuse &&
1385         get_tag_msg reuse >actual &&
1386         test_cmp expect actual
1387 '
1388
1389 test_expect_success 'filename for the message is relative to cwd' '
1390         mkdir subdir &&
1391         echo "Tag message in top directory" >msgfile-5 &&
1392         echo "Tag message in sub directory" >subdir/msgfile-5 &&
1393         (
1394                 cd subdir &&
1395                 git tag -a -F msgfile-5 tag-from-subdir
1396         ) &&
1397         git cat-file tag tag-from-subdir | grep "in sub directory"
1398 '
1399
1400 test_expect_success 'filename for the message is relative to cwd' '
1401         echo "Tag message in sub directory" >subdir/msgfile-6 &&
1402         (
1403                 cd subdir &&
1404                 git tag -a -F msgfile-6 tag-from-subdir-2
1405         ) &&
1406         git cat-file tag tag-from-subdir-2 | grep "in sub directory"
1407 '
1408
1409 # create a few more commits to test --contains
1410
1411 hash1=$(git rev-parse HEAD)
1412
1413 test_expect_success 'creating second commit and tag' '
1414         echo foo-2.0 >foo &&
1415         git add foo &&
1416         git commit -m second &&
1417         git tag v2.0
1418 '
1419
1420 hash2=$(git rev-parse HEAD)
1421
1422 test_expect_success 'creating third commit without tag' '
1423         echo foo-dev >foo &&
1424         git add foo &&
1425         git commit -m third
1426 '
1427
1428 hash3=$(git rev-parse HEAD)
1429
1430 # simple linear checks of --continue
1431
1432 cat > expected <<EOF
1433 v0.2.1
1434 v1.0
1435 v1.0.1
1436 v1.1.3
1437 v2.0
1438 EOF
1439
1440 test_expect_success 'checking that first commit is in all tags (hash)' "
1441         git tag -l --contains $hash1 v* >actual &&
1442         test_cmp expected actual
1443 "
1444
1445 # other ways of specifying the commit
1446 test_expect_success 'checking that first commit is in all tags (tag)' "
1447         git tag -l --contains v1.0 v* >actual &&
1448         test_cmp expected actual
1449 "
1450
1451 test_expect_success 'checking that first commit is in all tags (relative)' "
1452         git tag -l --contains HEAD~2 v* >actual &&
1453         test_cmp expected actual
1454 "
1455
1456 # All the --contains tests above, but with --no-contains
1457 test_expect_success 'checking that first commit is not listed in any tag with --no-contains  (hash)' "
1458         >expected &&
1459         git tag -l --no-contains $hash1 v* >actual &&
1460         test_cmp expected actual
1461 "
1462
1463 test_expect_success 'checking that first commit is in all tags (tag)' "
1464         git tag -l --no-contains v1.0 v* >actual &&
1465         test_cmp expected actual
1466 "
1467
1468 test_expect_success 'checking that first commit is in all tags (relative)' "
1469         git tag -l --no-contains HEAD~2 v* >actual &&
1470         test_cmp expected actual
1471 "
1472
1473 cat > expected <<EOF
1474 v2.0
1475 EOF
1476
1477 test_expect_success 'checking that second commit only has one tag' "
1478         git tag -l --contains $hash2 v* >actual &&
1479         test_cmp expected actual
1480 "
1481
1482 cat > expected <<EOF
1483 v0.2.1
1484 v1.0
1485 v1.0.1
1486 v1.1.3
1487 EOF
1488
1489 test_expect_success 'inverse of the last test, with --no-contains' "
1490         git tag -l --no-contains $hash2 v* >actual &&
1491         test_cmp expected actual
1492 "
1493
1494 cat > expected <<EOF
1495 EOF
1496
1497 test_expect_success 'checking that third commit has no tags' "
1498         git tag -l --contains $hash3 v* >actual &&
1499         test_cmp expected actual
1500 "
1501
1502 cat > expected <<EOF
1503 v0.2.1
1504 v1.0
1505 v1.0.1
1506 v1.1.3
1507 v2.0
1508 EOF
1509
1510 test_expect_success 'conversely --no-contains on the third commit lists all tags' "
1511         git tag -l --no-contains $hash3 v* >actual &&
1512         test_cmp expected actual
1513 "
1514
1515 # how about a simple merge?
1516
1517 test_expect_success 'creating simple branch' '
1518         git branch stable v2.0 &&
1519         git checkout stable &&
1520         echo foo-3.0 > foo &&
1521         git commit foo -m fourth &&
1522         git tag v3.0
1523 '
1524
1525 hash4=$(git rev-parse HEAD)
1526
1527 cat > expected <<EOF
1528 v3.0
1529 EOF
1530
1531 test_expect_success 'checking that branch head only has one tag' "
1532         git tag -l --contains $hash4 v* >actual &&
1533         test_cmp expected actual
1534 "
1535
1536 cat > expected <<EOF
1537 v0.2.1
1538 v1.0
1539 v1.0.1
1540 v1.1.3
1541 v2.0
1542 EOF
1543
1544 test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
1545         git tag -l --no-contains $hash4 v* >actual &&
1546         test_cmp expected actual
1547 "
1548
1549 test_expect_success 'merging original branch into this branch' '
1550         git merge --strategy=ours master &&
1551         git tag v4.0
1552 '
1553
1554 cat > expected <<EOF
1555 v4.0
1556 EOF
1557
1558 test_expect_success 'checking that original branch head has one tag now' "
1559         git tag -l --contains $hash3 v* >actual &&
1560         test_cmp expected actual
1561 "
1562
1563 cat > expected <<EOF
1564 v0.2.1
1565 v1.0
1566 v1.0.1
1567 v1.1.3
1568 v2.0
1569 v3.0
1570 EOF
1571
1572 test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
1573         git tag -l --no-contains $hash3 v* >actual &&
1574         test_cmp expected actual
1575 "
1576
1577 cat > expected <<EOF
1578 v0.2.1
1579 v1.0
1580 v1.0.1
1581 v1.1.3
1582 v2.0
1583 v3.0
1584 v4.0
1585 EOF
1586
1587 test_expect_success 'checking that initial commit is in all tags' "
1588         git tag -l --contains $hash1 v* >actual &&
1589         test_cmp expected actual
1590 "
1591
1592 test_expect_success 'checking that --contains can be used in non-list mode' '
1593         git tag --contains $hash1 v* >actual &&
1594         test_cmp expected actual
1595 '
1596
1597 test_expect_success 'checking that initial commit is in all tags with --no-contains' "
1598         >expected &&
1599         git tag -l --no-contains $hash1 v* >actual &&
1600         test_cmp expected actual
1601 "
1602
1603 # mixing modes and options:
1604
1605 test_expect_success 'mixing incompatibles modes and options is forbidden' '
1606         test_must_fail git tag -a &&
1607         test_must_fail git tag -a -l &&
1608         test_must_fail git tag -s &&
1609         test_must_fail git tag -s -l &&
1610         test_must_fail git tag -m &&
1611         test_must_fail git tag -m -l &&
1612         test_must_fail git tag -m "hlagh" &&
1613         test_must_fail git tag -m "hlagh" -l &&
1614         test_must_fail git tag -F &&
1615         test_must_fail git tag -F -l &&
1616         test_must_fail git tag -f &&
1617         test_must_fail git tag -f -l &&
1618         test_must_fail git tag -a -s -m -F &&
1619         test_must_fail git tag -a -s -m -F -l &&
1620         test_must_fail git tag -l -v &&
1621         test_must_fail git tag -l -d &&
1622         test_must_fail git tag -l -v -d &&
1623         test_must_fail git tag -n 100 -v &&
1624         test_must_fail git tag -l -m msg &&
1625         test_must_fail git tag -l -F some file &&
1626         test_must_fail git tag -v -s &&
1627         test_must_fail git tag --contains tag-tree &&
1628         test_must_fail git tag --contains tag-blob &&
1629         test_must_fail git tag --no-contains tag-tree &&
1630         test_must_fail git tag --no-contains tag-blob &&
1631         test_must_fail git tag --contains --no-contains &&
1632         test_must_fail git tag --no-with HEAD &&
1633         test_must_fail git tag --no-without HEAD
1634 '
1635
1636 for option in --contains --with --no-contains --without --merged --no-merged --points-at
1637 do
1638         test_expect_success "mixing incompatible modes with $option is forbidden" "
1639                 test_must_fail git tag -d $option HEAD &&
1640                 test_must_fail git tag -d $option HEAD some-tag &&
1641                 test_must_fail git tag -v $option HEAD
1642         "
1643         test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
1644                 git tag -n $option HEAD HEAD &&
1645                 git tag $option HEAD HEAD &&
1646                 git tag $option
1647         "
1648 done
1649
1650 # check points-at
1651
1652 test_expect_success '--points-at can be used in non-list mode' '
1653         echo v4.0 >expect &&
1654         git tag --points-at=v4.0 "v*" >actual &&
1655         test_cmp expect actual
1656 '
1657
1658 test_expect_success '--points-at is a synonym for --points-at HEAD' '
1659         echo v4.0 >expect &&
1660         git tag --points-at >actual &&
1661         test_cmp expect actual
1662 '
1663
1664 test_expect_success '--points-at finds lightweight tags' '
1665         echo v4.0 >expect &&
1666         git tag --points-at v4.0 >actual &&
1667         test_cmp expect actual
1668 '
1669
1670 test_expect_success '--points-at finds annotated tags of commits' '
1671         git tag -m "v4.0, annotated" annotated-v4.0 v4.0 &&
1672         echo annotated-v4.0 >expect &&
1673         git tag -l --points-at v4.0 "annotated*" >actual &&
1674         test_cmp expect actual
1675 '
1676
1677 test_expect_success '--points-at finds annotated tags of tags' '
1678         git tag -m "describing the v4.0 tag object" \
1679                 annotated-again-v4.0 annotated-v4.0 &&
1680         cat >expect <<-\EOF &&
1681         annotated-again-v4.0
1682         annotated-v4.0
1683         EOF
1684         git tag --points-at=annotated-v4.0 >actual &&
1685         test_cmp expect actual
1686 '
1687
1688 test_expect_success 'multiple --points-at are OR-ed together' '
1689         cat >expect <<-\EOF &&
1690         v2.0
1691         v3.0
1692         EOF
1693         git tag --points-at=v2.0 --points-at=v3.0 >actual &&
1694         test_cmp expect actual
1695 '
1696
1697 test_expect_success 'lexical sort' '
1698         git tag foo1.3 &&
1699         git tag foo1.6 &&
1700         git tag foo1.10 &&
1701         git tag -l --sort=refname "foo*" >actual &&
1702         cat >expect <<-\EOF &&
1703         foo1.10
1704         foo1.3
1705         foo1.6
1706         EOF
1707         test_cmp expect actual
1708 '
1709
1710 test_expect_success 'version sort' '
1711         git tag -l --sort=version:refname "foo*" >actual &&
1712         cat >expect <<-\EOF &&
1713         foo1.3
1714         foo1.6
1715         foo1.10
1716         EOF
1717         test_cmp expect actual
1718 '
1719
1720 test_expect_success 'reverse version sort' '
1721         git tag -l --sort=-version:refname "foo*" >actual &&
1722         cat >expect <<-\EOF &&
1723         foo1.10
1724         foo1.6
1725         foo1.3
1726         EOF
1727         test_cmp expect actual
1728 '
1729
1730 test_expect_success 'reverse lexical sort' '
1731         git tag -l --sort=-refname "foo*" >actual &&
1732         cat >expect <<-\EOF &&
1733         foo1.6
1734         foo1.3
1735         foo1.10
1736         EOF
1737         test_cmp expect actual
1738 '
1739
1740 test_expect_success 'configured lexical sort' '
1741         test_config tag.sort "v:refname" &&
1742         git tag -l "foo*" >actual &&
1743         cat >expect <<-\EOF &&
1744         foo1.3
1745         foo1.6
1746         foo1.10
1747         EOF
1748         test_cmp expect actual
1749 '
1750
1751 test_expect_success 'option override configured sort' '
1752         test_config tag.sort "v:refname" &&
1753         git tag -l --sort=-refname "foo*" >actual &&
1754         cat >expect <<-\EOF &&
1755         foo1.6
1756         foo1.3
1757         foo1.10
1758         EOF
1759         test_cmp expect actual
1760 '
1761
1762 test_expect_success 'invalid sort parameter on command line' '
1763         test_must_fail git tag -l --sort=notvalid "foo*" >actual
1764 '
1765
1766 test_expect_success 'invalid sort parameter in configuratoin' '
1767         test_config tag.sort "v:notvalid" &&
1768         test_must_fail git tag -l "foo*"
1769 '
1770
1771 test_expect_success 'version sort with prerelease reordering' '
1772         test_config versionsort.prereleaseSuffix -rc &&
1773         git tag foo1.6-rc1 &&
1774         git tag foo1.6-rc2 &&
1775         git tag -l --sort=version:refname "foo*" >actual &&
1776         cat >expect <<-\EOF &&
1777         foo1.3
1778         foo1.6-rc1
1779         foo1.6-rc2
1780         foo1.6
1781         foo1.10
1782         EOF
1783         test_cmp expect actual
1784 '
1785
1786 test_expect_success 'reverse version sort with prerelease reordering' '
1787         test_config versionsort.prereleaseSuffix -rc &&
1788         git tag -l --sort=-version:refname "foo*" >actual &&
1789         cat >expect <<-\EOF &&
1790         foo1.10
1791         foo1.6
1792         foo1.6-rc2
1793         foo1.6-rc1
1794         foo1.3
1795         EOF
1796         test_cmp expect actual
1797 '
1798
1799 test_expect_success 'version sort with prerelease reordering and common leading character' '
1800         test_config versionsort.prereleaseSuffix -before &&
1801         git tag foo1.7-before1 &&
1802         git tag foo1.7 &&
1803         git tag foo1.7-after1 &&
1804         git tag -l --sort=version:refname "foo1.7*" >actual &&
1805         cat >expect <<-\EOF &&
1806         foo1.7-before1
1807         foo1.7
1808         foo1.7-after1
1809         EOF
1810         test_cmp expect actual
1811 '
1812
1813 test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
1814         test_config versionsort.prereleaseSuffix -before &&
1815         git config --add versionsort.prereleaseSuffix -after &&
1816         git tag -l --sort=version:refname "foo1.7*" >actual &&
1817         cat >expect <<-\EOF &&
1818         foo1.7-before1
1819         foo1.7-after1
1820         foo1.7
1821         EOF
1822         test_cmp expect actual
1823 '
1824
1825 test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
1826         test_config versionsort.prereleaseSuffix -bar &&
1827         git config --add versionsort.prereleaseSuffix -foo-baz &&
1828         git config --add versionsort.prereleaseSuffix -foo-bar &&
1829         git tag foo1.8-foo-bar &&
1830         git tag foo1.8-foo-baz &&
1831         git tag foo1.8 &&
1832         git tag -l --sort=version:refname "foo1.8*" >actual &&
1833         cat >expect <<-\EOF &&
1834         foo1.8-foo-baz
1835         foo1.8-foo-bar
1836         foo1.8
1837         EOF
1838         test_cmp expect actual
1839 '
1840
1841 test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
1842         test_config versionsort.prereleaseSuffix -pre &&
1843         git config --add versionsort.prereleaseSuffix -prerelease &&
1844         git tag foo1.9-pre1 &&
1845         git tag foo1.9-pre2 &&
1846         git tag foo1.9-prerelease1 &&
1847         git tag -l --sort=version:refname "foo1.9*" >actual &&
1848         cat >expect <<-\EOF &&
1849         foo1.9-pre1
1850         foo1.9-pre2
1851         foo1.9-prerelease1
1852         EOF
1853         test_cmp expect actual
1854 '
1855
1856 test_expect_success 'version sort with general suffix reordering' '
1857         test_config versionsort.suffix -alpha &&
1858         git config --add versionsort.suffix -beta &&
1859         git config --add versionsort.suffix ""  &&
1860         git config --add versionsort.suffix -gamma &&
1861         git config --add versionsort.suffix -delta &&
1862         git tag foo1.10-alpha &&
1863         git tag foo1.10-beta &&
1864         git tag foo1.10-gamma &&
1865         git tag foo1.10-delta &&
1866         git tag foo1.10-unlisted-suffix &&
1867         git tag -l --sort=version:refname "foo1.10*" >actual &&
1868         cat >expect <<-\EOF &&
1869         foo1.10-alpha
1870         foo1.10-beta
1871         foo1.10
1872         foo1.10-unlisted-suffix
1873         foo1.10-gamma
1874         foo1.10-delta
1875         EOF
1876         test_cmp expect actual
1877 '
1878
1879 test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
1880         test_config versionsort.suffix -before &&
1881         test_config versionsort.prereleaseSuffix -after &&
1882         git tag -l --sort=version:refname "foo1.7*" >actual &&
1883         cat >expect <<-\EOF &&
1884         foo1.7-before1
1885         foo1.7
1886         foo1.7-after1
1887         EOF
1888         test_cmp expect actual
1889 '
1890
1891 test_expect_success 'version sort with very long prerelease suffix' '
1892         test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
1893         git tag -l --sort=version:refname
1894 '
1895
1896 test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
1897         >expect &&
1898         i=1 &&
1899         while test $i -lt 8000
1900         do
1901                 echo "commit refs/heads/master
1902 committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
1903 data <<EOF
1904 commit #$i
1905 EOF"
1906                 test $i = 1 && echo "from refs/heads/master^0"
1907                 i=$(($i + 1))
1908         done | git fast-import &&
1909         git checkout master &&
1910         git tag far-far-away HEAD^ &&
1911         run_with_limited_stack git tag --contains HEAD >actual &&
1912         test_cmp expect actual &&
1913         run_with_limited_stack git tag --no-contains HEAD >actual &&
1914         test_line_count "-gt" 10 actual
1915 '
1916
1917 test_expect_success '--format should list tags as per format given' '
1918         cat >expect <<-\EOF &&
1919         refname : refs/tags/v1.0
1920         refname : refs/tags/v1.0.1
1921         refname : refs/tags/v1.1.3
1922         EOF
1923         git tag -l --format="refname : %(refname)" "v1*" >actual &&
1924         test_cmp expect actual
1925 '
1926
1927 test_expect_success "set up color tests" '
1928         echo "<RED>v1.0<RESET>" >expect.color &&
1929         echo "v1.0" >expect.bare &&
1930         color_args="--format=%(color:red)%(refname:short) --list v1.0"
1931 '
1932
1933 test_expect_success '%(color) omitted without tty' '
1934         TERM=vt100 git tag $color_args >actual.raw &&
1935         test_decode_color <actual.raw >actual &&
1936         test_cmp expect.bare actual
1937 '
1938
1939 test_expect_success TTY '%(color) present with tty' '
1940         test_terminal git tag $color_args >actual.raw &&
1941         test_decode_color <actual.raw >actual &&
1942         test_cmp expect.color actual
1943 '
1944
1945 test_expect_success '--color overrides auto-color' '
1946         git tag --color $color_args >actual.raw &&
1947         test_decode_color <actual.raw >actual &&
1948         test_cmp expect.color actual
1949 '
1950
1951 test_expect_success 'color.ui=always overrides auto-color' '
1952         git -c color.ui=always tag $color_args >actual.raw &&
1953         test_decode_color <actual.raw >actual &&
1954         test_cmp expect.color actual
1955 '
1956
1957 test_expect_success 'setup --merged test tags' '
1958         git tag mergetest-1 HEAD~2 &&
1959         git tag mergetest-2 HEAD~1 &&
1960         git tag mergetest-3 HEAD
1961 '
1962
1963 test_expect_success '--merged can be used in non-list mode' '
1964         cat >expect <<-\EOF &&
1965         mergetest-1
1966         mergetest-2
1967         EOF
1968         git tag --merged=mergetest-2 "mergetest*" >actual &&
1969         test_cmp expect actual
1970 '
1971
1972 test_expect_success '--merged is incompatible with --no-merged' '
1973         test_must_fail git tag --merged HEAD --no-merged HEAD
1974 '
1975
1976 test_expect_success '--merged shows merged tags' '
1977         cat >expect <<-\EOF &&
1978         mergetest-1
1979         mergetest-2
1980         EOF
1981         git tag -l --merged=mergetest-2 mergetest-* >actual &&
1982         test_cmp expect actual
1983 '
1984
1985 test_expect_success '--no-merged show unmerged tags' '
1986         cat >expect <<-\EOF &&
1987         mergetest-3
1988         EOF
1989         git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
1990         test_cmp expect actual
1991 '
1992
1993 test_expect_success '--no-merged can be used in non-list mode' '
1994         git tag --no-merged=mergetest-2 mergetest-* >actual &&
1995         test_cmp expect actual
1996 '
1997
1998 test_expect_success 'ambiguous branch/tags not marked' '
1999         git tag ambiguous &&
2000         git branch ambiguous &&
2001         echo ambiguous >expect &&
2002         git tag -l ambiguous >actual &&
2003         test_cmp expect actual
2004 '
2005
2006 test_expect_success '--contains combined with --no-contains' '
2007         (
2008                 git init no-contains &&
2009                 cd no-contains &&
2010                 test_commit v0.1 &&
2011                 test_commit v0.2 &&
2012                 test_commit v0.3 &&
2013                 test_commit v0.4 &&
2014                 test_commit v0.5 &&
2015                 cat >expected <<-\EOF &&
2016                 v0.2
2017                 v0.3
2018                 v0.4
2019                 EOF
2020                 git tag --contains v0.2 --no-contains v0.5 >actual &&
2021                 test_cmp expected actual
2022         )
2023 '
2024
2025 # As the docs say, list tags which contain a specified *commit*. We
2026 # don't recurse down to tags for trees or blobs pointed to by *those*
2027 # commits.
2028 test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
2029         cd no-contains &&
2030         blob=$(git rev-parse v0.3:v0.3.t) &&
2031         tree=$(git rev-parse v0.3^{tree}) &&
2032         git tag tag-blob $blob &&
2033         git tag tag-tree $tree &&
2034         git tag --contains v0.3 >actual &&
2035         cat >expected <<-\EOF &&
2036         v0.3
2037         v0.4
2038         v0.5
2039         EOF
2040         test_cmp expected actual &&
2041         git tag --no-contains v0.3 >actual &&
2042         cat >expected <<-\EOF &&
2043         v0.1
2044         v0.2
2045         EOF
2046         test_cmp expected actual
2047 '
2048
2049 test_done