t / t3301-notes.shon commit Merge branch 'maint' (faf7526)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Johannes E. Schindelin
   4#
   5
   6test_description='Test commit notes'
   7
   8. ./test-lib.sh
   9
  10cat > fake_editor.sh << \EOF
  11#!/bin/sh
  12echo "$MSG" > "$1"
  13echo "$MSG" >& 2
  14EOF
  15chmod a+x fake_editor.sh
  16GIT_EDITOR=./fake_editor.sh
  17export GIT_EDITOR
  18
  19test_expect_success 'cannot annotate non-existing HEAD' '
  20        (MSG=3 && export MSG && test_must_fail git notes add)
  21'
  22
  23test_expect_success setup '
  24        : > a1 &&
  25        git add a1 &&
  26        test_tick &&
  27        git commit -m 1st &&
  28        : > a2 &&
  29        git add a2 &&
  30        test_tick &&
  31        git commit -m 2nd
  32'
  33
  34test_expect_success 'need valid notes ref' '
  35        (MSG=1 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
  36         test_must_fail git notes add) &&
  37        (MSG=2 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
  38         test_must_fail git notes show)
  39'
  40
  41test_expect_success 'refusing to add notes in refs/heads/' '
  42        (MSG=1 GIT_NOTES_REF=refs/heads/bogus &&
  43         export MSG GIT_NOTES_REF &&
  44         test_must_fail git notes add)
  45'
  46
  47test_expect_success 'refusing to edit notes in refs/remotes/' '
  48        (MSG=1 GIT_NOTES_REF=refs/remotes/bogus &&
  49         export MSG GIT_NOTES_REF &&
  50         test_must_fail git notes edit)
  51'
  52
  53# 1 indicates caught gracefully by die, 128 means git-show barked
  54test_expect_success 'handle empty notes gracefully' '
  55        git notes show ; test 1 = $?
  56'
  57
  58test_expect_success 'create notes' '
  59        git config core.notesRef refs/notes/commits &&
  60        MSG=b4 git notes add &&
  61        test ! -f .git/NOTES_EDITMSG &&
  62        test 1 = $(git ls-tree refs/notes/commits | wc -l) &&
  63        test b4 = $(git notes show) &&
  64        git show HEAD^ &&
  65        test_must_fail git notes show HEAD^
  66'
  67
  68test_expect_success 'edit existing notes' '
  69        MSG=b3 git notes edit &&
  70        test ! -f .git/NOTES_EDITMSG &&
  71        test 1 = $(git ls-tree refs/notes/commits | wc -l) &&
  72        test b3 = $(git notes show) &&
  73        git show HEAD^ &&
  74        test_must_fail git notes show HEAD^
  75'
  76
  77test_expect_success 'cannot add note where one exists' '
  78        ! MSG=b2 git notes add &&
  79        test ! -f .git/NOTES_EDITMSG &&
  80        test 1 = $(git ls-tree refs/notes/commits | wc -l) &&
  81        test b3 = $(git notes show) &&
  82        git show HEAD^ &&
  83        test_must_fail git notes show HEAD^
  84'
  85
  86test_expect_success 'can overwrite existing note with "git notes add -f"' '
  87        MSG=b1 git notes add -f &&
  88        test ! -f .git/NOTES_EDITMSG &&
  89        test 1 = $(git ls-tree refs/notes/commits | wc -l) &&
  90        test b1 = $(git notes show) &&
  91        git show HEAD^ &&
  92        test_must_fail git notes show HEAD^
  93'
  94
  95cat > expect << EOF
  96commit 268048bfb8a1fb38e703baceb8ab235421bf80c5
  97Author: A U Thor <author@example.com>
  98Date:   Thu Apr 7 15:14:13 2005 -0700
  99
 100    2nd
 101
 102Notes:
 103    b1
 104EOF
 105
 106test_expect_success 'show notes' '
 107        ! (git cat-file commit HEAD | grep b1) &&
 108        git log -1 > output &&
 109        test_cmp expect output
 110'
 111
 112test_expect_success 'create multi-line notes (setup)' '
 113        : > a3 &&
 114        git add a3 &&
 115        test_tick &&
 116        git commit -m 3rd &&
 117        MSG="b3
 118c3c3c3c3
 119d3d3d3" git notes add
 120'
 121
 122cat > expect-multiline << EOF
 123commit 1584215f1d29c65e99c6c6848626553fdd07fd75
 124Author: A U Thor <author@example.com>
 125Date:   Thu Apr 7 15:15:13 2005 -0700
 126
 127    3rd
 128
 129Notes:
 130    b3
 131    c3c3c3c3
 132    d3d3d3
 133EOF
 134
 135printf "\n" >> expect-multiline
 136cat expect >> expect-multiline
 137
 138test_expect_success 'show multi-line notes' '
 139        git log -2 > output &&
 140        test_cmp expect-multiline output
 141'
 142test_expect_success 'create -F notes (setup)' '
 143        : > a4 &&
 144        git add a4 &&
 145        test_tick &&
 146        git commit -m 4th &&
 147        echo "xyzzy" > note5 &&
 148        git notes add -F note5
 149'
 150
 151cat > expect-F << EOF
 152commit 15023535574ded8b1a89052b32673f84cf9582b8
 153Author: A U Thor <author@example.com>
 154Date:   Thu Apr 7 15:16:13 2005 -0700
 155
 156    4th
 157
 158Notes:
 159    xyzzy
 160EOF
 161
 162printf "\n" >> expect-F
 163cat expect-multiline >> expect-F
 164
 165test_expect_success 'show -F notes' '
 166        git log -3 > output &&
 167        test_cmp expect-F output
 168'
 169
 170cat >expect << EOF
 171commit 15023535574ded8b1a89052b32673f84cf9582b8
 172tree e070e3af51011e47b183c33adf9736736a525709
 173parent 1584215f1d29c65e99c6c6848626553fdd07fd75
 174author A U Thor <author@example.com> 1112912173 -0700
 175committer C O Mitter <committer@example.com> 1112912173 -0700
 176
 177    4th
 178EOF
 179test_expect_success 'git log --pretty=raw does not show notes' '
 180        git log -1 --pretty=raw >output &&
 181        test_cmp expect output
 182'
 183
 184cat >>expect <<EOF
 185
 186Notes:
 187    xyzzy
 188EOF
 189test_expect_success 'git log --show-notes' '
 190        git log -1 --pretty=raw --show-notes >output &&
 191        test_cmp expect output
 192'
 193
 194test_expect_success 'git log --no-notes' '
 195        git log -1 --no-notes >output &&
 196        ! grep xyzzy output
 197'
 198
 199test_expect_success 'git format-patch does not show notes' '
 200        git format-patch -1 --stdout >output &&
 201        ! grep xyzzy output
 202'
 203
 204test_expect_success 'git format-patch --show-notes does show notes' '
 205        git format-patch --show-notes -1 --stdout >output &&
 206        grep xyzzy output
 207'
 208
 209for pretty in \
 210        "" --pretty --pretty=raw --pretty=short --pretty=medium \
 211        --pretty=full --pretty=fuller --pretty=format:%s --oneline
 212do
 213        case "$pretty" in
 214        "") p= not= negate="" ;;
 215        ?*) p="$pretty" not=" not" negate="!" ;;
 216        esac
 217        test_expect_success "git show $pretty does$not show notes" '
 218                git show $p >output &&
 219                eval "$negate grep xyzzy output"
 220        '
 221done
 222
 223test_expect_success 'create -m notes (setup)' '
 224        : > a5 &&
 225        git add a5 &&
 226        test_tick &&
 227        git commit -m 5th &&
 228        git notes add -m spam -m "foo
 229bar
 230baz"
 231'
 232
 233whitespace="    "
 234cat > expect-m << EOF
 235commit bd1753200303d0a0344be813e504253b3d98e74d
 236Author: A U Thor <author@example.com>
 237Date:   Thu Apr 7 15:17:13 2005 -0700
 238
 239    5th
 240
 241Notes:
 242    spam
 243$whitespace
 244    foo
 245    bar
 246    baz
 247EOF
 248
 249printf "\n" >> expect-m
 250cat expect-F >> expect-m
 251
 252test_expect_success 'show -m notes' '
 253        git log -4 > output &&
 254        test_cmp expect-m output
 255'
 256
 257test_expect_success 'remove note with add -f -F /dev/null (setup)' '
 258        git notes add -f -F /dev/null
 259'
 260
 261cat > expect-rm-F << EOF
 262commit bd1753200303d0a0344be813e504253b3d98e74d
 263Author: A U Thor <author@example.com>
 264Date:   Thu Apr 7 15:17:13 2005 -0700
 265
 266    5th
 267EOF
 268
 269printf "\n" >> expect-rm-F
 270cat expect-F >> expect-rm-F
 271
 272test_expect_success 'verify note removal with -F /dev/null' '
 273        git log -4 > output &&
 274        test_cmp expect-rm-F output &&
 275        ! git notes show
 276'
 277
 278test_expect_success 'do not create empty note with -m "" (setup)' '
 279        git notes add -m ""
 280'
 281
 282test_expect_success 'verify non-creation of note with -m ""' '
 283        git log -4 > output &&
 284        test_cmp expect-rm-F output &&
 285        ! git notes show
 286'
 287
 288cat > expect-combine_m_and_F << EOF
 289foo
 290
 291xyzzy
 292
 293bar
 294
 295zyxxy
 296
 297baz
 298EOF
 299
 300test_expect_success 'create note with combination of -m and -F' '
 301        echo "xyzzy" > note_a &&
 302        echo "zyxxy" > note_b &&
 303        git notes add -m "foo" -F note_a -m "bar" -F note_b -m "baz" &&
 304        git notes show > output &&
 305        test_cmp expect-combine_m_and_F output
 306'
 307
 308test_expect_success 'remove note with "git notes remove" (setup)' '
 309        git notes remove HEAD^ &&
 310        git notes remove
 311'
 312
 313cat > expect-rm-remove << EOF
 314commit bd1753200303d0a0344be813e504253b3d98e74d
 315Author: A U Thor <author@example.com>
 316Date:   Thu Apr 7 15:17:13 2005 -0700
 317
 318    5th
 319
 320commit 15023535574ded8b1a89052b32673f84cf9582b8
 321Author: A U Thor <author@example.com>
 322Date:   Thu Apr 7 15:16:13 2005 -0700
 323
 324    4th
 325EOF
 326
 327printf "\n" >> expect-rm-remove
 328cat expect-multiline >> expect-rm-remove
 329
 330test_expect_success 'verify note removal with "git notes remove"' '
 331        git log -4 > output &&
 332        test_cmp expect-rm-remove output &&
 333        ! git notes show HEAD^
 334'
 335
 336cat > expect << EOF
 337c18dc024e14f08d18d14eea0d747ff692d66d6a3 1584215f1d29c65e99c6c6848626553fdd07fd75
 338c9c6af7f78bc47490dbf3e822cf2f3c24d4b9061 268048bfb8a1fb38e703baceb8ab235421bf80c5
 339EOF
 340
 341test_expect_success 'list notes with "git notes list"' '
 342        git notes list > output &&
 343        test_cmp expect output
 344'
 345
 346test_expect_success 'list notes with "git notes"' '
 347        git notes > output &&
 348        test_cmp expect output
 349'
 350
 351cat > expect << EOF
 352c18dc024e14f08d18d14eea0d747ff692d66d6a3
 353EOF
 354
 355test_expect_success 'list specific note with "git notes list <object>"' '
 356        git notes list HEAD^^ > output &&
 357        test_cmp expect output
 358'
 359
 360cat > expect << EOF
 361EOF
 362
 363test_expect_success 'listing non-existing notes fails' '
 364        test_must_fail git notes list HEAD > output &&
 365        test_cmp expect output
 366'
 367
 368cat > expect << EOF
 369Initial set of notes
 370
 371More notes appended with git notes append
 372EOF
 373
 374test_expect_success 'append to existing note with "git notes append"' '
 375        git notes add -m "Initial set of notes" &&
 376        git notes append -m "More notes appended with git notes append" &&
 377        git notes show > output &&
 378        test_cmp expect output
 379'
 380
 381test_expect_success 'appending empty string does not change existing note' '
 382        git notes append -m "" &&
 383        git notes show > output &&
 384        test_cmp expect output
 385'
 386
 387test_expect_success 'git notes append == add when there is no existing note' '
 388        git notes remove HEAD &&
 389        test_must_fail git notes list HEAD &&
 390        git notes append -m "Initial set of notes
 391
 392More notes appended with git notes append" &&
 393        git notes show > output &&
 394        test_cmp expect output
 395'
 396
 397test_expect_success 'appending empty string to non-existing note does not create note' '
 398        git notes remove HEAD &&
 399        test_must_fail git notes list HEAD &&
 400        git notes append -m "" &&
 401        test_must_fail git notes list HEAD
 402'
 403
 404test_expect_success 'create other note on a different notes ref (setup)' '
 405        : > a6 &&
 406        git add a6 &&
 407        test_tick &&
 408        git commit -m 6th &&
 409        GIT_NOTES_REF="refs/notes/other" git notes add -m "other note"
 410'
 411
 412cat > expect-other << EOF
 413commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 414Author: A U Thor <author@example.com>
 415Date:   Thu Apr 7 15:18:13 2005 -0700
 416
 417    6th
 418
 419Notes (other):
 420    other note
 421EOF
 422
 423cat > expect-not-other << EOF
 424commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 425Author: A U Thor <author@example.com>
 426Date:   Thu Apr 7 15:18:13 2005 -0700
 427
 428    6th
 429EOF
 430
 431test_expect_success 'Do not show note on other ref by default' '
 432        git log -1 > output &&
 433        test_cmp expect-not-other output
 434'
 435
 436test_expect_success 'Do show note when ref is given in GIT_NOTES_REF' '
 437        GIT_NOTES_REF="refs/notes/other" git log -1 > output &&
 438        test_cmp expect-other output
 439'
 440
 441test_expect_success 'Do show note when ref is given in core.notesRef config' '
 442        git config core.notesRef "refs/notes/other" &&
 443        git log -1 > output &&
 444        test_cmp expect-other output
 445'
 446
 447test_expect_success 'Do not show note when core.notesRef is overridden' '
 448        GIT_NOTES_REF="refs/notes/wrong" git log -1 > output &&
 449        test_cmp expect-not-other output
 450'
 451
 452cat > expect-both << EOF
 453commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 454Author: A U Thor <author@example.com>
 455Date:   Thu Apr 7 15:18:13 2005 -0700
 456
 457    6th
 458
 459Notes:
 460    order test
 461
 462Notes (other):
 463    other note
 464
 465commit bd1753200303d0a0344be813e504253b3d98e74d
 466Author: A U Thor <author@example.com>
 467Date:   Thu Apr 7 15:17:13 2005 -0700
 468
 469    5th
 470
 471Notes:
 472    replacement for deleted note
 473EOF
 474
 475test_expect_success 'Show all notes when notes.displayRef=refs/notes/*' '
 476        GIT_NOTES_REF=refs/notes/commits git notes add \
 477                -m"replacement for deleted note" HEAD^ &&
 478        GIT_NOTES_REF=refs/notes/commits git notes add -m"order test" &&
 479        git config --unset core.notesRef &&
 480        git config notes.displayRef "refs/notes/*" &&
 481        git log -2 > output &&
 482        test_cmp expect-both output
 483'
 484
 485test_expect_success 'core.notesRef is implicitly in notes.displayRef' '
 486        git config core.notesRef refs/notes/commits &&
 487        git config notes.displayRef refs/notes/other &&
 488        git log -2 > output &&
 489        test_cmp expect-both output
 490'
 491
 492test_expect_success 'notes.displayRef can be given more than once' '
 493        git config --unset core.notesRef &&
 494        git config notes.displayRef refs/notes/commits &&
 495        git config --add notes.displayRef refs/notes/other &&
 496        git log -2 > output &&
 497        test_cmp expect-both output
 498'
 499
 500cat > expect-both-reversed << EOF
 501commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 502Author: A U Thor <author@example.com>
 503Date:   Thu Apr 7 15:18:13 2005 -0700
 504
 505    6th
 506
 507Notes (other):
 508    other note
 509
 510Notes:
 511    order test
 512EOF
 513
 514test_expect_success 'notes.displayRef respects order' '
 515        git config core.notesRef refs/notes/other &&
 516        git config --unset-all notes.displayRef &&
 517        git config notes.displayRef refs/notes/commits &&
 518        git log -1 > output &&
 519        test_cmp expect-both-reversed output
 520'
 521
 522test_expect_success 'GIT_NOTES_DISPLAY_REF works' '
 523        git config --unset-all core.notesRef &&
 524        git config --unset-all notes.displayRef &&
 525        GIT_NOTES_DISPLAY_REF=refs/notes/commits:refs/notes/other \
 526                git log -2 > output &&
 527        test_cmp expect-both output
 528'
 529
 530cat > expect-none << EOF
 531commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 532Author: A U Thor <author@example.com>
 533Date:   Thu Apr 7 15:18:13 2005 -0700
 534
 535    6th
 536
 537commit bd1753200303d0a0344be813e504253b3d98e74d
 538Author: A U Thor <author@example.com>
 539Date:   Thu Apr 7 15:17:13 2005 -0700
 540
 541    5th
 542EOF
 543
 544test_expect_success 'GIT_NOTES_DISPLAY_REF overrides config' '
 545        git config notes.displayRef "refs/notes/*" &&
 546        GIT_NOTES_REF= GIT_NOTES_DISPLAY_REF= git log -2 > output &&
 547        test_cmp expect-none output
 548'
 549
 550test_expect_success '--show-notes=* adds to GIT_NOTES_DISPLAY_REF' '
 551        GIT_NOTES_REF= GIT_NOTES_DISPLAY_REF= git log --show-notes=* -2 > output &&
 552        test_cmp expect-both output
 553'
 554
 555cat > expect-commits << EOF
 556commit 387a89921c73d7ed72cd94d179c1c7048ca47756
 557Author: A U Thor <author@example.com>
 558Date:   Thu Apr 7 15:18:13 2005 -0700
 559
 560    6th
 561
 562Notes:
 563    order test
 564EOF
 565
 566test_expect_success '--no-standard-notes' '
 567        git log --no-standard-notes --show-notes=commits -1 > output &&
 568        test_cmp expect-commits output
 569'
 570
 571test_expect_success '--standard-notes' '
 572        git log --no-standard-notes --show-notes=commits \
 573                --standard-notes -2 > output &&
 574        test_cmp expect-both output
 575'
 576
 577test_expect_success '--show-notes=ref accumulates' '
 578        git log --show-notes=other --show-notes=commits \
 579                 --no-standard-notes -1 > output &&
 580        test_cmp expect-both-reversed output
 581'
 582
 583test_expect_success 'Allow notes on non-commits (trees, blobs, tags)' '
 584        git config core.notesRef refs/notes/other &&
 585        echo "Note on a tree" > expect
 586        git notes add -m "Note on a tree" HEAD: &&
 587        git notes show HEAD: > actual &&
 588        test_cmp expect actual &&
 589        echo "Note on a blob" > expect
 590        filename=$(git ls-tree --name-only HEAD | head -n1) &&
 591        git notes add -m "Note on a blob" HEAD:$filename &&
 592        git notes show HEAD:$filename > actual &&
 593        test_cmp expect actual &&
 594        echo "Note on a tag" > expect
 595        git tag -a -m "This is an annotated tag" foobar HEAD^ &&
 596        git notes add -m "Note on a tag" foobar &&
 597        git notes show foobar > actual &&
 598        test_cmp expect actual
 599'
 600
 601cat > expect << EOF
 602commit 2ede89468182a62d0bde2583c736089bcf7d7e92
 603Author: A U Thor <author@example.com>
 604Date:   Thu Apr 7 15:19:13 2005 -0700
 605
 606    7th
 607
 608Notes (other):
 609    other note
 610EOF
 611
 612test_expect_success 'create note from other note with "git notes add -C"' '
 613        : > a7 &&
 614        git add a7 &&
 615        test_tick &&
 616        git commit -m 7th &&
 617        git notes add -C $(git notes list HEAD^) &&
 618        git log -1 > actual &&
 619        test_cmp expect actual &&
 620        test "$(git notes list HEAD)" = "$(git notes list HEAD^)"
 621'
 622
 623test_expect_success 'create note from non-existing note with "git notes add -C" fails' '
 624        : > a8 &&
 625        git add a8 &&
 626        test_tick &&
 627        git commit -m 8th &&
 628        test_must_fail git notes add -C deadbeef &&
 629        test_must_fail git notes list HEAD
 630'
 631
 632cat > expect << EOF
 633commit 016e982bad97eacdbda0fcbd7ce5b0ba87c81f1b
 634Author: A U Thor <author@example.com>
 635Date:   Thu Apr 7 15:21:13 2005 -0700
 636
 637    9th
 638
 639Notes (other):
 640    yet another note
 641EOF
 642
 643test_expect_success 'create note from other note with "git notes add -c"' '
 644        : > a9 &&
 645        git add a9 &&
 646        test_tick &&
 647        git commit -m 9th &&
 648        MSG="yet another note" git notes add -c $(git notes list HEAD^^) &&
 649        git log -1 > actual &&
 650        test_cmp expect actual
 651'
 652
 653test_expect_success 'create note from non-existing note with "git notes add -c" fails' '
 654        : > a10 &&
 655        git add a10 &&
 656        test_tick &&
 657        git commit -m 10th &&
 658        test_must_fail MSG="yet another note" git notes add -c deadbeef &&
 659        test_must_fail git notes list HEAD
 660'
 661
 662cat > expect << EOF
 663commit 016e982bad97eacdbda0fcbd7ce5b0ba87c81f1b
 664Author: A U Thor <author@example.com>
 665Date:   Thu Apr 7 15:21:13 2005 -0700
 666
 667    9th
 668
 669Notes (other):
 670    yet another note
 671$whitespace
 672    yet another note
 673EOF
 674
 675test_expect_success 'append to note from other note with "git notes append -C"' '
 676        git notes append -C $(git notes list HEAD^) HEAD^ &&
 677        git log -1 HEAD^ > actual &&
 678        test_cmp expect actual
 679'
 680
 681cat > expect << EOF
 682commit ffed603236bfa3891c49644257a83598afe8ae5a
 683Author: A U Thor <author@example.com>
 684Date:   Thu Apr 7 15:22:13 2005 -0700
 685
 686    10th
 687
 688Notes (other):
 689    other note
 690EOF
 691
 692test_expect_success 'create note from other note with "git notes append -c"' '
 693        MSG="other note" git notes append -c $(git notes list HEAD^) &&
 694        git log -1 > actual &&
 695        test_cmp expect actual
 696'
 697
 698cat > expect << EOF
 699commit ffed603236bfa3891c49644257a83598afe8ae5a
 700Author: A U Thor <author@example.com>
 701Date:   Thu Apr 7 15:22:13 2005 -0700
 702
 703    10th
 704
 705Notes (other):
 706    other note
 707$whitespace
 708    yet another note
 709EOF
 710
 711test_expect_success 'append to note from other note with "git notes append -c"' '
 712        MSG="yet another note" git notes append -c $(git notes list HEAD) &&
 713        git log -1 > actual &&
 714        test_cmp expect actual
 715'
 716
 717cat > expect << EOF
 718commit 6352c5e33dbcab725fe0579be16aa2ba8eb369be
 719Author: A U Thor <author@example.com>
 720Date:   Thu Apr 7 15:23:13 2005 -0700
 721
 722    11th
 723
 724Notes (other):
 725    other note
 726$whitespace
 727    yet another note
 728EOF
 729
 730test_expect_success 'copy note with "git notes copy"' '
 731        : > a11 &&
 732        git add a11 &&
 733        test_tick &&
 734        git commit -m 11th &&
 735        git notes copy HEAD^ HEAD &&
 736        git log -1 > actual &&
 737        test_cmp expect actual &&
 738        test "$(git notes list HEAD)" = "$(git notes list HEAD^)"
 739'
 740
 741test_expect_success 'prevent overwrite with "git notes copy"' '
 742        test_must_fail git notes copy HEAD~2 HEAD &&
 743        git log -1 > actual &&
 744        test_cmp expect actual &&
 745        test "$(git notes list HEAD)" = "$(git notes list HEAD^)"
 746'
 747
 748cat > expect << EOF
 749commit 6352c5e33dbcab725fe0579be16aa2ba8eb369be
 750Author: A U Thor <author@example.com>
 751Date:   Thu Apr 7 15:23:13 2005 -0700
 752
 753    11th
 754
 755Notes (other):
 756    yet another note
 757$whitespace
 758    yet another note
 759EOF
 760
 761test_expect_success 'allow overwrite with "git notes copy -f"' '
 762        git notes copy -f HEAD~2 HEAD &&
 763        git log -1 > actual &&
 764        test_cmp expect actual &&
 765        test "$(git notes list HEAD)" = "$(git notes list HEAD~2)"
 766'
 767
 768test_expect_success 'cannot copy note from object without notes' '
 769        : > a12 &&
 770        git add a12 &&
 771        test_tick &&
 772        git commit -m 12th &&
 773        : > a13 &&
 774        git add a13 &&
 775        test_tick &&
 776        git commit -m 13th &&
 777        test_must_fail git notes copy HEAD^ HEAD
 778'
 779
 780cat > expect << EOF
 781commit e5d4fb5698d564ab8c73551538ecaf2b0c666185
 782Author: A U Thor <author@example.com>
 783Date:   Thu Apr 7 15:25:13 2005 -0700
 784
 785    13th
 786
 787Notes (other):
 788    yet another note
 789$whitespace
 790    yet another note
 791
 792commit 7038787dfe22a14c3867ce816dbba39845359719
 793Author: A U Thor <author@example.com>
 794Date:   Thu Apr 7 15:24:13 2005 -0700
 795
 796    12th
 797
 798Notes (other):
 799    other note
 800$whitespace
 801    yet another note
 802EOF
 803
 804test_expect_success 'git notes copy --stdin' '
 805        (echo $(git rev-parse HEAD~3) $(git rev-parse HEAD^); \
 806        echo $(git rev-parse HEAD~2) $(git rev-parse HEAD)) |
 807        git notes copy --stdin &&
 808        git log -2 > output &&
 809        test_cmp expect output &&
 810        test "$(git notes list HEAD)" = "$(git notes list HEAD~2)" &&
 811        test "$(git notes list HEAD^)" = "$(git notes list HEAD~3)"
 812'
 813
 814cat > expect << EOF
 815commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 816Author: A U Thor <author@example.com>
 817Date:   Thu Apr 7 15:27:13 2005 -0700
 818
 819    15th
 820
 821commit be28d8b4d9951ad940d229ee3b0b9ee3b1ec273d
 822Author: A U Thor <author@example.com>
 823Date:   Thu Apr 7 15:26:13 2005 -0700
 824
 825    14th
 826EOF
 827
 828test_expect_success 'git notes copy --for-rewrite (unconfigured)' '
 829        test_commit 14th &&
 830        test_commit 15th &&
 831        (echo $(git rev-parse HEAD~3) $(git rev-parse HEAD^); \
 832        echo $(git rev-parse HEAD~2) $(git rev-parse HEAD)) |
 833        git notes copy --for-rewrite=foo &&
 834        git log -2 > output &&
 835        test_cmp expect output
 836'
 837
 838cat > expect << EOF
 839commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 840Author: A U Thor <author@example.com>
 841Date:   Thu Apr 7 15:27:13 2005 -0700
 842
 843    15th
 844
 845Notes (other):
 846    yet another note
 847$whitespace
 848    yet another note
 849
 850commit be28d8b4d9951ad940d229ee3b0b9ee3b1ec273d
 851Author: A U Thor <author@example.com>
 852Date:   Thu Apr 7 15:26:13 2005 -0700
 853
 854    14th
 855
 856Notes (other):
 857    other note
 858$whitespace
 859    yet another note
 860EOF
 861
 862test_expect_success 'git notes copy --for-rewrite (enabled)' '
 863        git config notes.rewriteMode overwrite &&
 864        git config notes.rewriteRef "refs/notes/*" &&
 865        (echo $(git rev-parse HEAD~3) $(git rev-parse HEAD^); \
 866        echo $(git rev-parse HEAD~2) $(git rev-parse HEAD)) |
 867        git notes copy --for-rewrite=foo &&
 868        git log -2 > output &&
 869        test_cmp expect output
 870'
 871
 872test_expect_success 'git notes copy --for-rewrite (disabled)' '
 873        git config notes.rewrite.bar false &&
 874        echo $(git rev-parse HEAD~3) $(git rev-parse HEAD) |
 875        git notes copy --for-rewrite=bar &&
 876        git log -2 > output &&
 877        test_cmp expect output
 878'
 879
 880cat > expect << EOF
 881commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 882Author: A U Thor <author@example.com>
 883Date:   Thu Apr 7 15:27:13 2005 -0700
 884
 885    15th
 886
 887Notes (other):
 888    a fresh note
 889EOF
 890
 891test_expect_success 'git notes copy --for-rewrite (overwrite)' '
 892        git notes add -f -m"a fresh note" HEAD^ &&
 893        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 894        git notes copy --for-rewrite=foo &&
 895        git log -1 > output &&
 896        test_cmp expect output
 897'
 898
 899test_expect_success 'git notes copy --for-rewrite (ignore)' '
 900        git config notes.rewriteMode ignore &&
 901        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 902        git notes copy --for-rewrite=foo &&
 903        git log -1 > output &&
 904        test_cmp expect output
 905'
 906
 907cat > expect << EOF
 908commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 909Author: A U Thor <author@example.com>
 910Date:   Thu Apr 7 15:27:13 2005 -0700
 911
 912    15th
 913
 914Notes (other):
 915    a fresh note
 916    another fresh note
 917EOF
 918
 919test_expect_success 'git notes copy --for-rewrite (append)' '
 920        git notes add -f -m"another fresh note" HEAD^ &&
 921        git config notes.rewriteMode concatenate &&
 922        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 923        git notes copy --for-rewrite=foo &&
 924        git log -1 > output &&
 925        test_cmp expect output
 926'
 927
 928cat > expect << EOF
 929commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 930Author: A U Thor <author@example.com>
 931Date:   Thu Apr 7 15:27:13 2005 -0700
 932
 933    15th
 934
 935Notes (other):
 936    a fresh note
 937    another fresh note
 938    append 1
 939    append 2
 940EOF
 941
 942test_expect_success 'git notes copy --for-rewrite (append two to one)' '
 943        git notes add -f -m"append 1" HEAD^ &&
 944        git notes add -f -m"append 2" HEAD^^ &&
 945        (echo $(git rev-parse HEAD^) $(git rev-parse HEAD);
 946        echo $(git rev-parse HEAD^^) $(git rev-parse HEAD)) |
 947        git notes copy --for-rewrite=foo &&
 948        git log -1 > output &&
 949        test_cmp expect output
 950'
 951
 952test_expect_success 'git notes copy --for-rewrite (append empty)' '
 953        git notes remove HEAD^ &&
 954        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 955        git notes copy --for-rewrite=foo &&
 956        git log -1 > output &&
 957        test_cmp expect output
 958'
 959
 960cat > expect << EOF
 961commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 962Author: A U Thor <author@example.com>
 963Date:   Thu Apr 7 15:27:13 2005 -0700
 964
 965    15th
 966
 967Notes (other):
 968    replacement note 1
 969EOF
 970
 971test_expect_success 'GIT_NOTES_REWRITE_MODE works' '
 972        git notes add -f -m"replacement note 1" HEAD^ &&
 973        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 974        GIT_NOTES_REWRITE_MODE=overwrite git notes copy --for-rewrite=foo &&
 975        git log -1 > output &&
 976        test_cmp expect output
 977'
 978
 979cat > expect << EOF
 980commit 37a0d4cba38afef96ba54a3ea567e6dac575700b
 981Author: A U Thor <author@example.com>
 982Date:   Thu Apr 7 15:27:13 2005 -0700
 983
 984    15th
 985
 986Notes (other):
 987    replacement note 2
 988EOF
 989
 990test_expect_success 'GIT_NOTES_REWRITE_REF works' '
 991        git config notes.rewriteMode overwrite &&
 992        git notes add -f -m"replacement note 2" HEAD^ &&
 993        git config --unset-all notes.rewriteRef &&
 994        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
 995        GIT_NOTES_REWRITE_REF=refs/notes/commits:refs/notes/other \
 996                git notes copy --for-rewrite=foo &&
 997        git log -1 > output &&
 998        test_cmp expect output
 999'
1000
1001test_expect_success 'GIT_NOTES_REWRITE_REF overrides config' '
1002        git config notes.rewriteRef refs/notes/other &&
1003        git notes add -f -m"replacement note 3" HEAD^ &&
1004        echo $(git rev-parse HEAD^) $(git rev-parse HEAD) |
1005        GIT_NOTES_REWRITE_REF= git notes copy --for-rewrite=foo &&
1006        git log -1 > output &&
1007        test_cmp expect output
1008'
1009test_done