t / t4202-log.shon commit Merge branch 'jk/alternate-ref-optim' (b9c2919)
   1#!/bin/sh
   2
   3test_description='git log'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY/lib-gpg.sh"
   7
   8test_expect_success setup '
   9
  10        echo one >one &&
  11        git add one &&
  12        test_tick &&
  13        git commit -m initial &&
  14
  15        echo ichi >one &&
  16        git add one &&
  17        test_tick &&
  18        git commit -m second &&
  19
  20        git mv one ichi &&
  21        test_tick &&
  22        git commit -m third &&
  23
  24        cp ichi ein &&
  25        git add ein &&
  26        test_tick &&
  27        git commit -m fourth &&
  28
  29        mkdir a &&
  30        echo ni >a/two &&
  31        git add a/two &&
  32        test_tick &&
  33        git commit -m fifth  &&
  34
  35        git rm a/two &&
  36        test_tick &&
  37        git commit -m sixth
  38
  39'
  40
  41printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
  42test_expect_success 'pretty' '
  43
  44        git log --pretty="format:%s" > actual &&
  45        test_cmp expect actual
  46'
  47
  48printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
  49test_expect_success 'pretty (tformat)' '
  50
  51        git log --pretty="tformat:%s" > actual &&
  52        test_cmp expect actual
  53'
  54
  55test_expect_success 'pretty (shortcut)' '
  56
  57        git log --pretty="%s" > actual &&
  58        test_cmp expect actual
  59'
  60
  61test_expect_success 'format' '
  62
  63        git log --format="%s" > actual &&
  64        test_cmp expect actual
  65'
  66
  67cat > expect << EOF
  68 This is
  69  the sixth
  70  commit.
  71 This is
  72  the fifth
  73  commit.
  74EOF
  75
  76test_expect_success 'format %w(11,1,2)' '
  77
  78        git log -2 --format="%w(11,1,2)This is the %s commit." > actual &&
  79        test_cmp expect actual
  80'
  81
  82test_expect_success 'format %w(,1,2)' '
  83
  84        git log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&
  85        test_cmp expect actual
  86'
  87
  88cat > expect << EOF
  89804a787 sixth
  90394ef78 fifth
  915d31159 fourth
  922fbe8c0 third
  93f7dab8e second
  943a2fdcb initial
  95EOF
  96test_expect_success 'oneline' '
  97
  98        git log --oneline > actual &&
  99        test_cmp expect actual
 100'
 101
 102test_expect_success 'diff-filter=A' '
 103
 104        git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
 105        git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
 106        printf "fifth\nfourth\nthird\ninitial" > expect &&
 107        test_cmp expect actual &&
 108        test_cmp expect actual-separate
 109
 110'
 111
 112test_expect_success 'diff-filter=M' '
 113
 114        actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
 115        expect=$(echo second) &&
 116        verbose test "$actual" = "$expect"
 117
 118'
 119
 120test_expect_success 'diff-filter=D' '
 121
 122        actual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&
 123        expect=$(echo sixth ; echo third) &&
 124        verbose test "$actual" = "$expect"
 125
 126'
 127
 128test_expect_success 'diff-filter=R' '
 129
 130        actual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&
 131        expect=$(echo third) &&
 132        verbose test "$actual" = "$expect"
 133
 134'
 135
 136test_expect_success 'diff-filter=C' '
 137
 138        actual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&
 139        expect=$(echo fourth) &&
 140        verbose test "$actual" = "$expect"
 141
 142'
 143
 144test_expect_success 'git log --follow' '
 145
 146        actual=$(git log --follow --pretty="format:%s" ichi) &&
 147        expect=$(echo third ; echo second ; echo initial) &&
 148        verbose test "$actual" = "$expect"
 149'
 150
 151test_expect_success 'git config log.follow works like --follow' '
 152        test_config log.follow true &&
 153        actual=$(git log --pretty="format:%s" ichi) &&
 154        expect=$(echo third ; echo second ; echo initial) &&
 155        verbose test "$actual" = "$expect"
 156'
 157
 158test_expect_success 'git config log.follow does not die with multiple paths' '
 159        test_config log.follow true &&
 160        git log --pretty="format:%s" ichi ein
 161'
 162
 163test_expect_success 'git config log.follow does not die with no paths' '
 164        test_config log.follow true &&
 165        git log --
 166'
 167
 168test_expect_success 'git config log.follow is overridden by --no-follow' '
 169        test_config log.follow true &&
 170        actual=$(git log --no-follow --pretty="format:%s" ichi) &&
 171        expect="third" &&
 172        verbose test "$actual" = "$expect"
 173'
 174
 175cat > expect << EOF
 176804a787 sixth
 177394ef78 fifth
 1785d31159 fourth
 179EOF
 180test_expect_success 'git log --no-walk <commits> sorts by commit time' '
 181        git log --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
 182        test_cmp expect actual
 183'
 184
 185test_expect_success 'git log --no-walk=sorted <commits> sorts by commit time' '
 186        git log --no-walk=sorted --oneline 5d31159 804a787 394ef78 > actual &&
 187        test_cmp expect actual
 188'
 189
 190cat > expect << EOF
 191=== 804a787 sixth
 192=== 394ef78 fifth
 193=== 5d31159 fourth
 194EOF
 195test_expect_success 'git log --line-prefix="=== " --no-walk <commits> sorts by commit time' '
 196        git log --line-prefix="=== " --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
 197        test_cmp expect actual
 198'
 199
 200cat > expect << EOF
 2015d31159 fourth
 202804a787 sixth
 203394ef78 fifth
 204EOF
 205test_expect_success 'git log --no-walk=unsorted <commits> leaves list of commits as given' '
 206        git log --no-walk=unsorted --oneline 5d31159 804a787 394ef78 > actual &&
 207        test_cmp expect actual
 208'
 209
 210test_expect_success 'git show <commits> leaves list of commits as given' '
 211        git show --oneline -s 5d31159 804a787 394ef78 > actual &&
 212        test_cmp expect actual
 213'
 214
 215test_expect_success 'setup case sensitivity tests' '
 216        echo case >one &&
 217        test_tick &&
 218        git add one &&
 219        git commit -a -m Second
 220'
 221
 222test_expect_success 'log --grep' '
 223        echo second >expect &&
 224        git log -1 --pretty="tformat:%s" --grep=sec >actual &&
 225        test_cmp expect actual
 226'
 227
 228cat > expect << EOF
 229second
 230initial
 231EOF
 232test_expect_success 'log --invert-grep --grep' '
 233        git log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&
 234        test_cmp expect actual
 235'
 236
 237test_expect_success 'log --invert-grep --grep -i' '
 238        echo initial >expect &&
 239        git log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&
 240        test_cmp expect actual
 241'
 242
 243test_expect_success 'log --grep option parsing' '
 244        echo second >expect &&
 245        git log -1 --pretty="tformat:%s" --grep sec >actual &&
 246        test_cmp expect actual &&
 247        test_must_fail git log -1 --pretty="tformat:%s" --grep
 248'
 249
 250test_expect_success 'log -i --grep' '
 251        echo Second >expect &&
 252        git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&
 253        test_cmp expect actual
 254'
 255
 256test_expect_success 'log --grep -i' '
 257        echo Second >expect &&
 258        git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
 259        test_cmp expect actual
 260'
 261
 262test_expect_success 'log -F -E --grep=<ere> uses ere' '
 263        echo second >expect &&
 264        git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual &&
 265        test_cmp expect actual
 266'
 267
 268test_expect_success 'log with grep.patternType configuration' '
 269        >expect &&
 270        git -c grep.patterntype=fixed \
 271        log -1 --pretty=tformat:%s --grep=s.c.nd >actual &&
 272        test_cmp expect actual
 273'
 274
 275test_expect_success 'log with grep.patternType configuration and command line' '
 276        echo second >expect &&
 277        git -c grep.patterntype=fixed \
 278        log -1 --pretty=tformat:%s --basic-regexp --grep=s.c.nd >actual &&
 279        test_cmp expect actual
 280'
 281
 282cat > expect <<EOF
 283* Second
 284* sixth
 285* fifth
 286* fourth
 287* third
 288* second
 289* initial
 290EOF
 291
 292test_expect_success 'simple log --graph' '
 293        git log --graph --pretty=tformat:%s >actual &&
 294        test_cmp expect actual
 295'
 296
 297cat > expect <<EOF
 298123 * Second
 299123 * sixth
 300123 * fifth
 301123 * fourth
 302123 * third
 303123 * second
 304123 * initial
 305EOF
 306
 307test_expect_success 'simple log --graph --line-prefix="123 "' '
 308        git log --graph --line-prefix="123 " --pretty=tformat:%s >actual &&
 309        test_cmp expect actual
 310'
 311
 312test_expect_success 'set up merge history' '
 313        git checkout -b side HEAD~4 &&
 314        test_commit side-1 1 1 &&
 315        test_commit side-2 2 2 &&
 316        git checkout master &&
 317        git merge side
 318'
 319
 320cat > expect <<\EOF
 321*   Merge branch 'side'
 322|\
 323| * side-2
 324| * side-1
 325* | Second
 326* | sixth
 327* | fifth
 328* | fourth
 329|/
 330* third
 331* second
 332* initial
 333EOF
 334
 335test_expect_success 'log --graph with merge' '
 336        git log --graph --date-order --pretty=tformat:%s |
 337                sed "s/ *\$//" >actual &&
 338        test_cmp expect actual
 339'
 340
 341cat > expect <<\EOF
 342| | | *   Merge branch 'side'
 343| | | |\
 344| | | | * side-2
 345| | | | * side-1
 346| | | * | Second
 347| | | * | sixth
 348| | | * | fifth
 349| | | * | fourth
 350| | | |/
 351| | | * third
 352| | | * second
 353| | | * initial
 354EOF
 355
 356test_expect_success 'log --graph --line-prefix="| | | " with merge' '
 357        git log --line-prefix="| | | " --graph --date-order --pretty=tformat:%s |
 358                sed "s/ *\$//" >actual &&
 359        test_cmp expect actual
 360'
 361
 362cat > expect.colors <<\EOF
 363*   Merge branch 'side'
 364<BLUE>|<RESET><CYAN>\<RESET>
 365<BLUE>|<RESET> * side-2
 366<BLUE>|<RESET> * side-1
 367* <CYAN>|<RESET> Second
 368* <CYAN>|<RESET> sixth
 369* <CYAN>|<RESET> fifth
 370* <CYAN>|<RESET> fourth
 371<CYAN>|<RESET><CYAN>/<RESET>
 372* third
 373* second
 374* initial
 375EOF
 376
 377test_expect_success 'log --graph with merge with log.graphColors' '
 378        test_config log.graphColors " blue,invalid-color, cyan, red  , " &&
 379        git log --color=always --graph --date-order --pretty=tformat:%s |
 380                test_decode_color | sed "s/ *\$//" >actual &&
 381        test_cmp expect.colors actual
 382'
 383
 384test_expect_success 'log --raw --graph -m with merge' '
 385        git log --raw --graph --oneline -m master | head -n 500 >actual &&
 386        grep "initial" actual
 387'
 388
 389test_expect_success 'diff-tree --graph' '
 390        git diff-tree --graph master^ | head -n 500 >actual &&
 391        grep "one" actual
 392'
 393
 394cat > expect <<\EOF
 395*   commit master
 396|\  Merge: A B
 397| | Author: A U Thor <author@example.com>
 398| |
 399| |     Merge branch 'side'
 400| |
 401| * commit side
 402| | Author: A U Thor <author@example.com>
 403| |
 404| |     side-2
 405| |
 406| * commit tags/side-1
 407| | Author: A U Thor <author@example.com>
 408| |
 409| |     side-1
 410| |
 411* | commit master~1
 412| | Author: A U Thor <author@example.com>
 413| |
 414| |     Second
 415| |
 416* | commit master~2
 417| | Author: A U Thor <author@example.com>
 418| |
 419| |     sixth
 420| |
 421* | commit master~3
 422| | Author: A U Thor <author@example.com>
 423| |
 424| |     fifth
 425| |
 426* | commit master~4
 427|/  Author: A U Thor <author@example.com>
 428|
 429|       fourth
 430|
 431* commit tags/side-1~1
 432| Author: A U Thor <author@example.com>
 433|
 434|     third
 435|
 436* commit tags/side-1~2
 437| Author: A U Thor <author@example.com>
 438|
 439|     second
 440|
 441* commit tags/side-1~3
 442  Author: A U Thor <author@example.com>
 443
 444      initial
 445EOF
 446
 447test_expect_success 'log --graph with full output' '
 448        git log --graph --date-order --pretty=short |
 449                git name-rev --name-only --stdin |
 450                sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual &&
 451        test_cmp expect actual
 452'
 453
 454test_expect_success 'set up more tangled history' '
 455        git checkout -b tangle HEAD~6 &&
 456        test_commit tangle-a tangle-a a &&
 457        git merge master~3 &&
 458        git merge side~1 &&
 459        git checkout master &&
 460        git merge tangle &&
 461        git checkout -b reach &&
 462        test_commit reach &&
 463        git checkout master &&
 464        git checkout -b octopus-a &&
 465        test_commit octopus-a &&
 466        git checkout master &&
 467        git checkout -b octopus-b &&
 468        test_commit octopus-b &&
 469        git checkout master &&
 470        test_commit seventh &&
 471        git merge octopus-a octopus-b &&
 472        git merge reach
 473'
 474
 475cat > expect <<\EOF
 476*   Merge tag 'reach'
 477|\
 478| \
 479|  \
 480*-. \   Merge tags 'octopus-a' and 'octopus-b'
 481|\ \ \
 482* | | | seventh
 483| | * | octopus-b
 484| |/ /
 485|/| |
 486| * | octopus-a
 487|/ /
 488| * reach
 489|/
 490*   Merge branch 'tangle'
 491|\
 492| *   Merge branch 'side' (early part) into tangle
 493| |\
 494| * \   Merge branch 'master' (early part) into tangle
 495| |\ \
 496| * | | tangle-a
 497* | | |   Merge branch 'side'
 498|\ \ \ \
 499| * | | | side-2
 500| | |_|/
 501| |/| |
 502| * | | side-1
 503* | | | Second
 504* | | | sixth
 505| |_|/
 506|/| |
 507* | | fifth
 508* | | fourth
 509|/ /
 510* | third
 511|/
 512* second
 513* initial
 514EOF
 515
 516test_expect_success 'log --graph with merge' '
 517        git log --graph --date-order --pretty=tformat:%s |
 518                sed "s/ *\$//" >actual &&
 519        test_cmp expect actual
 520'
 521
 522test_expect_success 'log.decorate configuration' '
 523        git log --oneline >expect.none &&
 524        git log --oneline --decorate >expect.short &&
 525        git log --oneline --decorate=full >expect.full &&
 526
 527        echo "[log] decorate" >>.git/config &&
 528        git log --oneline >actual &&
 529        test_cmp expect.short actual &&
 530
 531        test_config log.decorate true &&
 532        git log --oneline >actual &&
 533        test_cmp expect.short actual &&
 534        git log --oneline --decorate=full >actual &&
 535        test_cmp expect.full actual &&
 536        git log --oneline --decorate=no >actual &&
 537        test_cmp expect.none actual &&
 538
 539        test_config log.decorate no &&
 540        git log --oneline >actual &&
 541        test_cmp expect.none actual &&
 542        git log --oneline --decorate >actual &&
 543        test_cmp expect.short actual &&
 544        git log --oneline --decorate=full >actual &&
 545        test_cmp expect.full actual &&
 546
 547        test_config log.decorate 1 &&
 548        git log --oneline >actual &&
 549        test_cmp expect.short actual &&
 550        git log --oneline --decorate=full >actual &&
 551        test_cmp expect.full actual &&
 552        git log --oneline --decorate=no >actual &&
 553        test_cmp expect.none actual &&
 554
 555        test_config log.decorate short &&
 556        git log --oneline >actual &&
 557        test_cmp expect.short actual &&
 558        git log --oneline --no-decorate >actual &&
 559        test_cmp expect.none actual &&
 560        git log --oneline --decorate=full >actual &&
 561        test_cmp expect.full actual &&
 562
 563        test_config log.decorate full &&
 564        git log --oneline >actual &&
 565        test_cmp expect.full actual &&
 566        git log --oneline --no-decorate >actual &&
 567        test_cmp expect.none actual &&
 568        git log --oneline --decorate >actual &&
 569        test_cmp expect.short actual &&
 570
 571        test_unconfig log.decorate &&
 572        git log --pretty=raw >expect.raw &&
 573        test_config log.decorate full &&
 574        git log --pretty=raw >actual &&
 575        test_cmp expect.raw actual
 576
 577'
 578
 579test_expect_success 'reflog is expected format' '
 580        git log -g --abbrev-commit --pretty=oneline >expect &&
 581        git reflog >actual &&
 582        test_cmp expect actual
 583'
 584
 585test_expect_success 'whatchanged is expected format' '
 586        git log --no-merges --raw >expect &&
 587        git whatchanged >actual &&
 588        test_cmp expect actual
 589'
 590
 591test_expect_success 'log.abbrevCommit configuration' '
 592        git log --abbrev-commit >expect.log.abbrev &&
 593        git log --no-abbrev-commit >expect.log.full &&
 594        git log --pretty=raw >expect.log.raw &&
 595        git reflog --abbrev-commit >expect.reflog.abbrev &&
 596        git reflog --no-abbrev-commit >expect.reflog.full &&
 597        git whatchanged --abbrev-commit >expect.whatchanged.abbrev &&
 598        git whatchanged --no-abbrev-commit >expect.whatchanged.full &&
 599
 600        test_config log.abbrevCommit true &&
 601
 602        git log >actual &&
 603        test_cmp expect.log.abbrev actual &&
 604        git log --no-abbrev-commit >actual &&
 605        test_cmp expect.log.full actual &&
 606
 607        git log --pretty=raw >actual &&
 608        test_cmp expect.log.raw actual &&
 609
 610        git reflog >actual &&
 611        test_cmp expect.reflog.abbrev actual &&
 612        git reflog --no-abbrev-commit >actual &&
 613        test_cmp expect.reflog.full actual &&
 614
 615        git whatchanged >actual &&
 616        test_cmp expect.whatchanged.abbrev actual &&
 617        git whatchanged --no-abbrev-commit >actual &&
 618        test_cmp expect.whatchanged.full actual
 619'
 620
 621test_expect_success 'show added path under "--follow -M"' '
 622        # This tests for a regression introduced in v1.7.2-rc0~103^2~2
 623        test_create_repo regression &&
 624        (
 625                cd regression &&
 626                test_commit needs-another-commit &&
 627                test_commit foo.bar &&
 628                git log -M --follow -p foo.bar.t &&
 629                git log -M --follow --stat foo.bar.t &&
 630                git log -M --follow --name-only foo.bar.t
 631        )
 632'
 633
 634test_expect_success 'git log -c --follow' '
 635        test_create_repo follow-c &&
 636        (
 637                cd follow-c &&
 638                test_commit initial file original &&
 639                git rm file &&
 640                test_commit rename file2 original &&
 641                git reset --hard initial &&
 642                test_commit modify file foo &&
 643                git merge -m merge rename &&
 644                git log -c --follow file2
 645        )
 646'
 647
 648cat >expect <<\EOF
 649*   commit COMMIT_OBJECT_NAME
 650|\  Merge: MERGE_PARENTS
 651| | Author: A U Thor <author@example.com>
 652| |
 653| |     Merge HEADS DESCRIPTION
 654| |
 655| * commit COMMIT_OBJECT_NAME
 656| | Author: A U Thor <author@example.com>
 657| |
 658| |     reach
 659| | ---
 660| |  reach.t | 1 +
 661| |  1 file changed, 1 insertion(+)
 662| |
 663| | diff --git a/reach.t b/reach.t
 664| | new file mode 100644
 665| | index 0000000..10c9591
 666| | --- /dev/null
 667| | +++ b/reach.t
 668| | @@ -0,0 +1 @@
 669| | +reach
 670| |
 671|  \
 672*-. \   commit COMMIT_OBJECT_NAME
 673|\ \ \  Merge: MERGE_PARENTS
 674| | | | Author: A U Thor <author@example.com>
 675| | | |
 676| | | |     Merge HEADS DESCRIPTION
 677| | | |
 678| | * | commit COMMIT_OBJECT_NAME
 679| | |/  Author: A U Thor <author@example.com>
 680| | |
 681| | |       octopus-b
 682| | |   ---
 683| | |    octopus-b.t | 1 +
 684| | |    1 file changed, 1 insertion(+)
 685| | |
 686| | |   diff --git a/octopus-b.t b/octopus-b.t
 687| | |   new file mode 100644
 688| | |   index 0000000..d5fcad0
 689| | |   --- /dev/null
 690| | |   +++ b/octopus-b.t
 691| | |   @@ -0,0 +1 @@
 692| | |   +octopus-b
 693| | |
 694| * | commit COMMIT_OBJECT_NAME
 695| |/  Author: A U Thor <author@example.com>
 696| |
 697| |       octopus-a
 698| |   ---
 699| |    octopus-a.t | 1 +
 700| |    1 file changed, 1 insertion(+)
 701| |
 702| |   diff --git a/octopus-a.t b/octopus-a.t
 703| |   new file mode 100644
 704| |   index 0000000..11ee015
 705| |   --- /dev/null
 706| |   +++ b/octopus-a.t
 707| |   @@ -0,0 +1 @@
 708| |   +octopus-a
 709| |
 710* | commit COMMIT_OBJECT_NAME
 711|/  Author: A U Thor <author@example.com>
 712|
 713|       seventh
 714|   ---
 715|    seventh.t | 1 +
 716|    1 file changed, 1 insertion(+)
 717|
 718|   diff --git a/seventh.t b/seventh.t
 719|   new file mode 100644
 720|   index 0000000..9744ffc
 721|   --- /dev/null
 722|   +++ b/seventh.t
 723|   @@ -0,0 +1 @@
 724|   +seventh
 725|
 726*   commit COMMIT_OBJECT_NAME
 727|\  Merge: MERGE_PARENTS
 728| | Author: A U Thor <author@example.com>
 729| |
 730| |     Merge branch 'tangle'
 731| |
 732| *   commit COMMIT_OBJECT_NAME
 733| |\  Merge: MERGE_PARENTS
 734| | | Author: A U Thor <author@example.com>
 735| | |
 736| | |     Merge branch 'side' (early part) into tangle
 737| | |
 738| * |   commit COMMIT_OBJECT_NAME
 739| |\ \  Merge: MERGE_PARENTS
 740| | | | Author: A U Thor <author@example.com>
 741| | | |
 742| | | |     Merge branch 'master' (early part) into tangle
 743| | | |
 744| * | | commit COMMIT_OBJECT_NAME
 745| | | | Author: A U Thor <author@example.com>
 746| | | |
 747| | | |     tangle-a
 748| | | | ---
 749| | | |  tangle-a | 1 +
 750| | | |  1 file changed, 1 insertion(+)
 751| | | |
 752| | | | diff --git a/tangle-a b/tangle-a
 753| | | | new file mode 100644
 754| | | | index 0000000..7898192
 755| | | | --- /dev/null
 756| | | | +++ b/tangle-a
 757| | | | @@ -0,0 +1 @@
 758| | | | +a
 759| | | |
 760* | | |   commit COMMIT_OBJECT_NAME
 761|\ \ \ \  Merge: MERGE_PARENTS
 762| | | | | Author: A U Thor <author@example.com>
 763| | | | |
 764| | | | |     Merge branch 'side'
 765| | | | |
 766| * | | | commit COMMIT_OBJECT_NAME
 767| | |_|/  Author: A U Thor <author@example.com>
 768| |/| |
 769| | | |       side-2
 770| | | |   ---
 771| | | |    2 | 1 +
 772| | | |    1 file changed, 1 insertion(+)
 773| | | |
 774| | | |   diff --git a/2 b/2
 775| | | |   new file mode 100644
 776| | | |   index 0000000..0cfbf08
 777| | | |   --- /dev/null
 778| | | |   +++ b/2
 779| | | |   @@ -0,0 +1 @@
 780| | | |   +2
 781| | | |
 782| * | | commit COMMIT_OBJECT_NAME
 783| | | | Author: A U Thor <author@example.com>
 784| | | |
 785| | | |     side-1
 786| | | | ---
 787| | | |  1 | 1 +
 788| | | |  1 file changed, 1 insertion(+)
 789| | | |
 790| | | | diff --git a/1 b/1
 791| | | | new file mode 100644
 792| | | | index 0000000..d00491f
 793| | | | --- /dev/null
 794| | | | +++ b/1
 795| | | | @@ -0,0 +1 @@
 796| | | | +1
 797| | | |
 798* | | | commit COMMIT_OBJECT_NAME
 799| | | | Author: A U Thor <author@example.com>
 800| | | |
 801| | | |     Second
 802| | | | ---
 803| | | |  one | 1 +
 804| | | |  1 file changed, 1 insertion(+)
 805| | | |
 806| | | | diff --git a/one b/one
 807| | | | new file mode 100644
 808| | | | index 0000000..9a33383
 809| | | | --- /dev/null
 810| | | | +++ b/one
 811| | | | @@ -0,0 +1 @@
 812| | | | +case
 813| | | |
 814* | | | commit COMMIT_OBJECT_NAME
 815| |_|/  Author: A U Thor <author@example.com>
 816|/| |
 817| | |       sixth
 818| | |   ---
 819| | |    a/two | 1 -
 820| | |    1 file changed, 1 deletion(-)
 821| | |
 822| | |   diff --git a/a/two b/a/two
 823| | |   deleted file mode 100644
 824| | |   index 9245af5..0000000
 825| | |   --- a/a/two
 826| | |   +++ /dev/null
 827| | |   @@ -1 +0,0 @@
 828| | |   -ni
 829| | |
 830* | | commit COMMIT_OBJECT_NAME
 831| | | Author: A U Thor <author@example.com>
 832| | |
 833| | |     fifth
 834| | | ---
 835| | |  a/two | 1 +
 836| | |  1 file changed, 1 insertion(+)
 837| | |
 838| | | diff --git a/a/two b/a/two
 839| | | new file mode 100644
 840| | | index 0000000..9245af5
 841| | | --- /dev/null
 842| | | +++ b/a/two
 843| | | @@ -0,0 +1 @@
 844| | | +ni
 845| | |
 846* | | commit COMMIT_OBJECT_NAME
 847|/ /  Author: A U Thor <author@example.com>
 848| |
 849| |       fourth
 850| |   ---
 851| |    ein | 1 +
 852| |    1 file changed, 1 insertion(+)
 853| |
 854| |   diff --git a/ein b/ein
 855| |   new file mode 100644
 856| |   index 0000000..9d7e69f
 857| |   --- /dev/null
 858| |   +++ b/ein
 859| |   @@ -0,0 +1 @@
 860| |   +ichi
 861| |
 862* | commit COMMIT_OBJECT_NAME
 863|/  Author: A U Thor <author@example.com>
 864|
 865|       third
 866|   ---
 867|    ichi | 1 +
 868|    one  | 1 -
 869|    2 files changed, 1 insertion(+), 1 deletion(-)
 870|
 871|   diff --git a/ichi b/ichi
 872|   new file mode 100644
 873|   index 0000000..9d7e69f
 874|   --- /dev/null
 875|   +++ b/ichi
 876|   @@ -0,0 +1 @@
 877|   +ichi
 878|   diff --git a/one b/one
 879|   deleted file mode 100644
 880|   index 9d7e69f..0000000
 881|   --- a/one
 882|   +++ /dev/null
 883|   @@ -1 +0,0 @@
 884|   -ichi
 885|
 886* commit COMMIT_OBJECT_NAME
 887| Author: A U Thor <author@example.com>
 888|
 889|     second
 890| ---
 891|  one | 2 +-
 892|  1 file changed, 1 insertion(+), 1 deletion(-)
 893|
 894| diff --git a/one b/one
 895| index 5626abf..9d7e69f 100644
 896| --- a/one
 897| +++ b/one
 898| @@ -1 +1 @@
 899| -one
 900| +ichi
 901|
 902* commit COMMIT_OBJECT_NAME
 903  Author: A U Thor <author@example.com>
 904
 905      initial
 906  ---
 907   one | 1 +
 908   1 file changed, 1 insertion(+)
 909
 910  diff --git a/one b/one
 911  new file mode 100644
 912  index 0000000..5626abf
 913  --- /dev/null
 914  +++ b/one
 915  @@ -0,0 +1 @@
 916  +one
 917EOF
 918
 919sanitize_output () {
 920        sed -e 's/ *$//' \
 921            -e 's/commit [0-9a-f]*$/commit COMMIT_OBJECT_NAME/' \
 922            -e 's/Merge: [ 0-9a-f]*$/Merge: MERGE_PARENTS/' \
 923            -e 's/Merge tag.*/Merge HEADS DESCRIPTION/' \
 924            -e 's/Merge commit.*/Merge HEADS DESCRIPTION/' \
 925            -e 's/, 0 deletions(-)//' \
 926            -e 's/, 0 insertions(+)//' \
 927            -e 's/ 1 files changed, / 1 file changed, /' \
 928            -e 's/, 1 deletions(-)/, 1 deletion(-)/' \
 929            -e 's/, 1 insertions(+)/, 1 insertion(+)/'
 930}
 931
 932test_expect_success 'log --graph with diff and stats' '
 933        git log --no-renames --graph --pretty=short --stat -p >actual &&
 934        sanitize_output >actual.sanitized <actual &&
 935        test_i18ncmp expect actual.sanitized
 936'
 937
 938cat >expect <<\EOF
 939*** *   commit COMMIT_OBJECT_NAME
 940*** |\  Merge: MERGE_PARENTS
 941*** | | Author: A U Thor <author@example.com>
 942*** | |
 943*** | |     Merge HEADS DESCRIPTION
 944*** | |
 945*** | * commit COMMIT_OBJECT_NAME
 946*** | | Author: A U Thor <author@example.com>
 947*** | |
 948*** | |     reach
 949*** | | ---
 950*** | |  reach.t | 1 +
 951*** | |  1 file changed, 1 insertion(+)
 952*** | |
 953*** | | diff --git a/reach.t b/reach.t
 954*** | | new file mode 100644
 955*** | | index 0000000..10c9591
 956*** | | --- /dev/null
 957*** | | +++ b/reach.t
 958*** | | @@ -0,0 +1 @@
 959*** | | +reach
 960*** | |
 961*** |  \
 962*** *-. \   commit COMMIT_OBJECT_NAME
 963*** |\ \ \  Merge: MERGE_PARENTS
 964*** | | | | Author: A U Thor <author@example.com>
 965*** | | | |
 966*** | | | |     Merge HEADS DESCRIPTION
 967*** | | | |
 968*** | | * | commit COMMIT_OBJECT_NAME
 969*** | | |/  Author: A U Thor <author@example.com>
 970*** | | |
 971*** | | |       octopus-b
 972*** | | |   ---
 973*** | | |    octopus-b.t | 1 +
 974*** | | |    1 file changed, 1 insertion(+)
 975*** | | |
 976*** | | |   diff --git a/octopus-b.t b/octopus-b.t
 977*** | | |   new file mode 100644
 978*** | | |   index 0000000..d5fcad0
 979*** | | |   --- /dev/null
 980*** | | |   +++ b/octopus-b.t
 981*** | | |   @@ -0,0 +1 @@
 982*** | | |   +octopus-b
 983*** | | |
 984*** | * | commit COMMIT_OBJECT_NAME
 985*** | |/  Author: A U Thor <author@example.com>
 986*** | |
 987*** | |       octopus-a
 988*** | |   ---
 989*** | |    octopus-a.t | 1 +
 990*** | |    1 file changed, 1 insertion(+)
 991*** | |
 992*** | |   diff --git a/octopus-a.t b/octopus-a.t
 993*** | |   new file mode 100644
 994*** | |   index 0000000..11ee015
 995*** | |   --- /dev/null
 996*** | |   +++ b/octopus-a.t
 997*** | |   @@ -0,0 +1 @@
 998*** | |   +octopus-a
 999*** | |
1000*** * | commit COMMIT_OBJECT_NAME
1001*** |/  Author: A U Thor <author@example.com>
1002*** |
1003*** |       seventh
1004*** |   ---
1005*** |    seventh.t | 1 +
1006*** |    1 file changed, 1 insertion(+)
1007*** |
1008*** |   diff --git a/seventh.t b/seventh.t
1009*** |   new file mode 100644
1010*** |   index 0000000..9744ffc
1011*** |   --- /dev/null
1012*** |   +++ b/seventh.t
1013*** |   @@ -0,0 +1 @@
1014*** |   +seventh
1015*** |
1016*** *   commit COMMIT_OBJECT_NAME
1017*** |\  Merge: MERGE_PARENTS
1018*** | | Author: A U Thor <author@example.com>
1019*** | |
1020*** | |     Merge branch 'tangle'
1021*** | |
1022*** | *   commit COMMIT_OBJECT_NAME
1023*** | |\  Merge: MERGE_PARENTS
1024*** | | | Author: A U Thor <author@example.com>
1025*** | | |
1026*** | | |     Merge branch 'side' (early part) into tangle
1027*** | | |
1028*** | * |   commit COMMIT_OBJECT_NAME
1029*** | |\ \  Merge: MERGE_PARENTS
1030*** | | | | Author: A U Thor <author@example.com>
1031*** | | | |
1032*** | | | |     Merge branch 'master' (early part) into tangle
1033*** | | | |
1034*** | * | | commit COMMIT_OBJECT_NAME
1035*** | | | | Author: A U Thor <author@example.com>
1036*** | | | |
1037*** | | | |     tangle-a
1038*** | | | | ---
1039*** | | | |  tangle-a | 1 +
1040*** | | | |  1 file changed, 1 insertion(+)
1041*** | | | |
1042*** | | | | diff --git a/tangle-a b/tangle-a
1043*** | | | | new file mode 100644
1044*** | | | | index 0000000..7898192
1045*** | | | | --- /dev/null
1046*** | | | | +++ b/tangle-a
1047*** | | | | @@ -0,0 +1 @@
1048*** | | | | +a
1049*** | | | |
1050*** * | | |   commit COMMIT_OBJECT_NAME
1051*** |\ \ \ \  Merge: MERGE_PARENTS
1052*** | | | | | Author: A U Thor <author@example.com>
1053*** | | | | |
1054*** | | | | |     Merge branch 'side'
1055*** | | | | |
1056*** | * | | | commit COMMIT_OBJECT_NAME
1057*** | | |_|/  Author: A U Thor <author@example.com>
1058*** | |/| |
1059*** | | | |       side-2
1060*** | | | |   ---
1061*** | | | |    2 | 1 +
1062*** | | | |    1 file changed, 1 insertion(+)
1063*** | | | |
1064*** | | | |   diff --git a/2 b/2
1065*** | | | |   new file mode 100644
1066*** | | | |   index 0000000..0cfbf08
1067*** | | | |   --- /dev/null
1068*** | | | |   +++ b/2
1069*** | | | |   @@ -0,0 +1 @@
1070*** | | | |   +2
1071*** | | | |
1072*** | * | | commit COMMIT_OBJECT_NAME
1073*** | | | | Author: A U Thor <author@example.com>
1074*** | | | |
1075*** | | | |     side-1
1076*** | | | | ---
1077*** | | | |  1 | 1 +
1078*** | | | |  1 file changed, 1 insertion(+)
1079*** | | | |
1080*** | | | | diff --git a/1 b/1
1081*** | | | | new file mode 100644
1082*** | | | | index 0000000..d00491f
1083*** | | | | --- /dev/null
1084*** | | | | +++ b/1
1085*** | | | | @@ -0,0 +1 @@
1086*** | | | | +1
1087*** | | | |
1088*** * | | | commit COMMIT_OBJECT_NAME
1089*** | | | | Author: A U Thor <author@example.com>
1090*** | | | |
1091*** | | | |     Second
1092*** | | | | ---
1093*** | | | |  one | 1 +
1094*** | | | |  1 file changed, 1 insertion(+)
1095*** | | | |
1096*** | | | | diff --git a/one b/one
1097*** | | | | new file mode 100644
1098*** | | | | index 0000000..9a33383
1099*** | | | | --- /dev/null
1100*** | | | | +++ b/one
1101*** | | | | @@ -0,0 +1 @@
1102*** | | | | +case
1103*** | | | |
1104*** * | | | commit COMMIT_OBJECT_NAME
1105*** | |_|/  Author: A U Thor <author@example.com>
1106*** |/| |
1107*** | | |       sixth
1108*** | | |   ---
1109*** | | |    a/two | 1 -
1110*** | | |    1 file changed, 1 deletion(-)
1111*** | | |
1112*** | | |   diff --git a/a/two b/a/two
1113*** | | |   deleted file mode 100644
1114*** | | |   index 9245af5..0000000
1115*** | | |   --- a/a/two
1116*** | | |   +++ /dev/null
1117*** | | |   @@ -1 +0,0 @@
1118*** | | |   -ni
1119*** | | |
1120*** * | | commit COMMIT_OBJECT_NAME
1121*** | | | Author: A U Thor <author@example.com>
1122*** | | |
1123*** | | |     fifth
1124*** | | | ---
1125*** | | |  a/two | 1 +
1126*** | | |  1 file changed, 1 insertion(+)
1127*** | | |
1128*** | | | diff --git a/a/two b/a/two
1129*** | | | new file mode 100644
1130*** | | | index 0000000..9245af5
1131*** | | | --- /dev/null
1132*** | | | +++ b/a/two
1133*** | | | @@ -0,0 +1 @@
1134*** | | | +ni
1135*** | | |
1136*** * | | commit COMMIT_OBJECT_NAME
1137*** |/ /  Author: A U Thor <author@example.com>
1138*** | |
1139*** | |       fourth
1140*** | |   ---
1141*** | |    ein | 1 +
1142*** | |    1 file changed, 1 insertion(+)
1143*** | |
1144*** | |   diff --git a/ein b/ein
1145*** | |   new file mode 100644
1146*** | |   index 0000000..9d7e69f
1147*** | |   --- /dev/null
1148*** | |   +++ b/ein
1149*** | |   @@ -0,0 +1 @@
1150*** | |   +ichi
1151*** | |
1152*** * | commit COMMIT_OBJECT_NAME
1153*** |/  Author: A U Thor <author@example.com>
1154*** |
1155*** |       third
1156*** |   ---
1157*** |    ichi | 1 +
1158*** |    one  | 1 -
1159*** |    2 files changed, 1 insertion(+), 1 deletion(-)
1160*** |
1161*** |   diff --git a/ichi b/ichi
1162*** |   new file mode 100644
1163*** |   index 0000000..9d7e69f
1164*** |   --- /dev/null
1165*** |   +++ b/ichi
1166*** |   @@ -0,0 +1 @@
1167*** |   +ichi
1168*** |   diff --git a/one b/one
1169*** |   deleted file mode 100644
1170*** |   index 9d7e69f..0000000
1171*** |   --- a/one
1172*** |   +++ /dev/null
1173*** |   @@ -1 +0,0 @@
1174*** |   -ichi
1175*** |
1176*** * commit COMMIT_OBJECT_NAME
1177*** | Author: A U Thor <author@example.com>
1178*** |
1179*** |     second
1180*** | ---
1181*** |  one | 2 +-
1182*** |  1 file changed, 1 insertion(+), 1 deletion(-)
1183*** |
1184*** | diff --git a/one b/one
1185*** | index 5626abf..9d7e69f 100644
1186*** | --- a/one
1187*** | +++ b/one
1188*** | @@ -1 +1 @@
1189*** | -one
1190*** | +ichi
1191*** |
1192*** * commit COMMIT_OBJECT_NAME
1193***   Author: A U Thor <author@example.com>
1194***
1195***       initial
1196***   ---
1197***    one | 1 +
1198***    1 file changed, 1 insertion(+)
1199***
1200***   diff --git a/one b/one
1201***   new file mode 100644
1202***   index 0000000..5626abf
1203***   --- /dev/null
1204***   +++ b/one
1205***   @@ -0,0 +1 @@
1206***   +one
1207EOF
1208
1209test_expect_success 'log --line-prefix="*** " --graph with diff and stats' '
1210        git log --line-prefix="*** " --no-renames --graph --pretty=short --stat -p >actual &&
1211        sanitize_output >actual.sanitized <actual &&
1212        test_i18ncmp expect actual.sanitized
1213'
1214
1215cat >expect <<-\EOF
1216* reach
1217|
1218| A     reach.t
1219* Merge branch 'tangle'
1220*   Merge branch 'side'
1221|\
1222| * side-2
1223|
1224|   A   2
1225* Second
1226|
1227| A     one
1228* sixth
1229
1230  D     a/two
1231EOF
1232
1233test_expect_success 'log --graph with --name-status' '
1234        git log --graph --format=%s --name-status tangle..reach >actual &&
1235        sanitize_output <actual >actual.sanitized &&
1236        test_cmp expect actual.sanitized
1237'
1238
1239cat >expect <<-\EOF
1240* reach
1241|
1242| reach.t
1243* Merge branch 'tangle'
1244*   Merge branch 'side'
1245|\
1246| * side-2
1247|
1248|   2
1249* Second
1250|
1251| one
1252* sixth
1253
1254  a/two
1255EOF
1256
1257test_expect_success 'log --graph with --name-only' '
1258        git log --graph --format=%s --name-only tangle..reach >actual &&
1259        sanitize_output <actual >actual.sanitized &&
1260        test_cmp expect actual.sanitized
1261'
1262
1263test_expect_success 'dotdot is a parent directory' '
1264        mkdir -p a/b &&
1265        ( echo sixth && echo fifth ) >expect &&
1266        ( cd a/b && git log --format=%s .. ) >actual &&
1267        test_cmp expect actual
1268'
1269
1270test_expect_success GPG 'setup signed branch' '
1271        test_when_finished "git reset --hard && git checkout master" &&
1272        git checkout -b signed master &&
1273        echo foo >foo &&
1274        git add foo &&
1275        git commit -S -m signed_commit
1276'
1277
1278test_expect_success GPG 'log --graph --show-signature' '
1279        git log --graph --show-signature -n1 signed >actual &&
1280        grep "^| gpg: Signature made" actual &&
1281        grep "^| gpg: Good signature" actual
1282'
1283
1284test_expect_success GPG 'log --graph --show-signature for merged tag' '
1285        test_when_finished "git reset --hard && git checkout master" &&
1286        git checkout -b plain master &&
1287        echo aaa >bar &&
1288        git add bar &&
1289        git commit -m bar_commit &&
1290        git checkout -b tagged master &&
1291        echo bbb >baz &&
1292        git add baz &&
1293        git commit -m baz_commit &&
1294        git tag -s -m signed_tag_msg signed_tag &&
1295        git checkout plain &&
1296        git merge --no-ff -m msg signed_tag &&
1297        git log --graph --show-signature -n1 plain >actual &&
1298        grep "^|\\\  merged tag" actual &&
1299        grep "^| | gpg: Signature made" actual &&
1300        grep "^| | gpg: Good signature" actual
1301'
1302
1303test_expect_success GPG '--no-show-signature overrides --show-signature' '
1304        git log -1 --show-signature --no-show-signature signed >actual &&
1305        ! grep "^gpg:" actual
1306'
1307
1308test_expect_success GPG 'log.showsignature=true behaves like --show-signature' '
1309        test_config log.showsignature true &&
1310        git log -1 signed >actual &&
1311        grep "gpg: Signature made" actual &&
1312        grep "gpg: Good signature" actual
1313'
1314
1315test_expect_success GPG '--no-show-signature overrides log.showsignature=true' '
1316        test_config log.showsignature true &&
1317        git log -1 --no-show-signature signed >actual &&
1318        ! grep "^gpg:" actual
1319'
1320
1321test_expect_success GPG '--show-signature overrides log.showsignature=false' '
1322        test_config log.showsignature false &&
1323        git log -1 --show-signature signed >actual &&
1324        grep "gpg: Signature made" actual &&
1325        grep "gpg: Good signature" actual
1326'
1327
1328test_expect_success 'log --graph --no-walk is forbidden' '
1329        test_must_fail git log --graph --no-walk
1330'
1331
1332test_expect_success 'log diagnoses bogus HEAD' '
1333        git init empty &&
1334        test_must_fail git -C empty log 2>stderr &&
1335        test_i18ngrep does.not.have.any.commits stderr &&
1336        echo 1234abcd >empty/.git/refs/heads/master &&
1337        test_must_fail git -C empty log 2>stderr &&
1338        test_i18ngrep broken stderr &&
1339        echo "ref: refs/heads/invalid.lock" >empty/.git/HEAD &&
1340        test_must_fail git -C empty log 2>stderr &&
1341        test_i18ngrep broken stderr &&
1342        test_must_fail git -C empty log --default totally-bogus 2>stderr &&
1343        test_i18ngrep broken stderr
1344'
1345
1346test_expect_success 'set up --source tests' '
1347        git checkout --orphan source-a &&
1348        test_commit one &&
1349        test_commit two &&
1350        git checkout -b source-b HEAD^ &&
1351        test_commit three
1352'
1353
1354test_expect_success 'log --source paints branch names' '
1355        cat >expect <<-\EOF &&
1356        09e12a9 source-b three
1357        8e393e1 source-a two
1358        1ac6c77 source-b one
1359        EOF
1360        git log --oneline --source source-a source-b >actual &&
1361        test_cmp expect actual
1362'
1363
1364test_expect_success 'log --source paints tag names' '
1365        git tag -m tagged source-tag &&
1366        cat >expect <<-\EOF &&
1367        09e12a9 source-tag three
1368        8e393e1 source-a two
1369        1ac6c77 source-tag one
1370        EOF
1371        git log --oneline --source source-tag source-a >actual &&
1372        test_cmp expect actual
1373'
1374
1375test_done