3 test_description
='git log'
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
9 .
"$TEST_DIRECTORY/lib-gpg.sh"
10 .
"$TEST_DIRECTORY/lib-terminal.sh"
11 .
"$TEST_DIRECTORY/lib-log-graph.sh"
14 lib_test_cmp_graph
--format=%s
"$@"
17 test_expect_success setup
'
22 git commit -m initial &&
27 git commit -m second &&
31 git commit -m third &&
36 git commit -m fourth &&
42 git commit -m fifth &&
50 printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
51 test_expect_success
'pretty' '
53 git log --pretty="format:%s" > actual &&
54 test_cmp expect actual
57 printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
58 test_expect_success
'pretty (tformat)' '
60 git log --pretty="tformat:%s" > actual &&
61 test_cmp expect actual
64 test_expect_success
'pretty (shortcut)' '
66 git log --pretty="%s" > actual &&
67 test_cmp expect actual
70 test_expect_success
'format' '
72 git log --format="%s" > actual &&
73 test_cmp expect actual
85 test_expect_success
'format %w(11,1,2)' '
87 git log -2 --format="%w(11,1,2)This is the %s commit." > actual &&
88 test_cmp expect actual
91 test_expect_success
'format %w(,1,2)' '
93 git log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&
94 test_cmp expect actual
98 $(git rev-parse --short :/sixth ) sixth
99 $(git rev-parse --short :/fifth ) fifth
100 $(git rev-parse --short :/fourth ) fourth
101 $(git rev-parse --short :/third ) third
102 $(git rev-parse --short :/second ) second
103 $(git rev-parse --short :/initial) initial
105 test_expect_success
'oneline' '
107 git log --oneline > actual &&
108 test_cmp expect actual
111 test_expect_success
'diff-filter=A' '
113 git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
114 git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
115 printf "fifth\nfourth\nthird\ninitial" > expect &&
116 test_cmp expect actual &&
117 test_cmp expect actual-separate
121 test_expect_success
'diff-filter=M' '
123 git log --pretty="format:%s" --diff-filter=M HEAD >actual &&
124 printf "second" >expect &&
125 test_cmp expect actual
129 test_expect_success
'diff-filter=D' '
131 git log --no-renames --pretty="format:%s" --diff-filter=D HEAD >actual &&
132 printf "sixth\nthird" >expect &&
133 test_cmp expect actual
137 test_expect_success
'diff-filter=R' '
139 git log -M --pretty="format:%s" --diff-filter=R HEAD >actual &&
140 printf "third" >expect &&
141 test_cmp expect actual
145 test_expect_success
'multiple --diff-filter bits' '
147 git log -M --pretty="format:%s" --diff-filter=R HEAD >expect &&
148 git log -M --pretty="format:%s" --diff-filter=Ra HEAD >actual &&
149 test_cmp expect actual &&
150 git log -M --pretty="format:%s" --diff-filter=aR HEAD >actual &&
151 test_cmp expect actual &&
152 git log -M --pretty="format:%s" \
153 --diff-filter=a --diff-filter=R HEAD >actual &&
154 test_cmp expect actual
158 test_expect_success
'diff-filter=C' '
160 git log -C -C --pretty="format:%s" --diff-filter=C HEAD >actual &&
161 printf "fourth" >expect &&
162 test_cmp expect actual
166 test_expect_success
'git log --follow' '
168 git log --follow --pretty="format:%s" ichi >actual &&
169 printf "third\nsecond\ninitial" >expect &&
170 test_cmp expect actual
173 test_expect_success
'git config log.follow works like --follow' '
174 test_config log.follow true &&
175 git log --pretty="format:%s" ichi >actual &&
176 printf "third\nsecond\ninitial" >expect &&
177 test_cmp expect actual
180 test_expect_success
'git config log.follow does not die with multiple paths' '
181 test_config log.follow true &&
182 git log --pretty="format:%s" ichi ein
185 test_expect_success
'git config log.follow does not die with no paths' '
186 test_config log.follow true &&
190 test_expect_success
'git log --follow rejects unsupported pathspec magic' '
191 test_must_fail git log --follow ":(top,glob,icase)ichi" 2>stderr &&
192 # check full error message; we want to be sure we mention both
193 # of the rejected types (glob,icase), but not the allowed one (top)
194 echo "fatal: pathspec magic not supported by --follow: ${SQ}glob${SQ}, ${SQ}icase${SQ}" >expect &&
195 test_cmp expect stderr
198 test_expect_success
'log.follow disabled with unsupported pathspec magic' '
199 test_config log.follow true &&
200 git log --format=%s ":(glob,icase)ichi" >actual &&
201 echo third >expect &&
202 test_cmp expect actual
205 test_expect_success
'git config log.follow is overridden by --no-follow' '
206 test_config log.follow true &&
207 git log --no-follow --pretty="format:%s" ichi >actual &&
208 printf "third" >expect &&
209 test_cmp expect actual
212 # Note that these commits are intentionally listed out of order.
213 last_three
="$(git rev-parse :/fourth :/sixth :/fifth)"
215 $(git rev-parse --short :/sixth ) sixth
216 $(git rev-parse --short :/fifth ) fifth
217 $(git rev-parse --short :/fourth) fourth
219 test_expect_success
'git log --no-walk <commits> sorts by commit time' '
220 git log --no-walk --oneline $last_three > actual &&
221 test_cmp expect actual
224 test_expect_success
'git log --no-walk=sorted <commits> sorts by commit time' '
225 git log --no-walk=sorted --oneline $last_three > actual &&
226 test_cmp expect actual
230 === $(git rev-parse --short :/sixth ) sixth
231 === $(git rev-parse --short :/fifth ) fifth
232 === $(git rev-parse --short :/fourth) fourth
234 test_expect_success
'git log --line-prefix="=== " --no-walk <commits> sorts by commit time' '
235 git log --line-prefix="=== " --no-walk --oneline $last_three > actual &&
236 test_cmp expect actual
240 $(git rev-parse --short :/fourth) fourth
241 $(git rev-parse --short :/sixth ) sixth
242 $(git rev-parse --short :/fifth ) fifth
244 test_expect_success
'git log --no-walk=unsorted <commits> leaves list of commits as given' '
245 git log --no-walk=unsorted --oneline $last_three > actual &&
246 test_cmp expect actual
249 test_expect_success
'git show <commits> leaves list of commits as given' '
250 git show --oneline -s $last_three > actual &&
251 test_cmp expect actual
254 test_expect_success
'setup case sensitivity tests' '
258 git commit -a -m Second
261 test_expect_success
'log --grep' '
262 echo second >expect &&
263 git log -1 --pretty="tformat:%s" --grep=sec >actual &&
264 test_cmp expect actual
267 for noop_opt
in --invert-grep --all-match
269 test_expect_success
"log $noop_opt without --grep is a NOOP" '
271 git log $noop_opt >actual &&
272 test_cmp expect actual
280 test_expect_success
'log --invert-grep --grep' '
282 git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&
283 test_cmp expect actual &&
286 git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
287 test_cmp expect actual &&
290 git -c grep.patternType=extended log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
291 test_cmp expect actual &&
294 if test_have_prereq PCRE
296 git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
297 test_cmp expect actual
301 test_expect_success
'log --invert-grep --grep -i' '
302 echo initial >expect &&
305 git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&
306 test_cmp expect actual &&
309 git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
310 test_cmp expect actual &&
313 git -c grep.patternType=extended log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
314 test_cmp expect actual &&
317 if test_have_prereq PCRE
319 git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
320 test_cmp expect actual
324 test_expect_success
'log --grep option parsing' '
325 echo second >expect &&
326 git log -1 --pretty="tformat:%s" --grep sec >actual &&
327 test_cmp expect actual &&
328 test_must_fail git log -1 --pretty="tformat:%s" --grep
331 test_expect_success
'log -i --grep' '
332 echo Second >expect &&
333 git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&
334 test_cmp expect actual
337 test_expect_success
'log --grep -i' '
338 echo Second >expect &&
341 git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
342 test_cmp expect actual &&
345 git -c grep.patternType=basic log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
346 test_cmp expect actual &&
349 git -c grep.patternType=extended log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
350 test_cmp expect actual &&
353 if test_have_prereq PCRE
355 git -c grep.patternType=perl log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
356 test_cmp expect actual
360 test_expect_success
'log -F -E --grep=<ere> uses ere' '
361 echo second >expect &&
362 # basic would need \(s\) to do the same
363 git log -1 --pretty="tformat:%s" -F -E --grep="(s).c.nd" >actual &&
364 test_cmp expect actual
367 test_expect_success PCRE
'log -F -E --perl-regexp --grep=<pcre> uses PCRE' '
368 test_when_finished "rm -rf num_commits" &&
369 git init num_commits &&
376 # In PCRE \d in [\d] is like saying "0-9", and matches the 2
379 git -C num_commits log -1 --pretty="tformat:%s" -F -E --perl-regexp --grep="[\d]" >actual &&
380 test_cmp expect actual &&
382 # ...in POSIX basic and extended it is the same as [d],
383 # i.e. "d", which matches 1d, but does not match 2e.
385 git -C num_commits log -1 --pretty="tformat:%s" -F -E --grep="[\d]" >actual &&
386 test_cmp expect actual
389 test_expect_success
'log with grep.patternType configuration' '
390 git -c grep.patterntype=fixed \
391 log -1 --pretty=tformat:%s --grep=s.c.nd >actual &&
392 test_must_be_empty actual
395 test_expect_success
'log with grep.patternType configuration and command line' '
396 echo second >expect &&
397 git -c grep.patterntype=fixed \
398 log -1 --pretty=tformat:%s --basic-regexp --grep=s.c.nd >actual &&
399 test_cmp expect actual
402 test_expect_success
!FAIL_PREREQS
'log with various grep.patternType configurations & command-lines' '
403 git init pattern-type &&
406 test_commit 1 file A &&
408 # The tagname is overridden here because creating a
409 # tag called "(1|2)" as test_commit would otherwise
410 # implicitly do would fail on e.g. MINGW.
411 test_commit "(1|2)" file B 2 &&
413 echo "(1|2)" >expect.fixed &&
414 cp expect.fixed expect.basic &&
415 cp expect.fixed expect.extended &&
416 cp expect.fixed expect.perl &&
418 # A strcmp-like match with fixed.
419 git -c grep.patternType=fixed log --pretty=tformat:%s \
420 --grep="(1|2)" >actual.fixed &&
422 # POSIX basic matches (, | and ) literally.
423 git -c grep.patternType=basic log --pretty=tformat:%s \
424 --grep="(.|.)" >actual.basic &&
426 # POSIX extended needs to have | escaped to match it
427 # literally, whereas under basic this is the same as
428 # (|2), i.e. it would also match "1". This test checks
429 # for extended by asserting that it is not matching
430 # what basic would match.
431 git -c grep.patternType=extended log --pretty=tformat:%s \
432 --grep="\|2" >actual.extended &&
433 if test_have_prereq PCRE
435 # Only PCRE would match [\d]\| with only
436 # "(1|2)" due to [\d]. POSIX basic would match
437 # both it and "1" since similarly to the
438 # extended match above it is the same as
439 # \([\d]\|\). POSIX extended would
441 git -c grep.patternType=perl log --pretty=tformat:%s \
442 --grep="[\d]\|" >actual.perl &&
443 test_cmp expect.perl actual.perl
445 test_cmp expect.fixed actual.fixed &&
446 test_cmp expect.basic actual.basic &&
447 test_cmp expect.extended actual.extended &&
449 git log --pretty=tformat:%s -F \
450 --grep="(1|2)" >actual.fixed.short-arg &&
451 git log --pretty=tformat:%s -E \
452 --grep="\|2" >actual.extended.short-arg &&
453 if test_have_prereq PCRE
455 git log --pretty=tformat:%s -P \
456 --grep="[\d]\|" >actual.perl.short-arg
458 test_must_fail git log -P \
461 test_cmp expect.fixed actual.fixed.short-arg &&
462 test_cmp expect.extended actual.extended.short-arg &&
463 if test_have_prereq PCRE
465 test_cmp expect.perl actual.perl.short-arg
468 git log --pretty=tformat:%s --fixed-strings \
469 --grep="(1|2)" >actual.fixed.long-arg &&
470 git log --pretty=tformat:%s --basic-regexp \
471 --grep="(.|.)" >actual.basic.long-arg &&
472 git log --pretty=tformat:%s --extended-regexp \
473 --grep="\|2" >actual.extended.long-arg &&
474 if test_have_prereq PCRE
476 git log --pretty=tformat:%s --perl-regexp \
477 --grep="[\d]\|" >actual.perl.long-arg &&
478 test_cmp expect.perl actual.perl.long-arg
480 test_must_fail git log --perl-regexp \
483 test_cmp expect.fixed actual.fixed.long-arg &&
484 test_cmp expect.basic actual.basic.long-arg &&
485 test_cmp expect.extended actual.extended.long-arg
489 for cmd
in show whatchanged reflog format-patch
492 format-patch
) myarg
="HEAD~.." ;;
496 test_expect_success
"$cmd: understands grep.patternType, like 'log'" '
497 git init "pattern-type-$cmd" &&
499 cd "pattern-type-$cmd" &&
500 test_commit 1 file A &&
501 test_commit "(1|2)" file B 2 &&
503 git -c grep.patternType=fixed $cmd --grep="..." $myarg >actual &&
504 test_must_be_empty actual &&
506 git -c grep.patternType=basic $cmd --grep="..." $myarg >actual &&
507 test_file_not_empty actual
512 test_expect_success
'log --author' '
513 cat >expect <<-\EOF &&
514 Author: <BOLD;RED>A U<RESET> Thor <author@example.com>
516 git log -1 --color=always --author="A U" >log &&
517 grep Author log >actual.raw &&
518 test_decode_color <actual.raw >actual &&
519 test_cmp expect actual
522 test_expect_success
'log --committer' '
523 cat >expect <<-\EOF &&
524 Commit: C O Mitter <committer@<BOLD;RED>example<RESET>.com>
526 git log -1 --color=always --pretty=fuller --committer="example" >log &&
527 grep "Commit:" log >actual.raw &&
528 test_decode_color <actual.raw >actual &&
529 test_cmp expect actual
532 test_expect_success
'log -i --grep with color' '
533 cat >expect <<-\EOF &&
534 <BOLD;RED>Sec<RESET>ond
535 <BOLD;RED>sec<RESET>ond
537 git log --color=always -i --grep=^sec >log &&
538 grep -i sec log >actual.raw &&
539 test_decode_color <actual.raw >actual &&
540 test_cmp expect actual
543 test_expect_success
'-c color.grep.selected log --grep' '
544 cat >expect <<-\EOF &&
545 <GREEN>th<RESET><BOLD;RED>ir<RESET><GREEN>d<RESET>
547 git -c color.grep.selected="green" log --color=always --grep=ir >log &&
548 grep ir log >actual.raw &&
549 test_decode_color <actual.raw >actual &&
550 test_cmp expect actual
553 test_expect_success
'-c color.grep.matchSelected log --grep' '
554 cat >expect <<-\EOF &&
555 <BLUE>i<RESET>n<BLUE>i<RESET>t<BLUE>i<RESET>al
557 git -c color.grep.matchSelected="blue" log --color=always --grep=i >log &&
558 grep al log >actual.raw &&
559 test_decode_color <actual.raw >actual &&
560 test_cmp expect actual
573 test_expect_success
'simple log --graph' '
587 test_expect_success
'simple log --graph --line-prefix="123 "' '
588 test_cmp_graph --line-prefix="123 "
591 test_expect_success
'set up merge history' '
592 git checkout -b side HEAD~4 &&
593 test_commit side-1 1 1 &&
594 test_commit side-2 2 2 &&
600 * Merge branch
'side'
614 test_expect_success
'log --graph with merge' '
615 test_cmp_graph --date-order
619 | | |
* Merge branch
'side'
633 test_expect_success
'log --graph --line-prefix="| | | " with merge' '
634 test_cmp_graph --line-prefix="| | | " --date-order
637 cat > expect.colors
<<\EOF
638 * Merge branch
'side'
639 <BLUE
>|
<RESET
><CYAN
>\
<RESET
>
640 <BLUE
>|
<RESET
> * side-2
641 <BLUE
>|
<RESET
> * side-1
642 * <CYAN
>|
<RESET
> Second
643 * <CYAN
>|
<RESET
> sixth
644 * <CYAN
>|
<RESET
> fifth
645 * <CYAN
>|
<RESET
> fourth
646 <CYAN
>|
<RESET
><CYAN
>/<RESET
>
652 test_expect_success
'log --graph with merge with log.graphColors' '
653 test_config log.graphColors " blue,invalid-color, cyan, red , " &&
654 lib_test_cmp_colored_graph --date-order --format=%s
657 test_expect_success
'log --raw --graph -m with merge' '
658 git log --raw --graph --oneline -m main | head -n 500 >actual &&
659 grep "initial" actual
662 test_expect_success
'diff-tree --graph' '
663 git diff-tree --graph main^ | head -n 500 >actual &&
670 | | Author
: A U Thor
<author@example.com
>
672 | | Merge branch
'side'
674 |
* commit tags
/side-2
675 | | Author
: A U Thor
<author@example.com
>
679 |
* commit tags
/side-1
680 | | Author
: A U Thor
<author@example.com
>
685 | | Author
: A U Thor
<author@example.com
>
690 | | Author
: A U Thor
<author@example.com
>
695 | | Author
: A U Thor
<author@example.com
>
700 |
/ Author
: A U Thor
<author@example.com
>
704 * commit tags
/side-1~
1
705 | Author
: A U Thor
<author@example.com
>
709 * commit tags
/side-1~
2
710 | Author
: A U Thor
<author@example.com
>
714 * commit tags
/side-1~
3
715 Author
: A U Thor
<author@example.com
>
720 test_expect_success
'log --graph with full output' '
721 git log --graph --date-order --pretty=short |
722 git name-rev --name-only --annotate-stdin |
723 sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual &&
724 test_cmp expect actual
727 test_expect_success
'set up more tangled history' '
728 git checkout -b tangle HEAD~6 &&
729 test_commit tangle-a tangle-a a &&
731 git update-ref refs/prefetch/merge HEAD &&
733 git update-ref refs/rewritten/merge HEAD &&
736 git update-ref refs/hidden/tangle HEAD &&
737 git checkout -b reach &&
740 git checkout -b octopus-a &&
741 test_commit octopus-a &&
743 git checkout -b octopus-b &&
744 test_commit octopus-b &&
746 test_commit seventh &&
747 git merge octopus-a octopus-b &&
756 *-. \ Merge tags
'octopus-a' and
'octopus-b'
766 * Merge branch
'tangle'
768 |
* Merge branch
'side' (early part
) into tangle
770 |
* \ Merge branch
'main' (early part
) into tangle
773 * | | | Merge branch
'side'
792 test_expect_success
'log --graph with merge' '
793 test_cmp_graph --date-order
796 test_expect_success
'log.decorate configuration' '
797 git log --oneline --no-decorate >expect.none &&
798 git log --oneline --decorate >expect.short &&
799 git log --oneline --decorate=full >expect.full &&
801 echo "[log] decorate" >>.git/config &&
802 git log --oneline >actual &&
803 test_cmp expect.short actual &&
805 test_config log.decorate true &&
806 git log --oneline >actual &&
807 test_cmp expect.short actual &&
808 git log --oneline --decorate=full >actual &&
809 test_cmp expect.full actual &&
810 git log --oneline --decorate=no >actual &&
811 test_cmp expect.none actual &&
813 test_config log.decorate no &&
814 git log --oneline >actual &&
815 test_cmp expect.none actual &&
816 git log --oneline --decorate >actual &&
817 test_cmp expect.short actual &&
818 git log --oneline --decorate=full >actual &&
819 test_cmp expect.full actual &&
821 test_config log.decorate 1 &&
822 git log --oneline >actual &&
823 test_cmp expect.short actual &&
824 git log --oneline --decorate=full >actual &&
825 test_cmp expect.full actual &&
826 git log --oneline --decorate=no >actual &&
827 test_cmp expect.none actual &&
829 test_config log.decorate short &&
830 git log --oneline >actual &&
831 test_cmp expect.short actual &&
832 git log --oneline --no-decorate >actual &&
833 test_cmp expect.none actual &&
834 git log --oneline --decorate=full >actual &&
835 test_cmp expect.full actual &&
837 test_config log.decorate full &&
838 git log --oneline >actual &&
839 test_cmp expect.full actual &&
840 git log --oneline --no-decorate >actual &&
841 test_cmp expect.none actual &&
842 git log --oneline --decorate >actual &&
843 test_cmp expect.short actual &&
845 test_unconfig log.decorate &&
846 git log --pretty=raw >expect.raw &&
847 test_config log.decorate full &&
848 git log --pretty=raw >actual &&
849 test_cmp expect.raw actual
853 test_expect_success
'parse log.excludeDecoration with no value' '
854 cp .git/config .git/config.orig &&
855 test_when_finished mv .git/config.orig .git/config &&
857 cat >>.git/config <<-\EOF &&
861 cat >expect <<-\EOF &&
862 error: missing value for '\''log.excludeDecoration'\''
864 git log --decorate=short 2>actual &&
865 test_cmp expect actual
868 test_expect_success
'decorate-refs with glob' '
869 cat >expect.decorate <<-\EOF &&
871 Merge-tags-octopus-a-and-octopus-b
873 octopus-b (octopus-b)
874 octopus-a (octopus-a)
877 cat >expect.no-decorate <<-\EOF &&
879 Merge-tags-octopus-a-and-octopus-b
885 git log -n6 --decorate=short --pretty="tformat:%f%d" \
886 --decorate-refs="heads/octopus*" >actual &&
887 test_cmp expect.decorate actual &&
888 git log -n6 --decorate=short --pretty="tformat:%f%d" \
889 --decorate-refs-exclude="heads/octopus*" \
890 --decorate-refs="heads/octopus*" >actual &&
891 test_cmp expect.no-decorate actual &&
892 git -c log.excludeDecoration="heads/octopus*" log \
893 -n6 --decorate=short --pretty="tformat:%f%d" \
894 --decorate-refs="heads/octopus*" >actual &&
895 test_cmp expect.decorate actual
898 test_expect_success
'decorate-refs without globs' '
899 cat >expect.decorate <<-\EOF &&
901 Merge-tags-octopus-a-and-octopus-b
907 git log -n6 --decorate=short --pretty="tformat:%f%d" \
908 --decorate-refs="tags/reach" >actual &&
909 test_cmp expect.decorate actual
912 test_expect_success
'multiple decorate-refs' '
913 cat >expect.decorate <<-\EOF &&
915 Merge-tags-octopus-a-and-octopus-b
917 octopus-b (octopus-b)
918 octopus-a (octopus-a)
921 git log -n6 --decorate=short --pretty="tformat:%f%d" \
922 --decorate-refs="heads/octopus*" \
923 --decorate-refs="tags/reach" >actual &&
924 test_cmp expect.decorate actual
927 test_expect_success
'decorate-refs-exclude with glob' '
928 cat >expect.decorate <<-\EOF &&
929 Merge-tag-reach (HEAD -> main)
930 Merge-tags-octopus-a-and-octopus-b
931 seventh (tag: seventh)
932 octopus-b (tag: octopus-b)
933 octopus-a (tag: octopus-a)
934 reach (tag: reach, reach)
936 git log -n6 --decorate=short --pretty="tformat:%f%d" \
937 --decorate-refs-exclude="heads/octopus*" >actual &&
938 test_cmp expect.decorate actual &&
939 git -c log.excludeDecoration="heads/octopus*" log \
940 -n6 --decorate=short --pretty="tformat:%f%d" >actual &&
941 test_cmp expect.decorate actual
944 test_expect_success
'decorate-refs-exclude without globs' '
945 cat >expect.decorate <<-\EOF &&
946 Merge-tag-reach (HEAD -> main)
947 Merge-tags-octopus-a-and-octopus-b
948 seventh (tag: seventh)
949 octopus-b (tag: octopus-b, octopus-b)
950 octopus-a (tag: octopus-a, octopus-a)
953 git log -n6 --decorate=short --pretty="tformat:%f%d" \
954 --decorate-refs-exclude="tags/reach" >actual &&
955 test_cmp expect.decorate actual &&
956 git -c log.excludeDecoration="tags/reach" log \
957 -n6 --decorate=short --pretty="tformat:%f%d" >actual &&
958 test_cmp expect.decorate actual
961 test_expect_success
'multiple decorate-refs-exclude' '
962 cat >expect.decorate <<-\EOF &&
963 Merge-tag-reach (HEAD -> main)
964 Merge-tags-octopus-a-and-octopus-b
965 seventh (tag: seventh)
966 octopus-b (tag: octopus-b)
967 octopus-a (tag: octopus-a)
970 git log -n6 --decorate=short --pretty="tformat:%f%d" \
971 --decorate-refs-exclude="heads/octopus*" \
972 --decorate-refs-exclude="tags/reach" >actual &&
973 test_cmp expect.decorate actual &&
974 git -c log.excludeDecoration="heads/octopus*" \
975 -c log.excludeDecoration="tags/reach" log \
976 -n6 --decorate=short --pretty="tformat:%f%d" >actual &&
977 test_cmp expect.decorate actual &&
978 git -c log.excludeDecoration="heads/octopus*" log \
979 --decorate-refs-exclude="tags/reach" \
980 -n6 --decorate=short --pretty="tformat:%f%d" >actual &&
981 test_cmp expect.decorate actual
984 test_expect_success
'decorate-refs and decorate-refs-exclude' '
985 cat >expect.no-decorate <<-\EOF &&
986 Merge-tag-reach (main)
987 Merge-tags-octopus-a-and-octopus-b
993 git log -n6 --decorate=short --pretty="tformat:%f%d" \
994 --decorate-refs="heads/*" \
995 --decorate-refs-exclude="heads/oc*" >actual &&
996 test_cmp expect.no-decorate actual
999 test_expect_success
'deocrate-refs and log.excludeDecoration' '
1000 cat >expect.decorate <<-\EOF &&
1001 Merge-tag-reach (main)
1002 Merge-tags-octopus-a-and-octopus-b
1004 octopus-b (octopus-b)
1005 octopus-a (octopus-a)
1008 git -c log.excludeDecoration="heads/oc*" log \
1009 --decorate-refs="heads/*" \
1010 -n6 --decorate=short --pretty="tformat:%f%d" >actual &&
1011 test_cmp expect.decorate actual
1014 test_expect_success
'decorate-refs-exclude and simplify-by-decoration' '
1015 cat >expect.decorate <<-\EOF &&
1016 Merge-tag-reach (HEAD -> main)
1017 reach (tag: reach, reach)
1018 seventh (tag: seventh)
1019 Merge-branch-tangle (refs/hidden/tangle)
1020 Merge-branch-side-early-part-into-tangle (refs/rewritten/merge, tangle)
1021 Merge-branch-main-early-part-into-tangle (refs/prefetch/merge)
1023 git log -n6 --decorate=short --pretty="tformat:%f%d" \
1024 --decorate-refs-exclude="*octopus*" \
1025 --simplify-by-decoration >actual &&
1026 test_cmp expect.decorate actual &&
1027 git -c log.excludeDecoration="*octopus*" log \
1028 -n6 --decorate=short --pretty="tformat:%f%d" \
1029 --simplify-by-decoration >actual &&
1030 test_cmp expect.decorate actual
1033 test_expect_success
'decorate-refs with implied decorate from format' '
1034 cat >expect <<-\EOF &&
1035 side-2 (tag: side-2)
1038 git log --no-walk --format="%s%d" \
1039 --decorate-refs="*side-2" side-1 side-2 \
1041 test_cmp expect actual
1044 test_expect_success
'implied decorate does not override option' '
1045 cat >expect <<-\EOF &&
1046 side-2 (tag: refs/tags/side-2, refs/heads/side)
1047 side-1 (tag: refs/tags/side-1)
1049 git log --no-walk --format="%s%d" \
1050 --decorate=full side-1 side-2 \
1052 test_cmp expect actual
1055 test_expect_success
'decorate-refs and simplify-by-decoration without output' '
1056 cat >expect <<-\EOF &&
1060 # Do not just use a --format without %d here; we want to
1061 # make sure that we did not accidentally turn on displaying
1062 # the decorations, too. And that requires one of the regular
1064 git log --decorate-refs="*side-2" --oneline \
1065 --simplify-by-decoration >actual.raw &&
1066 sed "s/^[0-9a-f]* //" <actual.raw >actual &&
1067 test_cmp expect actual
1070 test_expect_success
'decorate-refs-exclude HEAD' '
1071 git log --decorate=full --oneline \
1072 --decorate-refs-exclude="HEAD" >actual &&
1076 test_expect_success
'decorate-refs focus from default' '
1077 git log --decorate=full --oneline \
1078 --decorate-refs="refs/heads" >actual &&
1082 test_expect_success
'--clear-decorations overrides defaults' '
1083 cat >expect.default <<-\EOF &&
1084 Merge-tag-reach (HEAD -> refs/heads/main)
1085 Merge-tags-octopus-a-and-octopus-b
1086 seventh (tag: refs/tags/seventh)
1087 octopus-b (tag: refs/tags/octopus-b, refs/heads/octopus-b)
1088 octopus-a (tag: refs/tags/octopus-a, refs/heads/octopus-a)
1089 reach (tag: refs/tags/reach, refs/heads/reach)
1091 Merge-branch-side-early-part-into-tangle (refs/heads/tangle)
1092 Merge-branch-main-early-part-into-tangle
1093 tangle-a (tag: refs/tags/tangle-a)
1095 side-2 (tag: refs/tags/side-2, refs/heads/side)
1096 side-1 (tag: refs/tags/side-1)
1105 git log --decorate=full --pretty="tformat:%f%d" >actual &&
1106 test_cmp expect.default actual &&
1108 cat >expect.all <<-\EOF &&
1109 Merge-tag-reach (HEAD -> refs/heads/main)
1110 Merge-tags-octopus-a-and-octopus-b
1111 seventh (tag: refs/tags/seventh)
1112 octopus-b (tag: refs/tags/octopus-b, refs/heads/octopus-b)
1113 octopus-a (tag: refs/tags/octopus-a, refs/heads/octopus-a)
1114 reach (tag: refs/tags/reach, refs/heads/reach)
1115 Merge-branch-tangle (refs/hidden/tangle)
1116 Merge-branch-side-early-part-into-tangle (refs/rewritten/merge, refs/heads/tangle)
1117 Merge-branch-main-early-part-into-tangle (refs/prefetch/merge)
1118 tangle-a (tag: refs/tags/tangle-a)
1120 side-2 (tag: refs/tags/side-2, refs/heads/side)
1121 side-1 (tag: refs/tags/side-1)
1130 git log --decorate=full --pretty="tformat:%f%d" \
1131 --clear-decorations >actual &&
1132 test_cmp expect.all actual &&
1133 git -c log.initialDecorationSet=all log \
1134 --decorate=full --pretty="tformat:%f%d" >actual &&
1135 test_cmp expect.all actual
1138 test_expect_success
'--clear-decorations clears previous exclusions' '
1139 cat >expect.all <<-\EOF &&
1140 Merge-tag-reach (HEAD -> refs/heads/main)
1141 reach (tag: refs/tags/reach, refs/heads/reach)
1142 Merge-tags-octopus-a-and-octopus-b
1143 octopus-b (tag: refs/tags/octopus-b, refs/heads/octopus-b)
1144 octopus-a (tag: refs/tags/octopus-a, refs/heads/octopus-a)
1145 seventh (tag: refs/tags/seventh)
1146 Merge-branch-tangle (refs/hidden/tangle)
1147 Merge-branch-side-early-part-into-tangle (refs/rewritten/merge, refs/heads/tangle)
1148 Merge-branch-main-early-part-into-tangle (refs/prefetch/merge)
1149 tangle-a (tag: refs/tags/tangle-a)
1150 side-2 (tag: refs/tags/side-2, refs/heads/side)
1151 side-1 (tag: refs/tags/side-1)
1155 git log --decorate=full --pretty="tformat:%f%d" \
1156 --simplify-by-decoration \
1157 --decorate-refs-exclude="heads/octopus*" \
1158 --decorate-refs="heads" \
1159 --clear-decorations >actual &&
1160 test_cmp expect.all actual &&
1162 cat >expect.filtered <<-\EOF &&
1163 Merge-tags-octopus-a-and-octopus-b
1164 octopus-b (refs/heads/octopus-b)
1165 octopus-a (refs/heads/octopus-a)
1169 git log --decorate=full --pretty="tformat:%f%d" \
1170 --simplify-by-decoration \
1171 --decorate-refs-exclude="heads/octopus" \
1172 --decorate-refs="heads" \
1173 --clear-decorations \
1174 --decorate-refs-exclude="tags/" \
1175 --decorate-refs="heads/octopus*" >actual &&
1176 test_cmp expect.filtered actual
1179 test_expect_success
'log.decorate config parsing' '
1180 git log --oneline --decorate=full >expect.full &&
1181 git log --oneline --decorate=short >expect.short &&
1183 test_config log.decorate full &&
1184 test_config log.mailmap true &&
1185 git log --oneline >actual &&
1186 test_cmp expect.full actual &&
1187 git log --oneline --decorate=short >actual &&
1188 test_cmp expect.short actual
1191 test_expect_success TTY
'log output on a TTY' '
1192 git log --color --oneline --decorate >expect.short &&
1194 test_terminal git log --oneline >actual &&
1195 test_cmp expect.short actual
1198 test_expect_success
'reflog is expected format' '
1199 git log -g --abbrev-commit --pretty=oneline >expect &&
1200 git reflog >actual &&
1201 test_cmp expect actual
1204 test_expect_success
'whatchanged is expected format' '
1205 git log --no-merges --raw >expect &&
1206 git whatchanged >actual &&
1207 test_cmp expect actual
1210 test_expect_success
'log.abbrevCommit configuration' '
1211 git log --abbrev-commit >expect.log.abbrev &&
1212 git log --no-abbrev-commit >expect.log.full &&
1213 git log --pretty=raw >expect.log.raw &&
1214 git reflog --abbrev-commit >expect.reflog.abbrev &&
1215 git reflog --no-abbrev-commit >expect.reflog.full &&
1216 git whatchanged --abbrev-commit >expect.whatchanged.abbrev &&
1217 git whatchanged --no-abbrev-commit >expect.whatchanged.full &&
1219 test_config log.abbrevCommit true &&
1222 test_cmp expect.log.abbrev actual &&
1223 git log --no-abbrev-commit >actual &&
1224 test_cmp expect.log.full actual &&
1226 git log --pretty=raw >actual &&
1227 test_cmp expect.log.raw actual &&
1229 git reflog >actual &&
1230 test_cmp expect.reflog.abbrev actual &&
1231 git reflog --no-abbrev-commit >actual &&
1232 test_cmp expect.reflog.full actual &&
1234 git whatchanged >actual &&
1235 test_cmp expect.whatchanged.abbrev actual &&
1236 git whatchanged --no-abbrev-commit >actual &&
1237 test_cmp expect.whatchanged.full actual
1240 test_expect_success
'--abbrev-commit with core.abbrev=false' '
1241 git log --no-abbrev >expect &&
1242 git -c core.abbrev=false log --abbrev-commit >actual &&
1243 test_cmp expect actual
1246 test_expect_success
'--abbrev-commit with --no-abbrev' '
1247 git log --no-abbrev >expect &&
1248 git log --abbrev-commit --no-abbrev >actual &&
1249 test_cmp expect actual
1252 test_expect_success
'--abbrev-commit with core.abbrev=9000' '
1253 git log --no-abbrev >expect &&
1254 git -c core.abbrev=9000 log --abbrev-commit >actual &&
1255 test_cmp expect actual
1258 test_expect_success
'--abbrev-commit with --abbrev=9000' '
1259 git log --no-abbrev >expect &&
1260 git log --abbrev-commit --abbrev=9000 >actual &&
1261 test_cmp expect actual
1264 test_expect_success
'show added path under "--follow -M"' '
1265 # This tests for a regression introduced in v1.7.2-rc0~103^2~2
1266 test_create_repo regression &&
1269 test_commit needs-another-commit &&
1270 test_commit foo.bar &&
1271 git log -M --follow -p foo.bar.t &&
1272 git log -M --follow --stat foo.bar.t &&
1273 git log -M --follow --name-only foo.bar.t
1277 test_expect_success
'git log -c --follow' '
1278 test_create_repo follow-c &&
1281 test_commit initial file original &&
1283 test_commit rename file2 original &&
1284 git reset --hard initial &&
1285 test_commit modify file foo &&
1286 git merge -m merge rename &&
1287 git log -c --follow file2
1292 * commit COMMIT_OBJECT_NAME
1293 |\ Merge
: MERGE_PARENTS
1294 | | Author
: A U Thor
<author@example.com
>
1296 | | Merge HEADS DESCRIPTION
1298 |
* commit COMMIT_OBJECT_NAME
1299 | | Author
: A U Thor
<author@example.com
>
1304 | |
1 file changed
, 1 insertion
(+)
1306 | |
diff --git a
/reach.t b
/reach.t
1307 | | new
file mode
100644
1308 | | index BEFORE..AFTER
1315 *-. \ commit COMMIT_OBJECT_NAME
1316 |\ \ \ Merge
: MERGE_PARENTS
1317 | | | | Author
: A U Thor
<author@example.com
>
1319 | | | | Merge HEADS DESCRIPTION
1321 | |
* | commit COMMIT_OBJECT_NAME
1322 | | |
/ Author
: A U Thor
<author@example.com
>
1326 | | | octopus-b.t |
1 +
1327 | | |
1 file changed
, 1 insertion
(+)
1329 | | |
diff --git a
/octopus-b.t b
/octopus-b.t
1330 | | | new
file mode
100644
1331 | | | index BEFORE..AFTER
1333 | | |
+++ b
/octopus-b.t
1337 |
* | commit COMMIT_OBJECT_NAME
1338 | |
/ Author
: A U Thor
<author@example.com
>
1342 | | octopus-a.t |
1 +
1343 | |
1 file changed
, 1 insertion
(+)
1345 | |
diff --git a
/octopus-a.t b
/octopus-a.t
1346 | | new
file mode
100644
1347 | | index BEFORE..AFTER
1349 | |
+++ b
/octopus-a.t
1353 * | commit COMMIT_OBJECT_NAME
1354 |
/ Author
: A U Thor
<author@example.com
>
1359 |
1 file changed
, 1 insertion
(+)
1361 |
diff --git a
/seventh.t b
/seventh.t
1362 | new
file mode
100644
1363 | index BEFORE..AFTER
1369 * commit COMMIT_OBJECT_NAME
1370 |\ Merge
: MERGE_PARENTS
1371 | | Author
: A U Thor
<author@example.com
>
1373 | | Merge branch
'tangle'
1375 |
* commit COMMIT_OBJECT_NAME
1376 | |\ Merge
: MERGE_PARENTS
1377 | | | Author
: A U Thor
<author@example.com
>
1379 | | | Merge branch
'side' (early part
) into tangle
1381 |
* | commit COMMIT_OBJECT_NAME
1382 | |\ \ Merge
: MERGE_PARENTS
1383 | | | | Author
: A U Thor
<author@example.com
>
1385 | | | | Merge branch
'main' (early part
) into tangle
1387 |
* | | commit COMMIT_OBJECT_NAME
1388 | | | | Author
: A U Thor
<author@example.com
>
1392 | | | | tangle-a |
1 +
1393 | | | |
1 file changed
, 1 insertion
(+)
1395 | | | |
diff --git a
/tangle-a b
/tangle-a
1396 | | | | new
file mode
100644
1397 | | | | index BEFORE..AFTER
1398 | | | |
--- /dev
/null
1399 | | | |
+++ b
/tangle-a
1400 | | | | @@
-0,0 +1 @@
1403 * | | | commit COMMIT_OBJECT_NAME
1404 |\ \ \ \ Merge
: MERGE_PARENTS
1405 | | | | | Author
: A U Thor
<author@example.com
>
1407 | | | | | Merge branch
'side'
1409 |
* | | | commit COMMIT_OBJECT_NAME
1410 | | |_|
/ Author
: A U Thor
<author@example.com
>
1415 | | | |
1 file changed
, 1 insertion
(+)
1417 | | | |
diff --git a
/2 b
/2
1418 | | | | new
file mode
100644
1419 | | | | index BEFORE..AFTER
1420 | | | |
--- /dev
/null
1422 | | | | @@
-0,0 +1 @@
1425 |
* | | commit COMMIT_OBJECT_NAME
1426 | | | | Author
: A U Thor
<author@example.com
>
1431 | | | |
1 file changed
, 1 insertion
(+)
1433 | | | |
diff --git a
/1 b
/1
1434 | | | | new
file mode
100644
1435 | | | | index BEFORE..AFTER
1436 | | | |
--- /dev
/null
1438 | | | | @@
-0,0 +1 @@
1441 * | | | commit COMMIT_OBJECT_NAME
1442 | | | | Author
: A U Thor
<author@example.com
>
1447 | | | |
1 file changed
, 1 insertion
(+)
1449 | | | |
diff --git a
/one b
/one
1450 | | | | new
file mode
100644
1451 | | | | index BEFORE..AFTER
1452 | | | |
--- /dev
/null
1454 | | | | @@
-0,0 +1 @@
1457 * | | | commit COMMIT_OBJECT_NAME
1458 | |_|
/ Author
: A U Thor
<author@example.com
>
1463 | | |
1 file changed
, 1 deletion
(-)
1465 | | |
diff --git a
/a
/two b
/a
/two
1466 | | | deleted
file mode
100644
1467 | | | index BEFORE..AFTER
1473 * | | commit COMMIT_OBJECT_NAME
1474 | | | Author
: A U Thor
<author@example.com
>
1479 | | |
1 file changed
, 1 insertion
(+)
1481 | | |
diff --git a
/a
/two b
/a
/two
1482 | | | new
file mode
100644
1483 | | | index BEFORE..AFTER
1489 * | | commit COMMIT_OBJECT_NAME
1490 |
/ / Author
: A U Thor
<author@example.com
>
1495 | |
1 file changed
, 1 insertion
(+)
1497 | |
diff --git a
/ein b
/ein
1498 | | new
file mode
100644
1499 | | index BEFORE..AFTER
1505 * | commit COMMIT_OBJECT_NAME
1506 |
/ Author
: A U Thor
<author@example.com
>
1512 |
2 files changed
, 1 insertion
(+), 1 deletion
(-)
1514 |
diff --git a
/ichi b
/ichi
1515 | new
file mode
100644
1516 | index BEFORE..AFTER
1521 |
diff --git a
/one b
/one
1522 | deleted
file mode
100644
1523 | index BEFORE..AFTER
1529 * commit COMMIT_OBJECT_NAME
1530 | Author
: A U Thor
<author@example.com
>
1535 |
1 file changed
, 1 insertion
(+), 1 deletion
(-)
1537 |
diff --git a
/one b
/one
1538 | index BEFORE..AFTER
100644
1545 * commit COMMIT_OBJECT_NAME
1546 Author
: A U Thor
<author@example.com
>
1551 1 file changed
, 1 insertion
(+)
1553 diff --git a
/one b
/one
1554 new
file mode
100644
1562 test_expect_success
'log --graph with diff and stats' '
1563 lib_test_cmp_short_graph --no-renames --stat -p
1567 *** * commit COMMIT_OBJECT_NAME
1568 *** |\ Merge
: MERGE_PARENTS
1569 *** | | Author
: A U Thor
<author@example.com
>
1571 *** | | Merge HEADS DESCRIPTION
1573 *** |
* commit COMMIT_OBJECT_NAME
1574 *** | | Author
: A U Thor
<author@example.com
>
1578 *** | | reach.t |
1 +
1579 *** | |
1 file changed
, 1 insertion
(+)
1581 *** | |
diff --git a
/reach.t b
/reach.t
1582 *** | | new
file mode
100644
1583 *** | | index BEFORE..AFTER
1584 *** | |
--- /dev
/null
1585 *** | |
+++ b
/reach.t
1586 *** | | @@
-0,0 +1 @@
1590 *** *-. \ commit COMMIT_OBJECT_NAME
1591 *** |\ \ \ Merge
: MERGE_PARENTS
1592 *** | | | | Author
: A U Thor
<author@example.com
>
1594 *** | | | | Merge HEADS DESCRIPTION
1596 *** | |
* | commit COMMIT_OBJECT_NAME
1597 *** | | |
/ Author
: A U Thor
<author@example.com
>
1601 *** | | | octopus-b.t |
1 +
1602 *** | | |
1 file changed
, 1 insertion
(+)
1604 *** | | |
diff --git a
/octopus-b.t b
/octopus-b.t
1605 *** | | | new
file mode
100644
1606 *** | | | index BEFORE..AFTER
1607 *** | | |
--- /dev
/null
1608 *** | | |
+++ b
/octopus-b.t
1609 *** | | | @@
-0,0 +1 @@
1610 *** | | |
+octopus-b
1612 *** |
* | commit COMMIT_OBJECT_NAME
1613 *** | |
/ Author
: A U Thor
<author@example.com
>
1617 *** | | octopus-a.t |
1 +
1618 *** | |
1 file changed
, 1 insertion
(+)
1620 *** | |
diff --git a
/octopus-a.t b
/octopus-a.t
1621 *** | | new
file mode
100644
1622 *** | | index BEFORE..AFTER
1623 *** | |
--- /dev
/null
1624 *** | |
+++ b
/octopus-a.t
1625 *** | | @@
-0,0 +1 @@
1628 *** * | commit COMMIT_OBJECT_NAME
1629 *** |
/ Author
: A U Thor
<author@example.com
>
1633 *** | seventh.t |
1 +
1634 *** |
1 file changed
, 1 insertion
(+)
1636 *** |
diff --git a
/seventh.t b
/seventh.t
1637 *** | new
file mode
100644
1638 *** | index BEFORE..AFTER
1640 *** |
+++ b
/seventh.t
1644 *** * commit COMMIT_OBJECT_NAME
1645 *** |\ Merge
: MERGE_PARENTS
1646 *** | | Author
: A U Thor
<author@example.com
>
1648 *** | | Merge branch
'tangle'
1650 *** |
* commit COMMIT_OBJECT_NAME
1651 *** | |\ Merge
: MERGE_PARENTS
1652 *** | | | Author
: A U Thor
<author@example.com
>
1654 *** | | | Merge branch
'side' (early part
) into tangle
1656 *** |
* | commit COMMIT_OBJECT_NAME
1657 *** | |\ \ Merge
: MERGE_PARENTS
1658 *** | | | | Author
: A U Thor
<author@example.com
>
1660 *** | | | | Merge branch
'main' (early part
) into tangle
1662 *** |
* | | commit COMMIT_OBJECT_NAME
1663 *** | | | | Author
: A U Thor
<author@example.com
>
1665 *** | | | | tangle-a
1667 *** | | | | tangle-a |
1 +
1668 *** | | | |
1 file changed
, 1 insertion
(+)
1670 *** | | | |
diff --git a
/tangle-a b
/tangle-a
1671 *** | | | | new
file mode
100644
1672 *** | | | | index BEFORE..AFTER
1673 *** | | | |
--- /dev
/null
1674 *** | | | |
+++ b
/tangle-a
1675 *** | | | | @@
-0,0 +1 @@
1678 *** * | | | commit COMMIT_OBJECT_NAME
1679 *** |\ \ \ \ Merge
: MERGE_PARENTS
1680 *** | | | | | Author
: A U Thor
<author@example.com
>
1682 *** | | | | | Merge branch
'side'
1684 *** |
* | | | commit COMMIT_OBJECT_NAME
1685 *** | | |_|
/ Author
: A U Thor
<author@example.com
>
1690 *** | | | |
1 file changed
, 1 insertion
(+)
1692 *** | | | |
diff --git a
/2 b
/2
1693 *** | | | | new
file mode
100644
1694 *** | | | | index BEFORE..AFTER
1695 *** | | | |
--- /dev
/null
1697 *** | | | | @@
-0,0 +1 @@
1700 *** |
* | | commit COMMIT_OBJECT_NAME
1701 *** | | | | Author
: A U Thor
<author@example.com
>
1706 *** | | | |
1 file changed
, 1 insertion
(+)
1708 *** | | | |
diff --git a
/1 b
/1
1709 *** | | | | new
file mode
100644
1710 *** | | | | index BEFORE..AFTER
1711 *** | | | |
--- /dev
/null
1713 *** | | | | @@
-0,0 +1 @@
1716 *** * | | | commit COMMIT_OBJECT_NAME
1717 *** | | | | Author
: A U Thor
<author@example.com
>
1721 *** | | | | one |
1 +
1722 *** | | | |
1 file changed
, 1 insertion
(+)
1724 *** | | | |
diff --git a
/one b
/one
1725 *** | | | | new
file mode
100644
1726 *** | | | | index BEFORE..AFTER
1727 *** | | | |
--- /dev
/null
1728 *** | | | |
+++ b
/one
1729 *** | | | | @@
-0,0 +1 @@
1732 *** * | | | commit COMMIT_OBJECT_NAME
1733 *** | |_|
/ Author
: A U Thor
<author@example.com
>
1737 *** | | | a
/two |
1 -
1738 *** | | |
1 file changed
, 1 deletion
(-)
1740 *** | | |
diff --git a
/a
/two b
/a
/two
1741 *** | | | deleted
file mode
100644
1742 *** | | | index BEFORE..AFTER
1743 *** | | |
--- a
/a
/two
1744 *** | | |
+++ /dev
/null
1745 *** | | | @@
-1 +0,0 @@
1748 *** * | | commit COMMIT_OBJECT_NAME
1749 *** | | | Author
: A U Thor
<author@example.com
>
1753 *** | | | a
/two |
1 +
1754 *** | | |
1 file changed
, 1 insertion
(+)
1756 *** | | |
diff --git a
/a
/two b
/a
/two
1757 *** | | | new
file mode
100644
1758 *** | | | index BEFORE..AFTER
1759 *** | | |
--- /dev
/null
1760 *** | | |
+++ b
/a
/two
1761 *** | | | @@
-0,0 +1 @@
1764 *** * | | commit COMMIT_OBJECT_NAME
1765 *** |
/ / Author
: A U Thor
<author@example.com
>
1770 *** | |
1 file changed
, 1 insertion
(+)
1772 *** | |
diff --git a
/ein b
/ein
1773 *** | | new
file mode
100644
1774 *** | | index BEFORE..AFTER
1775 *** | |
--- /dev
/null
1777 *** | | @@
-0,0 +1 @@
1780 *** * | commit COMMIT_OBJECT_NAME
1781 *** |
/ Author
: A U Thor
<author@example.com
>
1787 *** |
2 files changed
, 1 insertion
(+), 1 deletion
(-)
1789 *** |
diff --git a
/ichi b
/ichi
1790 *** | new
file mode
100644
1791 *** | index BEFORE..AFTER
1796 *** |
diff --git a
/one b
/one
1797 *** | deleted
file mode
100644
1798 *** | index BEFORE..AFTER
1804 *** * commit COMMIT_OBJECT_NAME
1805 *** | Author
: A U Thor
<author@example.com
>
1810 *** |
1 file changed
, 1 insertion
(+), 1 deletion
(-)
1812 *** |
diff --git a
/one b
/one
1813 *** | index BEFORE..AFTER
100644
1820 *** * commit COMMIT_OBJECT_NAME
1821 *** Author
: A U Thor
<author@example.com
>
1826 *** 1 file changed
, 1 insertion
(+)
1828 *** diff --git a
/one b
/one
1829 *** new
file mode
100644
1830 *** index BEFORE..AFTER
1837 test_expect_success
'log --line-prefix="*** " --graph with diff and stats' '
1838 lib_test_cmp_short_graph --line-prefix="*** " --no-renames --stat -p
1845 * Merge branch 'tangle'
1846 * Merge branch 'side'
1859 test_expect_success 'log --graph with --name-status' '
1860 test_cmp_graph --name-status tangle..reach
1867 * Merge branch 'tangle'
1868 * Merge branch 'side'
1881 test_expect_success 'log --graph with --name-only' '
1882 test_cmp_graph --name-only tangle..reach
1885 test_expect_success '--no-graph countermands --graph' '
1887 git log --graph --no-graph >actual &&
1888 test_cmp expect actual
1891 test_expect_success '--graph countermands --no-graph' '
1892 git log --graph >expect &&
1893 git log --no-graph --graph >actual &&
1894 test_cmp expect actual
1897 test_expect_success '--no-graph does not unset --topo-order' '
1898 git log --topo-order >expect &&
1899 git log --topo-order --no-graph >actual &&
1900 test_cmp expect actual
1903 test_expect_success '--no-graph does not unset --parents' '
1904 git log --parents >expect &&
1905 git log --parents --no-graph >actual &&
1906 test_cmp expect actual
1909 test_expect_success '--reverse and --graph conflict' '
1910 test_must_fail git log --reverse --graph 2>stderr &&
1911 test_grep "cannot be used together" stderr
1914 test_expect_success '--reverse --graph --no-graph works' '
1915 git log --reverse >expect &&
1916 git log --reverse --graph --no-graph >actual &&
1917 test_cmp expect actual
1920 test_expect_success '--show-linear-break and --graph conflict' '
1921 test_must_fail git log --show-linear-break --graph 2>stderr &&
1922 test_grep "cannot be used together" stderr
1925 test_expect_success '--show-linear-break --graph --no-graph works' '
1926 git log --show-linear-break >expect &&
1927 git log --show-linear-break --graph --no-graph >actual &&
1928 test_cmp expect actual
1931 test_expect_success '--no-walk and --graph conflict' '
1932 test_must_fail git log --no-walk --graph 2>stderr &&
1933 test_grep "cannot be used together" stderr
1936 test_expect_success '--no-walk --graph --no-graph works' '
1937 git log --no-walk >expect &&
1938 git log --no-walk --graph --no-graph >actual &&
1939 test_cmp expect actual
1942 test_expect_success '--walk-reflogs and --graph conflict' '
1943 test_must_fail git log --walk-reflogs --graph 2>stderr &&
1944 (test_grep "cannot combine" stderr ||
1945 test_grep "cannot be used together" stderr)
1948 test_expect_success '--walk-reflogs --graph --no-graph works' '
1949 git log --walk-reflogs >expect &&
1950 git log --walk-reflogs --graph --no-graph >actual &&
1951 test_cmp expect actual
1954 test_expect_success 'dotdot is a parent directory' '
1956 ( echo sixth && echo fifth ) >expect &&
1957 ( cd a/b && git log --format=%s .. ) >actual &&
1958 test_cmp expect actual
1961 test_expect_success GPG 'setup signed branch' '
1962 test_when_finished "git reset --hard && git checkout main" &&
1963 git checkout -b signed main &&
1966 git commit -S -m signed_commit
1969 test_expect_success GPG 'setup signed branch with subkey' '
1970 test_when_finished "git reset --hard && git checkout main" &&
1971 git checkout -b signed-subkey main &&
1974 git commit -SB7227189 -m signed_commit
1977 test_expect_success GPGSM 'setup signed branch x509' '
1978 test_when_finished "git reset --hard && git checkout main" &&
1979 git checkout -b signed-x509 main &&
1982 test_config gpg.format x509 &&
1983 test_config user.signingkey $GIT_COMMITTER_EMAIL &&
1984 git commit -S -m signed_commit
1987 test_expect_success GPGSSH 'setup sshkey signed branch' '
1988 test_config gpg.format ssh &&
1989 test_config user.signingkey "${GPGSSH_KEY_PRIMARY}" &&
1990 test_when_finished "git reset --hard && git checkout main" &&
1991 git checkout -b signed-ssh main &&
1994 git commit -S -m signed_commit
1997 test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'create signed commits with keys having defined lifetimes' '
1998 test_config gpg.format ssh &&
2002 echo expired >file && test_tick && git commit -a -m expired -S"${GPGSSH_KEY_EXPIRED}" &&
2003 git tag expired-signed &&
2005 echo notyetvalid >file && test_tick && git commit -a -m notyetvalid -S"${GPGSSH_KEY_NOTYETVALID}" &&
2006 git tag notyetvalid-signed &&
2008 echo timeboxedvalid >file && test_tick && git commit -a -m timeboxedvalid -S"${GPGSSH_KEY_TIMEBOXEDVALID}" &&
2009 git tag timeboxedvalid-signed &&
2011 echo timeboxedinvalid >file && test_tick && git commit -a -m timeboxedinvalid -S"${GPGSSH_KEY_TIMEBOXEDINVALID}" &&
2012 git tag timeboxedinvalid-signed
2015 test_expect_success GPGSM 'log x509 fingerprint' '
2016 echo "F8BF62E0693D0694816377099909C779FA23FD65 | " >expect &&
2017 git log -n1 --format="%GF | %GP" signed-x509 >actual &&
2018 test_cmp expect actual
2021 test_expect_success GPGSM 'log OpenPGP fingerprint' '
2022 echo "D4BE22311AD3131E5EDA29A461092E85B7227189" > expect &&
2023 git log -n1 --format="%GP" signed-subkey >actual &&
2024 test_cmp expect actual
2027 test_expect_success GPGSSH 'log ssh key fingerprint' '
2028 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2029 ssh-keygen -lf "${GPGSSH_KEY_PRIMARY}" | awk "{print \$2\" | \"}" >expect &&
2030 git log -n1 --format="%GF | %GP" signed-ssh >actual &&
2031 test_cmp expect actual
2034 test_expect_success GPG 'log --graph --show-signature' '
2035 git log --graph --show-signature -n1 signed >actual &&
2036 grep "^| gpg: Signature made" actual &&
2037 grep "^| gpg: Good signature" actual
2040 test_expect_success GPGSM 'log --graph --show-signature x509' '
2041 git log --graph --show-signature -n1 signed-x509 >actual &&
2042 grep "^| gpgsm: Signature made" actual &&
2043 grep "^| gpgsm: Good signature" actual
2046 test_expect_success GPGSSH 'log --graph --show-signature ssh' '
2047 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2048 git log --graph --show-signature -n1 signed-ssh >actual &&
2049 grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
2052 test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure on expired signature key' '
2053 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2054 git log --graph --show-signature -n1 expired-signed >actual &&
2055 ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
2058 test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure on not yet valid signature key' '
2059 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2060 git log --graph --show-signature -n1 notyetvalid-signed >actual &&
2061 ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
2064 test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log show success with commit date and key validity matching' '
2065 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2066 git log --graph --show-signature -n1 timeboxedvalid-signed >actual &&
2067 grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual &&
2068 ! grep "${GPGSSH_BAD_SIGNATURE}" actual
2071 test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure with commit date outside of key validity' '
2072 test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
2073 git log --graph --show-signature -n1 timeboxedinvalid-signed >actual &&
2074 ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
2077 test_expect_success GPG 'log --graph --show-signature for merged tag' '
2078 test_when_finished "git reset --hard && git checkout main" &&
2079 git checkout -b plain main &&
2082 git commit -m bar_commit &&
2083 git checkout -b tagged main &&
2086 git commit -m baz_commit &&
2087 git tag -s -m signed_tag_msg signed_tag &&
2088 git checkout plain &&
2089 git merge --no-ff -m msg signed_tag &&
2090 git log --graph --show-signature -n1 plain >actual &&
2091 grep "^|\\\ merged tag" actual &&
2092 grep "^| | gpg: Signature made" actual &&
2093 grep "^| | gpg: Good signature" actual
2096 test_expect_success GPG 'log --graph --show-signature for merged tag in shallow clone' '
2097 test_when_finished "git reset --hard && git checkout main" &&
2098 git checkout -b plain-shallow main &&
2101 git commit -m bar_commit &&
2102 git checkout --detach main &&
2105 git commit -m baz_commit &&
2106 git tag -s -m signed_tag_msg signed_tag_shallow &&
2107 hash=$(git rev-parse HEAD) &&
2108 git checkout plain-shallow &&
2109 git merge --no-ff -m msg signed_tag_shallow &&
2110 git clone --depth 1 --no-local . shallow &&
2111 test_when_finished "rm -rf shallow" &&
2112 git -C shallow log --graph --show-signature -n1 plain-shallow >actual &&
2113 grep "tag signed_tag_shallow names a non-parent $hash" actual
2116 test_expect_success GPG 'log --graph --show-signature for merged tag with missing key' '
2117 test_when_finished "git reset --hard && git checkout main" &&
2118 git checkout -b plain-nokey main &&
2121 git commit -m bar_commit &&
2122 git checkout -b tagged-nokey main &&
2125 git commit -m baz_commit &&
2126 git tag -s -m signed_tag_msg signed_tag_nokey &&
2127 git checkout plain-nokey &&
2128 git merge --no-ff -m msg signed_tag_nokey &&
2129 GNUPGHOME=. git log --graph --show-signature -n1 plain-nokey >actual &&
2130 grep "^|\\\ merged tag" actual &&
2131 grep "^| | gpg: Signature made" actual &&
2132 grep -E "^| | gpg: Can'"'"'t check signature: (public key not found|No public key)" actual
2135 test_expect_success GPG 'log --graph --show-signature for merged tag with bad signature' '
2136 test_when_finished "git reset --hard && git checkout main" &&
2137 git checkout -b plain-bad main &&
2140 git commit -m bar_commit &&
2141 git checkout -b tagged-bad main &&
2144 git commit -m baz_commit &&
2145 git tag -s -m signed_tag_msg signed_tag_bad &&
2146 git cat-file tag signed_tag_bad >raw &&
2147 sed -e "s/signed_tag_msg/forged/" raw >forged &&
2148 git hash-object -w -t tag forged >forged.tag &&
2149 git checkout plain-bad &&
2150 git merge --no-ff -m msg "$(cat forged.tag)" &&
2151 git log --graph --show-signature -n1 plain-bad >actual &&
2152 grep "^|\\\ merged tag" actual &&
2153 grep "^| | gpg: Signature made" actual &&
2154 grep "^| | gpg: BAD signature from" actual
2157 test_expect_success GPG 'log --show-signature for merged tag with GPG failure' '
2158 test_when_finished "git reset --hard && git checkout main" &&
2159 git checkout -b plain-fail main &&
2162 git commit -m bar_commit &&
2163 git checkout -b tagged-fail main &&
2166 git commit -m baz_commit &&
2167 git tag -s -m signed_tag_msg signed_tag_fail &&
2168 git checkout plain-fail &&
2169 git merge --no-ff -m msg signed_tag_fail &&
2170 if ! test_have_prereq VALGRIND
2172 TMPDIR="$(pwd)/bogus" git log --show-signature -n1 plain-fail >actual &&
2173 grep "^merged tag" actual &&
2174 grep "^No signature" actual &&
2175 ! grep "^gpg: Signature made" actual
2179 test_expect_success GPGSM 'log --graph --show-signature for merged tag x509' '
2180 test_when_finished "git reset --hard && git checkout main" &&
2181 test_config gpg.format x509 &&
2182 test_config user.signingkey $GIT_COMMITTER_EMAIL &&
2183 git checkout -b plain-x509 main &&
2186 git commit -m bar_commit &&
2187 git checkout -b tagged-x509 main &&
2190 git commit -m baz_commit &&
2191 git tag -s -m signed_tag_msg signed_tag_x509 &&
2192 git checkout plain-x509 &&
2193 git merge --no-ff -m msg signed_tag_x509 &&
2194 git log --graph --show-signature -n1 plain-x509 >actual &&
2195 grep "^|\\\ merged tag" actual &&
2196 grep "^| | gpgsm: Signature made" actual &&
2197 grep "^| | gpgsm: Good signature" actual
2200 test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 missing key' '
2201 test_when_finished "git reset --hard && git checkout main" &&
2202 test_config gpg.format x509 &&
2203 test_config user.signingkey $GIT_COMMITTER_EMAIL &&
2204 git checkout -b plain-x509-nokey main &&
2207 git commit -m bar_commit &&
2208 git checkout -b tagged-x509-nokey main &&
2211 git commit -m baz_commit &&
2212 git tag -s -m signed_tag_msg signed_tag_x509_nokey &&
2213 git checkout plain-x509-nokey &&
2214 git merge --no-ff -m msg signed_tag_x509_nokey &&
2215 GNUPGHOME=. git log --graph --show-signature -n1 plain-x509-nokey >actual &&
2216 grep "^|\\\ merged tag" actual &&
2217 grep -e "^| | gpgsm: certificate not found" \
2218 -e "^| | gpgsm: failed to find the certificate: Not found" actual
2221 test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 bad signature' '
2222 test_when_finished "git reset --hard && git checkout main" &&
2223 test_config gpg.format x509 &&
2224 test_config user.signingkey $GIT_COMMITTER_EMAIL &&
2225 git checkout -b plain-x509-bad main &&
2228 git commit -m bar_commit &&
2229 git checkout -b tagged-x509-bad main &&
2232 git commit -m baz_commit &&
2233 git tag -s -m signed_tag_msg signed_tag_x509_bad &&
2234 git cat-file tag signed_tag_x509_bad >raw &&
2235 sed -e "s/signed_tag_msg/forged/" raw >forged &&
2236 git hash-object -w -t tag forged >forged.tag &&
2237 git checkout plain-x509-bad &&
2238 git merge --no-ff -m msg "$(cat forged.tag)" &&
2239 git log --graph --show-signature -n1 plain-x509-bad >actual &&
2240 grep "^|\\\ merged tag" actual &&
2241 grep "^| | gpgsm: Signature made" actual &&
2242 grep "^| | gpgsm: invalid signature" actual
2246 test_expect_success GPG '--no-show-signature overrides --show-signature' '
2247 git log -1 --show-signature --no-show-signature signed >actual &&
2248 ! grep "^gpg:" actual
2251 test_expect_success GPG 'log.showsignature=true behaves like --show-signature' '
2252 test_config log.showsignature true &&
2253 git log -1 signed >actual &&
2254 grep "gpg: Signature made" actual &&
2255 grep "gpg: Good signature" actual
2258 test_expect_success GPG '--no-show-signature overrides log.showsignature=true' '
2259 test_config log.showsignature true &&
2260 git log -1 --no-show-signature signed >actual &&
2261 ! grep "^gpg:" actual
2264 test_expect_success GPG '--show-signature overrides log.showsignature=false' '
2265 test_config log.showsignature false &&
2266 git log -1 --show-signature signed >actual &&
2267 grep "gpg: Signature made" actual &&
2268 grep "gpg: Good signature" actual
2271 test_expect_success 'log --graph --no-walk is forbidden' '
2272 test_must_fail git log --graph --no-walk
2275 test_expect_success 'log on empty repo fails' '
2277 test_when_finished "rm -rf empty" &&
2278 test_must_fail git -C empty log 2>stderr &&
2279 test_grep does.not.have.any.commits stderr
2282 test_expect_success 'log does not default to HEAD when rev input is given' '
2283 git log --branches=does-not-exist >actual &&
2284 test_must_be_empty actual
2287 test_expect_success 'do not default to HEAD with ignored object on cmdline' '
2288 git log --ignore-missing $ZERO_OID >actual &&
2289 test_must_be_empty actual
2292 test_expect_success 'do not default to HEAD with ignored object on stdin' '
2293 echo $ZERO_OID | git log --ignore-missing --stdin >actual &&
2294 test_must_be_empty actual
2297 test_expect_success 'set up --source tests' '
2298 git checkout --orphan source-a &&
2301 git checkout -b source-b HEAD^ &&
2305 test_expect_success 'log --source paints branch names' '
2306 cat >expect <<-EOF &&
2307 $(git rev-parse --short :/three) source-b three
2308 $(git rev-parse --short :/two ) source-a two
2309 $(git rev-parse --short :/one ) source-b one
2311 git log --oneline --source source-a source-b >actual &&
2312 test_cmp expect actual
2315 test_expect_success 'log --source paints tag names' '
2316 git tag -m tagged source-tag &&
2317 cat >expect <<-EOF &&
2318 $(git rev-parse --short :/three) source-tag three
2319 $(git rev-parse --short :/two ) source-a two
2320 $(git rev-parse --short :/one ) source-tag one
2322 git log --oneline --source source-tag source-a >actual &&
2323 test_cmp expect actual
2326 test_expect_success 'log --source paints symmetric ranges' '
2327 cat >expect <<-EOF &&
2328 $(git rev-parse --short :/three) source-b three
2329 $(git rev-parse --short :/two ) source-a two
2331 git log --oneline --source source-a...source-b >actual &&
2332 test_cmp expect actual
2335 test_expect_success '--exclude-promisor-objects does not BUG-crash' '
2336 test_must_fail git log --exclude-promisor-objects source-a
2339 test_expect_success 'log --decorate includes all levels of tag annotated tags' '
2340 git checkout -b branch &&
2341 git commit --allow-empty -m "new commit" &&
2342 git tag lightweight HEAD &&
2343 git tag -m annotated annotated HEAD &&
2344 git tag -m double-0 double-0 HEAD &&
2345 git tag -m double-1 double-1 double-0 &&
2346 cat >expect <<-\EOF &&
2347 HEAD -> branch
, tag
: lightweight
, tag
: double-1
, tag
: double-0
, tag
: annotated
2349 git log
-1 --format="%D" >actual
&&
2350 test_cmp expect actual
2353 test_expect_success 'log
--decorate does not include things outside filter
' '
2354 reflist
="refs/prefetch refs/rebase-merge refs/bundle" &&
2358 git update-ref
$ref/fake HEAD ||
return 1
2361 git log
--decorate=full
--oneline >actual
&&
2363 # None of the refs are visible:
2367 test_expect_success 'log
--end-of-options' '
2368 git update-ref refs
/heads
/--source HEAD
&&
2369 git log
--end-of-options --source >actual
&&
2371 test_cmp expect actual
2374 test_expect_success 'set up commits with different authors
' '
2375 git checkout
--orphan authors
&&
2376 test_commit
--author "Jim <jim@example.com>" jim_1
&&
2377 test_commit
--author "Val <val@example.com>" val_1
&&
2378 test_commit
--author "Val <val@example.com>" val_2
&&
2379 test_commit
--author "Jim <jim@example.com>" jim_2
&&
2380 test_commit
--author "Val <val@example.com>" val_3
&&
2381 test_commit
--author "Jim <jim@example.com>" jim_3
2384 test_expect_success 'log
--invert-grep --grep --author' '
2385 cat >expect
<<-\EOF &&
2389 git log --format=%s --author=Val --grep 2 --invert-grep >actual &&
2390 test_cmp expect actual