t / t4202-log.shon commit fix segfault with git log -c --follow (46ec510)
   1#!/bin/sh
   2
   3test_description='git log'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8
   9        echo one >one &&
  10        git add one &&
  11        test_tick &&
  12        git commit -m initial &&
  13
  14        echo ichi >one &&
  15        git add one &&
  16        test_tick &&
  17        git commit -m second &&
  18
  19        git mv one ichi &&
  20        test_tick &&
  21        git commit -m third &&
  22
  23        cp ichi ein &&
  24        git add ein &&
  25        test_tick &&
  26        git commit -m fourth &&
  27
  28        mkdir a &&
  29        echo ni >a/two &&
  30        git add a/two &&
  31        test_tick &&
  32        git commit -m fifth  &&
  33
  34        git rm a/two &&
  35        test_tick &&
  36        git commit -m sixth
  37
  38'
  39
  40printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
  41test_expect_success 'pretty' '
  42
  43        git log --pretty="format:%s" > actual &&
  44        test_cmp expect actual
  45'
  46
  47printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
  48test_expect_success 'pretty (tformat)' '
  49
  50        git log --pretty="tformat:%s" > actual &&
  51        test_cmp expect actual
  52'
  53
  54test_expect_success 'pretty (shortcut)' '
  55
  56        git log --pretty="%s" > actual &&
  57        test_cmp expect actual
  58'
  59
  60test_expect_success 'format' '
  61
  62        git log --format="%s" > actual &&
  63        test_cmp expect actual
  64'
  65
  66cat > expect << EOF
  67 This is
  68  the sixth
  69  commit.
  70 This is
  71  the fifth
  72  commit.
  73EOF
  74
  75test_expect_success 'format %w(11,1,2)' '
  76
  77        git log -2 --format="%w(11,1,2)This is the %s commit." > actual &&
  78        test_cmp expect actual
  79'
  80
  81test_expect_success 'format %w(,1,2)' '
  82
  83        git log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&
  84        test_cmp expect actual
  85'
  86
  87cat > expect << EOF
  88804a787 sixth
  89394ef78 fifth
  905d31159 fourth
  912fbe8c0 third
  92f7dab8e second
  933a2fdcb initial
  94EOF
  95test_expect_success 'oneline' '
  96
  97        git log --oneline > actual &&
  98        test_cmp expect actual
  99'
 100
 101test_expect_success 'diff-filter=A' '
 102
 103        git log --pretty="format:%s" --diff-filter=A HEAD > actual &&
 104        git log --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
 105        printf "fifth\nfourth\nthird\ninitial" > expect &&
 106        test_cmp expect actual &&
 107        test_cmp expect actual-separate
 108
 109'
 110
 111test_expect_success 'diff-filter=M' '
 112
 113        actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
 114        expect=$(echo second) &&
 115        test "$actual" = "$expect" || {
 116                echo Oops
 117                echo "Actual: $actual"
 118                false
 119        }
 120
 121'
 122
 123test_expect_success 'diff-filter=D' '
 124
 125        actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
 126        expect=$(echo sixth ; echo third) &&
 127        test "$actual" = "$expect" || {
 128                echo Oops
 129                echo "Actual: $actual"
 130                false
 131        }
 132
 133'
 134
 135test_expect_success 'diff-filter=R' '
 136
 137        actual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&
 138        expect=$(echo third) &&
 139        test "$actual" = "$expect" || {
 140                echo Oops
 141                echo "Actual: $actual"
 142                false
 143        }
 144
 145'
 146
 147test_expect_success 'diff-filter=C' '
 148
 149        actual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&
 150        expect=$(echo fourth) &&
 151        test "$actual" = "$expect" || {
 152                echo Oops
 153                echo "Actual: $actual"
 154                false
 155        }
 156
 157'
 158
 159test_expect_success 'git log --follow' '
 160
 161        actual=$(git log --follow --pretty="format:%s" ichi) &&
 162        expect=$(echo third ; echo second ; echo initial) &&
 163        test "$actual" = "$expect" || {
 164                echo Oops
 165                echo "Actual: $actual"
 166                false
 167        }
 168
 169'
 170
 171cat > expect << EOF
 172804a787 sixth
 173394ef78 fifth
 1745d31159 fourth
 175EOF
 176test_expect_success 'git log --no-walk <commits> sorts by commit time' '
 177        git log --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
 178        test_cmp expect actual
 179'
 180
 181test_expect_success 'git log --no-walk=sorted <commits> sorts by commit time' '
 182        git log --no-walk=sorted --oneline 5d31159 804a787 394ef78 > actual &&
 183        test_cmp expect actual
 184'
 185
 186cat > expect << EOF
 1875d31159 fourth
 188804a787 sixth
 189394ef78 fifth
 190EOF
 191test_expect_success 'git log --no-walk=unsorted <commits> leaves list of commits as given' '
 192        git log --no-walk=unsorted --oneline 5d31159 804a787 394ef78 > actual &&
 193        test_cmp expect actual
 194'
 195
 196test_expect_success 'git show <commits> leaves list of commits as given' '
 197        git show --oneline -s 5d31159 804a787 394ef78 > actual &&
 198        test_cmp expect actual
 199'
 200
 201test_expect_success 'setup case sensitivity tests' '
 202        echo case >one &&
 203        test_tick &&
 204        git add one &&
 205        git commit -a -m Second
 206'
 207
 208test_expect_success 'log --grep' '
 209        echo second >expect &&
 210        git log -1 --pretty="tformat:%s" --grep=sec >actual &&
 211        test_cmp expect actual
 212'
 213
 214test_expect_success 'log --grep option parsing' '
 215        echo second >expect &&
 216        git log -1 --pretty="tformat:%s" --grep sec >actual &&
 217        test_cmp expect actual &&
 218        test_must_fail git log -1 --pretty="tformat:%s" --grep
 219'
 220
 221test_expect_success 'log -i --grep' '
 222        echo Second >expect &&
 223        git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&
 224        test_cmp expect actual
 225'
 226
 227test_expect_success 'log --grep -i' '
 228        echo Second >expect &&
 229        git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
 230        test_cmp expect actual
 231'
 232
 233test_expect_success 'log -F -E --grep=<ere> uses ere' '
 234        echo second >expect &&
 235        git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual &&
 236        test_cmp expect actual
 237'
 238
 239cat > expect <<EOF
 240* Second
 241* sixth
 242* fifth
 243* fourth
 244* third
 245* second
 246* initial
 247EOF
 248
 249test_expect_success 'simple log --graph' '
 250        git log --graph --pretty=tformat:%s >actual &&
 251        test_cmp expect actual
 252'
 253
 254test_expect_success 'set up merge history' '
 255        git checkout -b side HEAD~4 &&
 256        test_commit side-1 1 1 &&
 257        test_commit side-2 2 2 &&
 258        git checkout master &&
 259        git merge side
 260'
 261
 262cat > expect <<\EOF
 263*   Merge branch 'side'
 264|\
 265| * side-2
 266| * side-1
 267* | Second
 268* | sixth
 269* | fifth
 270* | fourth
 271|/
 272* third
 273* second
 274* initial
 275EOF
 276
 277test_expect_success 'log --graph with merge' '
 278        git log --graph --date-order --pretty=tformat:%s |
 279                sed "s/ *\$//" >actual &&
 280        test_cmp expect actual
 281'
 282
 283test_expect_success 'log --raw --graph -m with merge' '
 284        git log --raw --graph --oneline -m master | head -n 500 >actual &&
 285        grep "initial" actual
 286'
 287
 288test_expect_success 'diff-tree --graph' '
 289        git diff-tree --graph master^ | head -n 500 >actual &&
 290        grep "one" actual
 291'
 292
 293cat > expect <<\EOF
 294*   commit master
 295|\  Merge: A B
 296| | Author: A U Thor <author@example.com>
 297| |
 298| |     Merge branch 'side'
 299| |
 300| * commit side
 301| | Author: A U Thor <author@example.com>
 302| |
 303| |     side-2
 304| |
 305| * commit tags/side-1
 306| | Author: A U Thor <author@example.com>
 307| |
 308| |     side-1
 309| |
 310* | commit master~1
 311| | Author: A U Thor <author@example.com>
 312| |
 313| |     Second
 314| |
 315* | commit master~2
 316| | Author: A U Thor <author@example.com>
 317| |
 318| |     sixth
 319| |
 320* | commit master~3
 321| | Author: A U Thor <author@example.com>
 322| |
 323| |     fifth
 324| |
 325* | commit master~4
 326|/  Author: A U Thor <author@example.com>
 327|
 328|       fourth
 329|
 330* commit tags/side-1~1
 331| Author: A U Thor <author@example.com>
 332|
 333|     third
 334|
 335* commit tags/side-1~2
 336| Author: A U Thor <author@example.com>
 337|
 338|     second
 339|
 340* commit tags/side-1~3
 341  Author: A U Thor <author@example.com>
 342
 343      initial
 344EOF
 345
 346test_expect_success 'log --graph with full output' '
 347        git log --graph --date-order --pretty=short |
 348                git name-rev --name-only --stdin |
 349                sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual &&
 350        test_cmp expect actual
 351'
 352
 353test_expect_success 'set up more tangled history' '
 354        git checkout -b tangle HEAD~6 &&
 355        test_commit tangle-a tangle-a a &&
 356        git merge master~3 &&
 357        git merge side~1 &&
 358        git checkout master &&
 359        git merge tangle &&
 360        git checkout -b reach &&
 361        test_commit reach &&
 362        git checkout master &&
 363        git checkout -b octopus-a &&
 364        test_commit octopus-a &&
 365        git checkout master &&
 366        git checkout -b octopus-b &&
 367        test_commit octopus-b &&
 368        git checkout master &&
 369        test_commit seventh &&
 370        git merge octopus-a octopus-b &&
 371        git merge reach
 372'
 373
 374cat > expect <<\EOF
 375*   Merge tag 'reach'
 376|\
 377| \
 378|  \
 379*-. \   Merge tags 'octopus-a' and 'octopus-b'
 380|\ \ \
 381* | | | seventh
 382| | * | octopus-b
 383| |/ /
 384|/| |
 385| * | octopus-a
 386|/ /
 387| * reach
 388|/
 389*   Merge branch 'tangle'
 390|\
 391| *   Merge branch 'side' (early part) into tangle
 392| |\
 393| * \   Merge branch 'master' (early part) into tangle
 394| |\ \
 395| * | | tangle-a
 396* | | |   Merge branch 'side'
 397|\ \ \ \
 398| * | | | side-2
 399| | |_|/
 400| |/| |
 401| * | | side-1
 402* | | | Second
 403* | | | sixth
 404| |_|/
 405|/| |
 406* | | fifth
 407* | | fourth
 408|/ /
 409* | third
 410|/
 411* second
 412* initial
 413EOF
 414
 415test_expect_success 'log --graph with merge' '
 416        git log --graph --date-order --pretty=tformat:%s |
 417                sed "s/ *\$//" >actual &&
 418        test_cmp expect actual
 419'
 420
 421test_expect_success 'log.decorate configuration' '
 422        test_might_fail git config --unset-all log.decorate &&
 423
 424        git log --oneline >expect.none &&
 425        git log --oneline --decorate >expect.short &&
 426        git log --oneline --decorate=full >expect.full &&
 427
 428        echo "[log] decorate" >>.git/config &&
 429        git log --oneline >actual &&
 430        test_cmp expect.short actual &&
 431
 432        git config --unset-all log.decorate &&
 433        git config log.decorate true &&
 434        git log --oneline >actual &&
 435        test_cmp expect.short actual &&
 436        git log --oneline --decorate=full >actual &&
 437        test_cmp expect.full actual &&
 438        git log --oneline --decorate=no >actual &&
 439        test_cmp expect.none actual &&
 440
 441        git config --unset-all log.decorate &&
 442        git config log.decorate no &&
 443        git log --oneline >actual &&
 444        test_cmp expect.none actual &&
 445        git log --oneline --decorate >actual &&
 446        test_cmp expect.short actual &&
 447        git log --oneline --decorate=full >actual &&
 448        test_cmp expect.full actual &&
 449
 450        git config --unset-all log.decorate &&
 451        git config log.decorate 1 &&
 452        git log --oneline >actual &&
 453        test_cmp expect.short actual &&
 454        git log --oneline --decorate=full >actual &&
 455        test_cmp expect.full actual &&
 456        git log --oneline --decorate=no >actual &&
 457        test_cmp expect.none actual &&
 458
 459        git config --unset-all log.decorate &&
 460        git config log.decorate short &&
 461        git log --oneline >actual &&
 462        test_cmp expect.short actual &&
 463        git log --oneline --no-decorate >actual &&
 464        test_cmp expect.none actual &&
 465        git log --oneline --decorate=full >actual &&
 466        test_cmp expect.full actual &&
 467
 468        git config --unset-all log.decorate &&
 469        git config log.decorate full &&
 470        git log --oneline >actual &&
 471        test_cmp expect.full actual &&
 472        git log --oneline --no-decorate >actual &&
 473        test_cmp expect.none actual &&
 474        git log --oneline --decorate >actual &&
 475        test_cmp expect.short actual
 476
 477        git config --unset-all log.decorate &&
 478        git log --pretty=raw >expect.raw &&
 479        git config log.decorate full &&
 480        git log --pretty=raw >actual &&
 481        test_cmp expect.raw actual
 482
 483'
 484
 485test_expect_success 'reflog is expected format' '
 486        test_might_fail git config --remove-section log &&
 487        git log -g --abbrev-commit --pretty=oneline >expect &&
 488        git reflog >actual &&
 489        test_cmp expect actual
 490'
 491
 492test_expect_success 'whatchanged is expected format' '
 493        git log --no-merges --raw >expect &&
 494        git whatchanged >actual &&
 495        test_cmp expect actual
 496'
 497
 498test_expect_success 'log.abbrevCommit configuration' '
 499        test_when_finished "git config --unset log.abbrevCommit" &&
 500
 501        test_might_fail git config --unset log.abbrevCommit &&
 502
 503        git log --abbrev-commit >expect.log.abbrev &&
 504        git log --no-abbrev-commit >expect.log.full &&
 505        git log --pretty=raw >expect.log.raw &&
 506        git reflog --abbrev-commit >expect.reflog.abbrev &&
 507        git reflog --no-abbrev-commit >expect.reflog.full &&
 508        git whatchanged --abbrev-commit >expect.whatchanged.abbrev &&
 509        git whatchanged --no-abbrev-commit >expect.whatchanged.full &&
 510
 511        git config log.abbrevCommit true &&
 512
 513        git log >actual &&
 514        test_cmp expect.log.abbrev actual &&
 515        git log --no-abbrev-commit >actual &&
 516        test_cmp expect.log.full actual &&
 517
 518        git log --pretty=raw >actual &&
 519        test_cmp expect.log.raw actual &&
 520
 521        git reflog >actual &&
 522        test_cmp expect.reflog.abbrev actual &&
 523        git reflog --no-abbrev-commit >actual &&
 524        test_cmp expect.reflog.full actual &&
 525
 526        git whatchanged >actual &&
 527        test_cmp expect.whatchanged.abbrev actual &&
 528        git whatchanged --no-abbrev-commit >actual &&
 529        test_cmp expect.whatchanged.full actual
 530'
 531
 532test_expect_success 'show added path under "--follow -M"' '
 533        # This tests for a regression introduced in v1.7.2-rc0~103^2~2
 534        test_create_repo regression &&
 535        (
 536                cd regression &&
 537                test_commit needs-another-commit &&
 538                test_commit foo.bar &&
 539                git log -M --follow -p foo.bar.t &&
 540                git log -M --follow --stat foo.bar.t &&
 541                git log -M --follow --name-only foo.bar.t
 542        )
 543'
 544
 545test_expect_success 'git log -c --follow' '
 546        test_create_repo follow-c &&
 547        (
 548                cd follow-c &&
 549                test_commit initial file original &&
 550                git rm file &&
 551                test_commit rename file2 original &&
 552                git reset --hard initial &&
 553                test_commit modify file foo &&
 554                git merge -m merge rename &&
 555                git log -c --follow file2
 556        )
 557'
 558
 559cat >expect <<\EOF
 560*   commit COMMIT_OBJECT_NAME
 561|\  Merge: MERGE_PARENTS
 562| | Author: A U Thor <author@example.com>
 563| |
 564| |     Merge HEADS DESCRIPTION
 565| |
 566| * commit COMMIT_OBJECT_NAME
 567| | Author: A U Thor <author@example.com>
 568| |
 569| |     reach
 570| | ---
 571| |  reach.t | 1 +
 572| |  1 file changed, 1 insertion(+)
 573| |
 574| | diff --git a/reach.t b/reach.t
 575| | new file mode 100644
 576| | index 0000000..10c9591
 577| | --- /dev/null
 578| | +++ b/reach.t
 579| | @@ -0,0 +1 @@
 580| | +reach
 581| |
 582|  \
 583*-. \   commit COMMIT_OBJECT_NAME
 584|\ \ \  Merge: MERGE_PARENTS
 585| | | | Author: A U Thor <author@example.com>
 586| | | |
 587| | | |     Merge HEADS DESCRIPTION
 588| | | |
 589| | * | commit COMMIT_OBJECT_NAME
 590| | |/  Author: A U Thor <author@example.com>
 591| | |
 592| | |       octopus-b
 593| | |   ---
 594| | |    octopus-b.t | 1 +
 595| | |    1 file changed, 1 insertion(+)
 596| | |
 597| | |   diff --git a/octopus-b.t b/octopus-b.t
 598| | |   new file mode 100644
 599| | |   index 0000000..d5fcad0
 600| | |   --- /dev/null
 601| | |   +++ b/octopus-b.t
 602| | |   @@ -0,0 +1 @@
 603| | |   +octopus-b
 604| | |
 605| * | commit COMMIT_OBJECT_NAME
 606| |/  Author: A U Thor <author@example.com>
 607| |
 608| |       octopus-a
 609| |   ---
 610| |    octopus-a.t | 1 +
 611| |    1 file changed, 1 insertion(+)
 612| |
 613| |   diff --git a/octopus-a.t b/octopus-a.t
 614| |   new file mode 100644
 615| |   index 0000000..11ee015
 616| |   --- /dev/null
 617| |   +++ b/octopus-a.t
 618| |   @@ -0,0 +1 @@
 619| |   +octopus-a
 620| |
 621* | commit COMMIT_OBJECT_NAME
 622|/  Author: A U Thor <author@example.com>
 623|
 624|       seventh
 625|   ---
 626|    seventh.t | 1 +
 627|    1 file changed, 1 insertion(+)
 628|
 629|   diff --git a/seventh.t b/seventh.t
 630|   new file mode 100644
 631|   index 0000000..9744ffc
 632|   --- /dev/null
 633|   +++ b/seventh.t
 634|   @@ -0,0 +1 @@
 635|   +seventh
 636|
 637*   commit COMMIT_OBJECT_NAME
 638|\  Merge: MERGE_PARENTS
 639| | Author: A U Thor <author@example.com>
 640| |
 641| |     Merge branch 'tangle'
 642| |
 643| *   commit COMMIT_OBJECT_NAME
 644| |\  Merge: MERGE_PARENTS
 645| | | Author: A U Thor <author@example.com>
 646| | |
 647| | |     Merge branch 'side' (early part) into tangle
 648| | |
 649| * |   commit COMMIT_OBJECT_NAME
 650| |\ \  Merge: MERGE_PARENTS
 651| | | | Author: A U Thor <author@example.com>
 652| | | |
 653| | | |     Merge branch 'master' (early part) into tangle
 654| | | |
 655| * | | commit COMMIT_OBJECT_NAME
 656| | | | Author: A U Thor <author@example.com>
 657| | | |
 658| | | |     tangle-a
 659| | | | ---
 660| | | |  tangle-a | 1 +
 661| | | |  1 file changed, 1 insertion(+)
 662| | | |
 663| | | | diff --git a/tangle-a b/tangle-a
 664| | | | new file mode 100644
 665| | | | index 0000000..7898192
 666| | | | --- /dev/null
 667| | | | +++ b/tangle-a
 668| | | | @@ -0,0 +1 @@
 669| | | | +a
 670| | | |
 671* | | |   commit COMMIT_OBJECT_NAME
 672|\ \ \ \  Merge: MERGE_PARENTS
 673| | | | | Author: A U Thor <author@example.com>
 674| | | | |
 675| | | | |     Merge branch 'side'
 676| | | | |
 677| * | | | commit COMMIT_OBJECT_NAME
 678| | |_|/  Author: A U Thor <author@example.com>
 679| |/| |
 680| | | |       side-2
 681| | | |   ---
 682| | | |    2 | 1 +
 683| | | |    1 file changed, 1 insertion(+)
 684| | | |
 685| | | |   diff --git a/2 b/2
 686| | | |   new file mode 100644
 687| | | |   index 0000000..0cfbf08
 688| | | |   --- /dev/null
 689| | | |   +++ b/2
 690| | | |   @@ -0,0 +1 @@
 691| | | |   +2
 692| | | |
 693| * | | commit COMMIT_OBJECT_NAME
 694| | | | Author: A U Thor <author@example.com>
 695| | | |
 696| | | |     side-1
 697| | | | ---
 698| | | |  1 | 1 +
 699| | | |  1 file changed, 1 insertion(+)
 700| | | |
 701| | | | diff --git a/1 b/1
 702| | | | new file mode 100644
 703| | | | index 0000000..d00491f
 704| | | | --- /dev/null
 705| | | | +++ b/1
 706| | | | @@ -0,0 +1 @@
 707| | | | +1
 708| | | |
 709* | | | commit COMMIT_OBJECT_NAME
 710| | | | Author: A U Thor <author@example.com>
 711| | | |
 712| | | |     Second
 713| | | | ---
 714| | | |  one | 1 +
 715| | | |  1 file changed, 1 insertion(+)
 716| | | |
 717| | | | diff --git a/one b/one
 718| | | | new file mode 100644
 719| | | | index 0000000..9a33383
 720| | | | --- /dev/null
 721| | | | +++ b/one
 722| | | | @@ -0,0 +1 @@
 723| | | | +case
 724| | | |
 725* | | | commit COMMIT_OBJECT_NAME
 726| |_|/  Author: A U Thor <author@example.com>
 727|/| |
 728| | |       sixth
 729| | |   ---
 730| | |    a/two | 1 -
 731| | |    1 file changed, 1 deletion(-)
 732| | |
 733| | |   diff --git a/a/two b/a/two
 734| | |   deleted file mode 100644
 735| | |   index 9245af5..0000000
 736| | |   --- a/a/two
 737| | |   +++ /dev/null
 738| | |   @@ -1 +0,0 @@
 739| | |   -ni
 740| | |
 741* | | commit COMMIT_OBJECT_NAME
 742| | | Author: A U Thor <author@example.com>
 743| | |
 744| | |     fifth
 745| | | ---
 746| | |  a/two | 1 +
 747| | |  1 file changed, 1 insertion(+)
 748| | |
 749| | | diff --git a/a/two b/a/two
 750| | | new file mode 100644
 751| | | index 0000000..9245af5
 752| | | --- /dev/null
 753| | | +++ b/a/two
 754| | | @@ -0,0 +1 @@
 755| | | +ni
 756| | |
 757* | | commit COMMIT_OBJECT_NAME
 758|/ /  Author: A U Thor <author@example.com>
 759| |
 760| |       fourth
 761| |   ---
 762| |    ein | 1 +
 763| |    1 file changed, 1 insertion(+)
 764| |
 765| |   diff --git a/ein b/ein
 766| |   new file mode 100644
 767| |   index 0000000..9d7e69f
 768| |   --- /dev/null
 769| |   +++ b/ein
 770| |   @@ -0,0 +1 @@
 771| |   +ichi
 772| |
 773* | commit COMMIT_OBJECT_NAME
 774|/  Author: A U Thor <author@example.com>
 775|
 776|       third
 777|   ---
 778|    ichi | 1 +
 779|    one  | 1 -
 780|    2 files changed, 1 insertion(+), 1 deletion(-)
 781|
 782|   diff --git a/ichi b/ichi
 783|   new file mode 100644
 784|   index 0000000..9d7e69f
 785|   --- /dev/null
 786|   +++ b/ichi
 787|   @@ -0,0 +1 @@
 788|   +ichi
 789|   diff --git a/one b/one
 790|   deleted file mode 100644
 791|   index 9d7e69f..0000000
 792|   --- a/one
 793|   +++ /dev/null
 794|   @@ -1 +0,0 @@
 795|   -ichi
 796|
 797* commit COMMIT_OBJECT_NAME
 798| Author: A U Thor <author@example.com>
 799|
 800|     second
 801| ---
 802|  one | 2 +-
 803|  1 file changed, 1 insertion(+), 1 deletion(-)
 804|
 805| diff --git a/one b/one
 806| index 5626abf..9d7e69f 100644
 807| --- a/one
 808| +++ b/one
 809| @@ -1 +1 @@
 810| -one
 811| +ichi
 812|
 813* commit COMMIT_OBJECT_NAME
 814  Author: A U Thor <author@example.com>
 815
 816      initial
 817  ---
 818   one | 1 +
 819   1 file changed, 1 insertion(+)
 820
 821  diff --git a/one b/one
 822  new file mode 100644
 823  index 0000000..5626abf
 824  --- /dev/null
 825  +++ b/one
 826  @@ -0,0 +1 @@
 827  +one
 828EOF
 829
 830sanitize_output () {
 831        sed -e 's/ *$//' \
 832            -e 's/commit [0-9a-f]*$/commit COMMIT_OBJECT_NAME/' \
 833            -e 's/Merge: [ 0-9a-f]*$/Merge: MERGE_PARENTS/' \
 834            -e 's/Merge tag.*/Merge HEADS DESCRIPTION/' \
 835            -e 's/Merge commit.*/Merge HEADS DESCRIPTION/' \
 836            -e 's/, 0 deletions(-)//' \
 837            -e 's/, 0 insertions(+)//' \
 838            -e 's/ 1 files changed, / 1 file changed, /' \
 839            -e 's/, 1 deletions(-)/, 1 deletion(-)/' \
 840            -e 's/, 1 insertions(+)/, 1 insertion(+)/'
 841}
 842
 843test_expect_success 'log --graph with diff and stats' '
 844        git log --graph --pretty=short --stat -p >actual &&
 845        sanitize_output >actual.sanitized <actual &&
 846        test_i18ncmp expect actual.sanitized
 847'
 848
 849test_expect_success 'dotdot is a parent directory' '
 850        mkdir -p a/b &&
 851        ( echo sixth && echo fifth ) >expect &&
 852        ( cd a/b && git log --format=%s .. ) >actual &&
 853        test_cmp expect actual
 854'
 855
 856test_done