t / t9300-fast-import.shon commit Merge branch 'js/pull-rebase-i' (f9219c0)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Shawn Pearce
   4#
   5
   6test_description='test git fast-import utility'
   7. ./test-lib.sh
   8. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
   9
  10# Print $1 bytes from stdin to stdout.
  11#
  12# This could be written as "head -c $1", but IRIX "head" does not
  13# support the -c option.
  14head_c () {
  15        perl -e '
  16                my $len = $ARGV[1];
  17                while ($len > 0) {
  18                        my $s;
  19                        my $nread = sysread(STDIN, $s, $len);
  20                        die "cannot read: $!" unless defined($nread);
  21                        print $s;
  22                        $len -= $nread;
  23                }
  24        ' - "$1"
  25}
  26
  27verify_packs () {
  28        for p in .git/objects/pack/*.pack
  29        do
  30                git verify-pack "$@" "$p" || return
  31        done
  32}
  33
  34file2_data='file2
  35second line of EOF'
  36
  37file3_data='EOF
  38in 3rd file
  39 END'
  40
  41file4_data=abcd
  42file4_len=4
  43
  44file5_data='an inline file.
  45  we should see it later.'
  46
  47file6_data='#!/bin/sh
  48echo "$@"'
  49
  50###
  51### series A
  52###
  53
  54test_expect_success 'empty stream succeeds' '
  55        git fast-import </dev/null
  56'
  57
  58test_expect_success 'A: create pack from stdin' '
  59        test_tick &&
  60        cat >input <<-INPUT_END &&
  61        blob
  62        mark :2
  63        data <<EOF
  64        $file2_data
  65        EOF
  66
  67        blob
  68        mark :3
  69        data <<END
  70        $file3_data
  71        END
  72
  73        blob
  74        mark :4
  75        data $file4_len
  76        $file4_data
  77        commit refs/heads/master
  78        mark :5
  79        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
  80        data <<COMMIT
  81        initial
  82        COMMIT
  83
  84        M 644 :2 file2
  85        M 644 :3 file3
  86        M 755 :4 file4
  87
  88        tag series-A
  89        from :5
  90        data <<EOF
  91        An annotated tag without a tagger
  92        EOF
  93
  94        tag series-A-blob
  95        from :3
  96        data <<EOF
  97        An annotated tag that annotates a blob.
  98        EOF
  99
 100        INPUT_END
 101        git fast-import --export-marks=marks.out <input &&
 102        git whatchanged master
 103'
 104
 105test_expect_success 'A: verify pack' '
 106        verify_packs
 107'
 108
 109test_expect_success 'A: verify commit' '
 110        cat >expect <<-EOF &&
 111        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 112        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 113
 114        initial
 115        EOF
 116        git cat-file commit master | sed 1d >actual &&
 117        test_cmp expect actual
 118'
 119
 120test_expect_success 'A: verify tree' '
 121        cat >expect <<-EOF &&
 122        100644 blob file2
 123        100644 blob file3
 124        100755 blob file4
 125        EOF
 126        git cat-file -p master^{tree} | sed "s/ [0-9a-f]*       / /" >actual &&
 127        test_cmp expect actual
 128'
 129
 130test_expect_success 'A: verify file2' '
 131        echo "$file2_data" >expect &&
 132        git cat-file blob master:file2 >actual &&
 133        test_cmp expect actual
 134'
 135
 136test_expect_success 'A: verify file3' '
 137        echo "$file3_data" >expect &&
 138        git cat-file blob master:file3 >actual &&
 139        test_cmp expect actual
 140'
 141
 142test_expect_success 'A: verify file4' '
 143        printf "$file4_data" >expect &&
 144        git cat-file blob master:file4 >actual &&
 145        test_cmp expect actual
 146'
 147
 148test_expect_success 'A: verify tag/series-A' '
 149        cat >expect <<-EOF &&
 150        object $(git rev-parse refs/heads/master)
 151        type commit
 152        tag series-A
 153
 154        An annotated tag without a tagger
 155        EOF
 156        git cat-file tag tags/series-A >actual &&
 157        test_cmp expect actual
 158'
 159
 160test_expect_success 'A: verify tag/series-A-blob' '
 161        cat >expect <<-EOF &&
 162        object $(git rev-parse refs/heads/master:file3)
 163        type blob
 164        tag series-A-blob
 165
 166        An annotated tag that annotates a blob.
 167        EOF
 168        git cat-file tag tags/series-A-blob >actual &&
 169        test_cmp expect actual
 170'
 171
 172test_expect_success 'A: verify marks output' '
 173        cat >expect <<-EOF &&
 174        :2 $(git rev-parse --verify master:file2)
 175        :3 $(git rev-parse --verify master:file3)
 176        :4 $(git rev-parse --verify master:file4)
 177        :5 $(git rev-parse --verify master^0)
 178        EOF
 179        test_cmp expect marks.out
 180'
 181
 182test_expect_success 'A: verify marks import' '
 183        git fast-import \
 184                --import-marks=marks.out \
 185                --export-marks=marks.new \
 186                </dev/null &&
 187        test_cmp expect marks.new
 188'
 189
 190test_expect_success 'A: tag blob by sha1' '
 191        test_tick &&
 192        new_blob=$(echo testing | git hash-object --stdin) &&
 193        cat >input <<-INPUT_END &&
 194        tag series-A-blob-2
 195        from $(git rev-parse refs/heads/master:file3)
 196        data <<EOF
 197        Tag blob by sha1.
 198        EOF
 199
 200        blob
 201        mark :6
 202        data <<EOF
 203        testing
 204        EOF
 205
 206        commit refs/heads/new_blob
 207        committer  <> 0 +0000
 208        data 0
 209        M 644 :6 new_blob
 210        #pretend we got sha1 from fast-import
 211        ls "new_blob"
 212
 213        tag series-A-blob-3
 214        from $new_blob
 215        data <<EOF
 216        Tag new_blob.
 217        EOF
 218        INPUT_END
 219
 220        cat >expect <<-EOF &&
 221        object $(git rev-parse refs/heads/master:file3)
 222        type blob
 223        tag series-A-blob-2
 224
 225        Tag blob by sha1.
 226        object $new_blob
 227        type blob
 228        tag series-A-blob-3
 229
 230        Tag new_blob.
 231        EOF
 232
 233        git fast-import <input &&
 234        git cat-file tag tags/series-A-blob-2 >actual &&
 235        git cat-file tag tags/series-A-blob-3 >>actual &&
 236        test_cmp expect actual
 237'
 238
 239test_expect_success 'A: verify marks import does not crash' '
 240        test_tick &&
 241        cat >input <<-INPUT_END &&
 242        commit refs/heads/verify--import-marks
 243        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 244        data <<COMMIT
 245        recreate from :5
 246        COMMIT
 247
 248        from :5
 249        M 755 :2 copy-of-file2
 250
 251        INPUT_END
 252
 253        git fast-import --import-marks=marks.out <input &&
 254        git whatchanged verify--import-marks
 255'
 256
 257test_expect_success 'A: verify pack' '
 258        verify_packs
 259'
 260
 261test_expect_success 'A: verify diff' '
 262        cat >expect <<-EOF &&
 263        :000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A      copy-of-file2
 264        EOF
 265        git diff-tree -M -r master verify--import-marks >actual &&
 266        compare_diff_raw expect actual &&
 267        test $(git rev-parse --verify master:file2) \
 268            = $(git rev-parse --verify verify--import-marks:copy-of-file2)
 269'
 270
 271test_expect_success 'A: export marks with large values' '
 272        test_tick &&
 273        mt=$(git hash-object --stdin < /dev/null) &&
 274        >input.blob &&
 275        >marks.exp &&
 276        >tree.exp &&
 277
 278        cat >input.commit <<-EOF &&
 279        commit refs/heads/verify--dump-marks
 280        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 281        data <<COMMIT
 282        test the sparse array dumping routines with exponentially growing marks
 283        COMMIT
 284        EOF
 285
 286        i=0 l=4 m=6 n=7 &&
 287        while test "$i" -lt 27
 288        do
 289                cat >>input.blob <<-EOF &&
 290                blob
 291                mark :$l
 292                data 0
 293                blob
 294                mark :$m
 295                data 0
 296                blob
 297                mark :$n
 298                data 0
 299                EOF
 300                echo "M 100644 :$l l$i" >>input.commit &&
 301                echo "M 100644 :$m m$i" >>input.commit &&
 302                echo "M 100644 :$n n$i" >>input.commit &&
 303
 304                echo ":$l $mt" >>marks.exp &&
 305                echo ":$m $mt" >>marks.exp &&
 306                echo ":$n $mt" >>marks.exp &&
 307
 308                printf "100644 blob $mt\tl$i\n" >>tree.exp &&
 309                printf "100644 blob $mt\tm$i\n" >>tree.exp &&
 310                printf "100644 blob $mt\tn$i\n" >>tree.exp &&
 311
 312                l=$(($l + $l)) &&
 313                m=$(($m + $m)) &&
 314                n=$(($l + $n)) &&
 315
 316                i=$((1 + $i)) || return 1
 317        done &&
 318
 319        sort tree.exp > tree.exp_s &&
 320
 321        cat input.blob input.commit | git fast-import --export-marks=marks.large &&
 322        git ls-tree refs/heads/verify--dump-marks >tree.out &&
 323        test_cmp tree.exp_s tree.out &&
 324        test_cmp marks.exp marks.large
 325'
 326
 327###
 328### series B
 329###
 330
 331test_expect_success 'B: fail on invalid blob sha1' '
 332        test_tick &&
 333        cat >input <<-INPUT_END &&
 334        commit refs/heads/branch
 335        mark :1
 336        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 337        data <<COMMIT
 338        corrupt
 339        COMMIT
 340
 341        from refs/heads/master
 342        M 755 0000000000000000000000000000000000000001 zero1
 343
 344        INPUT_END
 345
 346        test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
 347        test_must_fail git fast-import <input
 348'
 349
 350test_expect_success 'B: accept branch name "TEMP_TAG"' '
 351        cat >input <<-INPUT_END &&
 352        commit TEMP_TAG
 353        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 354        data <<COMMIT
 355        tag base
 356        COMMIT
 357
 358        from refs/heads/master
 359
 360        INPUT_END
 361
 362        test_when_finished "rm -f .git/TEMP_TAG
 363                git gc
 364                git prune" &&
 365        git fast-import <input &&
 366        test -f .git/TEMP_TAG &&
 367        test $(git rev-parse master) = $(git rev-parse TEMP_TAG^)
 368'
 369
 370test_expect_success 'B: accept empty committer' '
 371        cat >input <<-INPUT_END &&
 372        commit refs/heads/empty-committer-1
 373        committer  <> $GIT_COMMITTER_DATE
 374        data <<COMMIT
 375        empty commit
 376        COMMIT
 377        INPUT_END
 378
 379        test_when_finished "git update-ref -d refs/heads/empty-committer-1
 380                git gc
 381                git prune" &&
 382        git fast-import <input &&
 383        out=$(git fsck) &&
 384        echo "$out" &&
 385        test -z "$out"
 386'
 387
 388test_expect_success 'B: accept and fixup committer with no name' '
 389        cat >input <<-INPUT_END &&
 390        commit refs/heads/empty-committer-2
 391        committer <a@b.com> $GIT_COMMITTER_DATE
 392        data <<COMMIT
 393        empty commit
 394        COMMIT
 395        INPUT_END
 396
 397        test_when_finished "git update-ref -d refs/heads/empty-committer-2
 398                git gc
 399                git prune" &&
 400        git fast-import <input &&
 401        out=$(git fsck) &&
 402        echo "$out" &&
 403        test -z "$out"
 404'
 405
 406test_expect_success 'B: fail on invalid committer (1)' '
 407        cat >input <<-INPUT_END &&
 408        commit refs/heads/invalid-committer
 409        committer Name email> $GIT_COMMITTER_DATE
 410        data <<COMMIT
 411        empty commit
 412        COMMIT
 413        INPUT_END
 414
 415        test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 416        test_must_fail git fast-import <input
 417'
 418
 419test_expect_success 'B: fail on invalid committer (2)' '
 420        cat >input <<-INPUT_END &&
 421        commit refs/heads/invalid-committer
 422        committer Name <e<mail> $GIT_COMMITTER_DATE
 423        data <<COMMIT
 424        empty commit
 425        COMMIT
 426        INPUT_END
 427
 428        test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 429        test_must_fail git fast-import <input
 430'
 431
 432test_expect_success 'B: fail on invalid committer (3)' '
 433        cat >input <<-INPUT_END &&
 434        commit refs/heads/invalid-committer
 435        committer Name <email>> $GIT_COMMITTER_DATE
 436        data <<COMMIT
 437        empty commit
 438        COMMIT
 439        INPUT_END
 440
 441        test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 442        test_must_fail git fast-import <input
 443'
 444
 445test_expect_success 'B: fail on invalid committer (4)' '
 446        cat >input <<-INPUT_END &&
 447        commit refs/heads/invalid-committer
 448        committer Name <email $GIT_COMMITTER_DATE
 449        data <<COMMIT
 450        empty commit
 451        COMMIT
 452        INPUT_END
 453
 454        test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 455        test_must_fail git fast-import <input
 456'
 457
 458test_expect_success 'B: fail on invalid committer (5)' '
 459        cat >input <<-INPUT_END &&
 460        commit refs/heads/invalid-committer
 461        committer Name<email> $GIT_COMMITTER_DATE
 462        data <<COMMIT
 463        empty commit
 464        COMMIT
 465        INPUT_END
 466
 467        test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 468        test_must_fail git fast-import <input
 469'
 470
 471###
 472### series C
 473###
 474
 475test_expect_success 'C: incremental import create pack from stdin' '
 476        newf=$(echo hi newf | git hash-object -w --stdin) &&
 477        oldf=$(git rev-parse --verify master:file2) &&
 478        test_tick &&
 479        cat >input <<-INPUT_END &&
 480        commit refs/heads/branch
 481        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 482        data <<COMMIT
 483        second
 484        COMMIT
 485
 486        from refs/heads/master
 487        M 644 $oldf file2/oldf
 488        M 755 $newf file2/newf
 489        D file3
 490
 491        INPUT_END
 492
 493        git fast-import <input &&
 494        git whatchanged branch
 495'
 496
 497test_expect_success 'C: verify pack' '
 498        verify_packs
 499'
 500
 501test_expect_success 'C: validate reuse existing blob' '
 502        test $newf = $(git rev-parse --verify branch:file2/newf) &&
 503        test $oldf = $(git rev-parse --verify branch:file2/oldf)
 504'
 505
 506test_expect_success 'C: verify commit' '
 507        cat >expect <<-EOF &&
 508        parent $(git rev-parse --verify master^0)
 509        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 510        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 511
 512        second
 513        EOF
 514
 515        git cat-file commit branch | sed 1d >actual &&
 516        test_cmp expect actual
 517'
 518
 519test_expect_success 'C: validate rename result' '
 520        cat >expect <<-EOF &&
 521        :000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A      file2/newf
 522        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100   file2   file2/oldf
 523        :100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D      file3
 524        EOF
 525        git diff-tree -M -r master branch >actual &&
 526        compare_diff_raw expect actual
 527'
 528
 529###
 530### series D
 531###
 532
 533test_expect_success 'D: inline data in commit' '
 534        test_tick &&
 535        cat >input <<-INPUT_END &&
 536        commit refs/heads/branch
 537        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 538        data <<COMMIT
 539        third
 540        COMMIT
 541
 542        from refs/heads/branch^0
 543        M 644 inline newdir/interesting
 544        data <<EOF
 545        $file5_data
 546        EOF
 547
 548        M 755 inline newdir/exec.sh
 549        data <<EOF
 550        $file6_data
 551        EOF
 552
 553        INPUT_END
 554
 555        git fast-import <input &&
 556        git whatchanged branch
 557'
 558
 559test_expect_success 'D: verify pack' '
 560        verify_packs
 561'
 562
 563test_expect_success 'D: validate new files added' '
 564        cat >expect <<-EOF &&
 565        :000000 100755 0000000000000000000000000000000000000000 e74b7d465e52746be2b4bae983670711e6e66657 A      newdir/exec.sh
 566        :000000 100644 0000000000000000000000000000000000000000 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 A      newdir/interesting
 567        EOF
 568        git diff-tree -M -r branch^ branch >actual &&
 569        compare_diff_raw expect actual
 570'
 571
 572test_expect_success 'D: verify file5' '
 573        echo "$file5_data" >expect &&
 574        git cat-file blob branch:newdir/interesting >actual &&
 575        test_cmp expect actual
 576'
 577
 578test_expect_success 'D: verify file6' '
 579        echo "$file6_data" >expect &&
 580        git cat-file blob branch:newdir/exec.sh >actual &&
 581        test_cmp expect actual
 582'
 583
 584###
 585### series E
 586###
 587
 588test_expect_success 'E: rfc2822 date, --date-format=raw' '
 589        cat >input <<-INPUT_END &&
 590        commit refs/heads/branch
 591        author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
 592        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
 593        data <<COMMIT
 594        RFC 2822 type date
 595        COMMIT
 596
 597        from refs/heads/branch^0
 598
 599        INPUT_END
 600
 601        test_must_fail git fast-import --date-format=raw <input
 602'
 603test_expect_success 'E: rfc2822 date, --date-format=rfc2822' '
 604        git fast-import --date-format=rfc2822 <input
 605'
 606
 607test_expect_success 'E: verify pack' '
 608        verify_packs
 609'
 610
 611test_expect_success 'E: verify commit' '
 612        cat >expect <<-EOF &&
 613        author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
 614        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
 615
 616        RFC 2822 type date
 617        EOF
 618        git cat-file commit branch | sed 1,2d >actual &&
 619        test_cmp expect actual
 620'
 621
 622###
 623### series F
 624###
 625
 626test_expect_success 'F: non-fast-forward update skips' '
 627        old_branch=$(git rev-parse --verify branch^0) &&
 628        test_tick &&
 629        cat >input <<-INPUT_END &&
 630        commit refs/heads/branch
 631        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 632        data <<COMMIT
 633        losing things already?
 634        COMMIT
 635
 636        from refs/heads/branch~1
 637
 638        reset refs/heads/other
 639        from refs/heads/branch
 640
 641        INPUT_END
 642
 643        test_must_fail git fast-import <input &&
 644        # branch must remain unaffected
 645        test $old_branch = $(git rev-parse --verify branch^0)
 646'
 647
 648test_expect_success 'F: verify pack' '
 649        verify_packs
 650'
 651
 652test_expect_success 'F: verify other commit' '
 653        cat >expect <<-EOF &&
 654        tree $(git rev-parse branch~1^{tree})
 655        parent $(git rev-parse branch~1)
 656        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 657        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 658
 659        losing things already?
 660        EOF
 661        git cat-file commit other >actual &&
 662        test_cmp expect actual
 663'
 664
 665###
 666### series G
 667###
 668
 669test_expect_success 'G: non-fast-forward update forced' '
 670        old_branch=$(git rev-parse --verify branch^0) &&
 671        test_tick &&
 672        cat >input <<-INPUT_END &&
 673        commit refs/heads/branch
 674        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 675        data <<COMMIT
 676        losing things already?
 677        COMMIT
 678
 679        from refs/heads/branch~1
 680
 681        INPUT_END
 682        git fast-import --force <input
 683'
 684
 685test_expect_success 'G: verify pack' '
 686        verify_packs
 687'
 688
 689test_expect_success 'G: branch changed, but logged' '
 690        test $old_branch != $(git rev-parse --verify branch^0) &&
 691        test $old_branch = $(git rev-parse --verify branch@{1})
 692'
 693
 694###
 695### series H
 696###
 697
 698test_expect_success 'H: deletall, add 1' '
 699        test_tick &&
 700        cat >input <<-INPUT_END &&
 701        commit refs/heads/H
 702        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 703        data <<COMMIT
 704        third
 705        COMMIT
 706
 707        from refs/heads/branch^0
 708        M 644 inline i-will-die
 709        data <<EOF
 710        this file will never exist.
 711        EOF
 712
 713        deleteall
 714        M 644 inline h/e/l/lo
 715        data <<EOF
 716        $file5_data
 717        EOF
 718
 719        INPUT_END
 720        git fast-import <input &&
 721        git whatchanged H
 722'
 723
 724test_expect_success 'H: verify pack' '
 725        verify_packs
 726'
 727
 728test_expect_success 'H: validate old files removed, new files added' '
 729        cat >expect <<-EOF &&
 730        :100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D      file2/newf
 731        :100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D      file2/oldf
 732        :100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D      file4
 733        :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100   newdir/interesting      h/e/l/lo
 734        :100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D      newdir/exec.sh
 735        EOF
 736        git diff-tree -M -r H^ H >actual &&
 737        compare_diff_raw expect actual
 738'
 739
 740test_expect_success 'H: verify file' '
 741        echo "$file5_data" >expect &&
 742        git cat-file blob H:h/e/l/lo >actual &&
 743        test_cmp expect actual
 744'
 745
 746###
 747### series I
 748###
 749
 750test_expect_success 'I: export-pack-edges' '
 751        cat >input <<-INPUT_END &&
 752        commit refs/heads/export-boundary
 753        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 754        data <<COMMIT
 755        we have a border.  its only 40 characters wide.
 756        COMMIT
 757
 758        from refs/heads/branch
 759
 760        INPUT_END
 761        git fast-import --export-pack-edges=edges.list <input
 762'
 763
 764test_expect_success 'I: verify edge list' '
 765        cat >expect <<-EOF &&
 766        .git/objects/pack/pack-.pack: $(git rev-parse --verify export-boundary)
 767        EOF
 768        sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
 769        test_cmp expect actual
 770'
 771
 772###
 773### series J
 774###
 775
 776test_expect_success 'J: reset existing branch creates empty commit' '
 777        cat >input <<-INPUT_END &&
 778        commit refs/heads/J
 779        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 780        data <<COMMIT
 781        create J
 782        COMMIT
 783
 784        from refs/heads/branch
 785
 786        reset refs/heads/J
 787
 788        commit refs/heads/J
 789        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 790        data <<COMMIT
 791        initialize J
 792        COMMIT
 793
 794        INPUT_END
 795        git fast-import <input
 796'
 797test_expect_success 'J: branch has 1 commit, empty tree' '
 798        test 1 = $(git rev-list J | wc -l) &&
 799        test 0 = $(git ls-tree J | wc -l)
 800'
 801
 802test_expect_success 'J: tag must fail on empty branch' '
 803        cat >input <<-INPUT_END &&
 804        reset refs/heads/J2
 805
 806        tag wrong_tag
 807        from refs/heads/J2
 808        data <<EOF
 809        Tag branch that was reset.
 810        EOF
 811        INPUT_END
 812        test_must_fail git fast-import <input
 813'
 814
 815###
 816### series K
 817###
 818
 819test_expect_success 'K: reinit branch with from' '
 820        cat >input <<-INPUT_END &&
 821        commit refs/heads/K
 822        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 823        data <<COMMIT
 824        create K
 825        COMMIT
 826
 827        from refs/heads/branch
 828
 829        commit refs/heads/K
 830        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 831        data <<COMMIT
 832        redo K
 833        COMMIT
 834
 835        from refs/heads/branch^1
 836
 837        INPUT_END
 838        git fast-import <input
 839'
 840test_expect_success 'K: verify K^1 = branch^1' '
 841        test $(git rev-parse --verify branch^1) \
 842                = $(git rev-parse --verify K^1)
 843'
 844
 845###
 846### series L
 847###
 848
 849test_expect_success 'L: verify internal tree sorting' '
 850        cat >input <<-INPUT_END &&
 851        blob
 852        mark :1
 853        data <<EOF
 854        some data
 855        EOF
 856
 857        blob
 858        mark :2
 859        data <<EOF
 860        other data
 861        EOF
 862
 863        commit refs/heads/L
 864        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 865        data <<COMMIT
 866        create L
 867        COMMIT
 868
 869        M 644 :1 b.
 870        M 644 :1 b/other
 871        M 644 :1 ba
 872
 873        commit refs/heads/L
 874        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 875        data <<COMMIT
 876        update L
 877        COMMIT
 878
 879        M 644 :2 b.
 880        M 644 :2 b/other
 881        M 644 :2 ba
 882        INPUT_END
 883
 884        cat >expect <<-EXPECT_END &&
 885        :100644 100644 4268632... 55d3a52... M  b.
 886        :040000 040000 0ae5cac... 443c768... M  b
 887        :100644 100644 4268632... 55d3a52... M  ba
 888        EXPECT_END
 889
 890        git fast-import <input &&
 891        git diff-tree --abbrev --raw L^ L >output &&
 892        test_cmp expect output
 893'
 894
 895test_expect_success 'L: nested tree copy does not corrupt deltas' '
 896        cat >input <<-INPUT_END &&
 897        blob
 898        mark :1
 899        data <<EOF
 900        the data
 901        EOF
 902
 903        commit refs/heads/L2
 904        committer C O Mitter <committer@example.com> 1112912473 -0700
 905        data <<COMMIT
 906        init L2
 907        COMMIT
 908        M 644 :1 a/b/c
 909        M 644 :1 a/b/d
 910        M 644 :1 a/e/f
 911
 912        commit refs/heads/L2
 913        committer C O Mitter <committer@example.com> 1112912473 -0700
 914        data <<COMMIT
 915        update L2
 916        COMMIT
 917        C a g
 918        C a/e g/b
 919        M 644 :1 g/b/h
 920        INPUT_END
 921
 922        cat >expect <<-\EOF &&
 923        g/b/f
 924        g/b/h
 925        EOF
 926
 927        test_when_finished "git update-ref -d refs/heads/L2" &&
 928        git fast-import <input &&
 929        git ls-tree L2 g/b/ >tmp &&
 930        cat tmp | cut -f 2 >actual &&
 931        test_cmp expect actual &&
 932        git fsck $(git rev-parse L2)
 933'
 934
 935###
 936### series M
 937###
 938
 939test_expect_success 'M: rename file in same subdirectory' '
 940        test_tick &&
 941        cat >input <<-INPUT_END &&
 942        commit refs/heads/M1
 943        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 944        data <<COMMIT
 945        file rename
 946        COMMIT
 947
 948        from refs/heads/branch^0
 949        R file2/newf file2/n.e.w.f
 950
 951        INPUT_END
 952
 953        cat >expect <<-EOF &&
 954        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100   file2/newf      file2/n.e.w.f
 955        EOF
 956        git fast-import <input &&
 957        git diff-tree -M -r M1^ M1 >actual &&
 958        compare_diff_raw expect actual
 959'
 960
 961test_expect_success 'M: rename file to new subdirectory' '
 962        cat >input <<-INPUT_END &&
 963        commit refs/heads/M2
 964        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 965        data <<COMMIT
 966        file rename
 967        COMMIT
 968
 969        from refs/heads/branch^0
 970        R file2/newf i/am/new/to/you
 971
 972        INPUT_END
 973
 974        cat >expect <<-EOF &&
 975        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100   file2/newf      i/am/new/to/you
 976        EOF
 977        git fast-import <input &&
 978        git diff-tree -M -r M2^ M2 >actual &&
 979        compare_diff_raw expect actual
 980'
 981
 982test_expect_success 'M: rename subdirectory to new subdirectory' '
 983        cat >input <<-INPUT_END &&
 984        commit refs/heads/M3
 985        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 986        data <<COMMIT
 987        file rename
 988        COMMIT
 989
 990        from refs/heads/M2^0
 991        R i other/sub
 992
 993        INPUT_END
 994
 995        cat >expect <<-EOF &&
 996        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100   i/am/new/to/you other/sub/am/new/to/you
 997        EOF
 998        git fast-import <input &&
 999        git diff-tree -M -r M3^ M3 >actual &&
1000        compare_diff_raw expect actual
1001'
1002
1003test_expect_success 'M: rename root to subdirectory' '
1004        cat >input <<-INPUT_END &&
1005        commit refs/heads/M4
1006        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1007        data <<COMMIT
1008        rename root
1009        COMMIT
1010
1011        from refs/heads/M2^0
1012        R "" sub
1013
1014        INPUT_END
1015
1016        cat >expect <<-EOF &&
1017        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100   file2/oldf      sub/file2/oldf
1018        :100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 R100   file4   sub/file4
1019        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100   i/am/new/to/you sub/i/am/new/to/you
1020        :100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 R100   newdir/exec.sh  sub/newdir/exec.sh
1021        :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100   newdir/interesting      sub/newdir/interesting
1022        EOF
1023        git fast-import <input &&
1024        git diff-tree -M -r M4^ M4 >actual &&
1025        cat actual &&
1026        compare_diff_raw expect actual
1027'
1028
1029###
1030### series N
1031###
1032
1033test_expect_success 'N: copy file in same subdirectory' '
1034        test_tick &&
1035        cat >input <<-INPUT_END &&
1036        commit refs/heads/N1
1037        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1038        data <<COMMIT
1039        file copy
1040        COMMIT
1041
1042        from refs/heads/branch^0
1043        C file2/newf file2/n.e.w.f
1044
1045        INPUT_END
1046
1047        cat >expect <<-EOF &&
1048        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      file2/n.e.w.f
1049        EOF
1050        git fast-import <input &&
1051        git diff-tree -C --find-copies-harder -r N1^ N1 >actual &&
1052        compare_diff_raw expect actual
1053'
1054
1055test_expect_success 'N: copy then modify subdirectory' '
1056        cat >input <<-INPUT_END &&
1057        commit refs/heads/N2
1058        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1059        data <<COMMIT
1060        clean directory copy
1061        COMMIT
1062
1063        from refs/heads/branch^0
1064        C file2 file3
1065
1066        commit refs/heads/N2
1067        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1068        data <<COMMIT
1069        modify directory copy
1070        COMMIT
1071
1072        M 644 inline file3/file5
1073        data <<EOF
1074        $file5_data
1075        EOF
1076
1077        INPUT_END
1078
1079        cat >expect <<-EOF &&
1080        :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100   newdir/interesting      file3/file5
1081        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      file3/newf
1082        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      file3/oldf
1083        EOF
1084        git fast-import <input &&
1085        git diff-tree -C --find-copies-harder -r N2^^ N2 >actual &&
1086        compare_diff_raw expect actual
1087'
1088
1089test_expect_success 'N: copy dirty subdirectory' '
1090        cat >input <<-INPUT_END &&
1091        commit refs/heads/N3
1092        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1093        data <<COMMIT
1094        dirty directory copy
1095        COMMIT
1096
1097        from refs/heads/branch^0
1098        M 644 inline file2/file5
1099        data <<EOF
1100        $file5_data
1101        EOF
1102
1103        C file2 file3
1104        D file2/file5
1105
1106        INPUT_END
1107
1108        git fast-import <input &&
1109        test $(git rev-parse N2^{tree}) = $(git rev-parse N3^{tree})
1110'
1111
1112test_expect_success 'N: copy directory by id' '
1113        cat >expect <<-\EOF &&
1114        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      file3/newf
1115        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      file3/oldf
1116        EOF
1117        subdir=$(git rev-parse refs/heads/branch^0:file2) &&
1118        cat >input <<-INPUT_END &&
1119        commit refs/heads/N4
1120        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1121        data <<COMMIT
1122        copy by tree hash
1123        COMMIT
1124
1125        from refs/heads/branch^0
1126        M 040000 $subdir file3
1127        INPUT_END
1128        git fast-import <input &&
1129        git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
1130        compare_diff_raw expect actual
1131'
1132
1133test_expect_success PIPE 'N: read and copy directory' '
1134        cat >expect <<-\EOF &&
1135        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      file3/newf
1136        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      file3/oldf
1137        EOF
1138        git update-ref -d refs/heads/N4 &&
1139        rm -f backflow &&
1140        mkfifo backflow &&
1141        (
1142                exec <backflow &&
1143                cat <<-EOF &&
1144                commit refs/heads/N4
1145                committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1146                data <<COMMIT
1147                copy by tree hash, part 2
1148                COMMIT
1149
1150                from refs/heads/branch^0
1151                ls "file2"
1152                EOF
1153                read mode type tree filename &&
1154                echo "M 040000 $tree file3"
1155        ) |
1156        git fast-import --cat-blob-fd=3 3>backflow &&
1157        git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
1158        compare_diff_raw expect actual
1159'
1160
1161test_expect_success PIPE 'N: empty directory reads as missing' '
1162        cat <<-\EOF >expect &&
1163        OBJNAME
1164        :000000 100644 OBJNAME OBJNAME A        unrelated
1165        EOF
1166        echo "missing src" >expect.response &&
1167        git update-ref -d refs/heads/read-empty &&
1168        rm -f backflow &&
1169        mkfifo backflow &&
1170        (
1171                exec <backflow &&
1172                cat <<-EOF &&
1173                commit refs/heads/read-empty
1174                committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1175                data <<COMMIT
1176                read "empty" (missing) directory
1177                COMMIT
1178
1179                M 100644 inline src/greeting
1180                data <<BLOB
1181                hello
1182                BLOB
1183                C src/greeting dst1/non-greeting
1184                C src/greeting unrelated
1185                # leave behind "empty" src directory
1186                D src/greeting
1187                ls "src"
1188                EOF
1189                read -r line &&
1190                printf "%s\n" "$line" >response &&
1191                cat <<-\EOF
1192                D dst1
1193                D dst2
1194                EOF
1195        ) |
1196        git fast-import --cat-blob-fd=3 3>backflow &&
1197        test_cmp expect.response response &&
1198        git rev-list read-empty |
1199        git diff-tree -r --root --stdin |
1200        sed "s/$_x40/OBJNAME/g" >actual &&
1201        test_cmp expect actual
1202'
1203
1204test_expect_success 'N: copy root directory by tree hash' '
1205        cat >expect <<-\EOF &&
1206        :100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D      file3/newf
1207        :100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D      file3/oldf
1208        EOF
1209        root=$(git rev-parse refs/heads/branch^0^{tree}) &&
1210        cat >input <<-INPUT_END &&
1211        commit refs/heads/N6
1212        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1213        data <<COMMIT
1214        copy root directory by tree hash
1215        COMMIT
1216
1217        from refs/heads/branch^0
1218        M 040000 $root ""
1219        INPUT_END
1220        git fast-import <input &&
1221        git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
1222        compare_diff_raw expect actual
1223'
1224
1225test_expect_success 'N: copy root by path' '
1226        cat >expect <<-\EOF &&
1227        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      oldroot/file2/newf
1228        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      oldroot/file2/oldf
1229        :100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 C100   file4   oldroot/file4
1230        :100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 C100   newdir/exec.sh  oldroot/newdir/exec.sh
1231        :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100   newdir/interesting      oldroot/newdir/interesting
1232        EOF
1233        cat >input <<-INPUT_END &&
1234        commit refs/heads/N-copy-root-path
1235        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1236        data <<COMMIT
1237        copy root directory by (empty) path
1238        COMMIT
1239
1240        from refs/heads/branch^0
1241        C "" oldroot
1242        INPUT_END
1243        git fast-import <input &&
1244        git diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&
1245        compare_diff_raw expect actual
1246'
1247
1248test_expect_success 'N: delete directory by copying' '
1249        cat >expect <<-\EOF &&
1250        OBJID
1251        :100644 000000 OBJID OBJID D    foo/bar/qux
1252        OBJID
1253        :000000 100644 OBJID OBJID A    foo/bar/baz
1254        :000000 100644 OBJID OBJID A    foo/bar/qux
1255        EOF
1256        empty_tree=$(git mktree </dev/null) &&
1257        cat >input <<-INPUT_END &&
1258        commit refs/heads/N-delete
1259        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1260        data <<COMMIT
1261        collect data to be deleted
1262        COMMIT
1263
1264        deleteall
1265        M 100644 inline foo/bar/baz
1266        data <<DATA_END
1267        hello
1268        DATA_END
1269        C "foo/bar/baz" "foo/bar/qux"
1270        C "foo/bar/baz" "foo/bar/quux/1"
1271        C "foo/bar/baz" "foo/bar/quuux"
1272        M 040000 $empty_tree foo/bar/quux
1273        M 040000 $empty_tree foo/bar/quuux
1274
1275        commit refs/heads/N-delete
1276        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1277        data <<COMMIT
1278        delete subdirectory
1279        COMMIT
1280
1281        M 040000 $empty_tree foo/bar/qux
1282        INPUT_END
1283        git fast-import <input &&
1284        git rev-list N-delete |
1285                git diff-tree -r --stdin --root --always |
1286                sed -e "s/$_x40/OBJID/g" >actual &&
1287        test_cmp expect actual
1288'
1289
1290test_expect_success 'N: modify copied tree' '
1291        cat >expect <<-\EOF &&
1292        :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100   newdir/interesting      file3/file5
1293        :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      file3/newf
1294        :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      file3/oldf
1295        EOF
1296        subdir=$(git rev-parse refs/heads/branch^0:file2) &&
1297        cat >input <<-INPUT_END &&
1298        commit refs/heads/N5
1299        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1300        data <<COMMIT
1301        copy by tree hash
1302        COMMIT
1303
1304        from refs/heads/branch^0
1305        M 040000 $subdir file3
1306
1307        commit refs/heads/N5
1308        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1309        data <<COMMIT
1310        modify directory copy
1311        COMMIT
1312
1313        M 644 inline file3/file5
1314        data <<EOF
1315        $file5_data
1316        EOF
1317        INPUT_END
1318        git fast-import <input &&
1319        git diff-tree -C --find-copies-harder -r N5^^ N5 >actual &&
1320        compare_diff_raw expect actual
1321'
1322
1323test_expect_success 'N: reject foo/ syntax' '
1324        subdir=$(git rev-parse refs/heads/branch^0:file2) &&
1325        test_must_fail git fast-import <<-INPUT_END
1326        commit refs/heads/N5B
1327        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1328        data <<COMMIT
1329        copy with invalid syntax
1330        COMMIT
1331
1332        from refs/heads/branch^0
1333        M 040000 $subdir file3/
1334        INPUT_END
1335'
1336
1337test_expect_success 'N: reject foo/ syntax in copy source' '
1338        test_must_fail git fast-import <<-INPUT_END
1339        commit refs/heads/N5C
1340        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1341        data <<COMMIT
1342        copy with invalid syntax
1343        COMMIT
1344
1345        from refs/heads/branch^0
1346        C file2/ file3
1347        INPUT_END
1348'
1349
1350test_expect_success 'N: reject foo/ syntax in rename source' '
1351        test_must_fail git fast-import <<-INPUT_END
1352        commit refs/heads/N5D
1353        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1354        data <<COMMIT
1355        rename with invalid syntax
1356        COMMIT
1357
1358        from refs/heads/branch^0
1359        R file2/ file3
1360        INPUT_END
1361'
1362
1363test_expect_success 'N: reject foo/ syntax in ls argument' '
1364        test_must_fail git fast-import <<-INPUT_END
1365        commit refs/heads/N5E
1366        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1367        data <<COMMIT
1368        copy with invalid syntax
1369        COMMIT
1370
1371        from refs/heads/branch^0
1372        ls "file2/"
1373        INPUT_END
1374'
1375
1376test_expect_success 'N: copy to root by id and modify' '
1377        echo "hello, world" >expect.foo &&
1378        echo hello >expect.bar &&
1379        git fast-import <<-SETUP_END &&
1380        commit refs/heads/N7
1381        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1382        data <<COMMIT
1383        hello, tree
1384        COMMIT
1385
1386        deleteall
1387        M 644 inline foo/bar
1388        data <<EOF
1389        hello
1390        EOF
1391        SETUP_END
1392
1393        tree=$(git rev-parse --verify N7:) &&
1394        git fast-import <<-INPUT_END &&
1395        commit refs/heads/N8
1396        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1397        data <<COMMIT
1398        copy to root by id and modify
1399        COMMIT
1400
1401        M 040000 $tree ""
1402        M 644 inline foo/foo
1403        data <<EOF
1404        hello, world
1405        EOF
1406        INPUT_END
1407        git show N8:foo/foo >actual.foo &&
1408        git show N8:foo/bar >actual.bar &&
1409        test_cmp expect.foo actual.foo &&
1410        test_cmp expect.bar actual.bar
1411'
1412
1413test_expect_success 'N: extract subtree' '
1414        branch=$(git rev-parse --verify refs/heads/branch^{tree}) &&
1415        cat >input <<-INPUT_END &&
1416        commit refs/heads/N9
1417        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1418        data <<COMMIT
1419        extract subtree branch:newdir
1420        COMMIT
1421
1422        M 040000 $branch ""
1423        C "newdir" ""
1424        INPUT_END
1425        git fast-import <input &&
1426        git diff --exit-code branch:newdir N9
1427'
1428
1429test_expect_success 'N: modify subtree, extract it, and modify again' '
1430        echo hello >expect.baz &&
1431        echo hello, world >expect.qux &&
1432        git fast-import <<-SETUP_END &&
1433        commit refs/heads/N10
1434        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1435        data <<COMMIT
1436        hello, tree
1437        COMMIT
1438
1439        deleteall
1440        M 644 inline foo/bar/baz
1441        data <<EOF
1442        hello
1443        EOF
1444        SETUP_END
1445
1446        tree=$(git rev-parse --verify N10:) &&
1447        git fast-import <<-INPUT_END &&
1448        commit refs/heads/N11
1449        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1450        data <<COMMIT
1451        copy to root by id and modify
1452        COMMIT
1453
1454        M 040000 $tree ""
1455        M 100644 inline foo/bar/qux
1456        data <<EOF
1457        hello, world
1458        EOF
1459        R "foo" ""
1460        C "bar/qux" "bar/quux"
1461        INPUT_END
1462        git show N11:bar/baz >actual.baz &&
1463        git show N11:bar/qux >actual.qux &&
1464        git show N11:bar/quux >actual.quux &&
1465        test_cmp expect.baz actual.baz &&
1466        test_cmp expect.qux actual.qux &&
1467        test_cmp expect.qux actual.quux'
1468
1469###
1470### series O
1471###
1472
1473test_expect_success 'O: comments are all skipped' '
1474        cat >input <<-INPUT_END &&
1475        #we will
1476        commit refs/heads/O1
1477        # -- ignore all of this text
1478        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1479        # $GIT_COMMITTER_NAME has inserted here for his benefit.
1480        data <<COMMIT
1481        dirty directory copy
1482        COMMIT
1483
1484        # do not forget the import blank line!
1485        #
1486        # yes, we started from our usual base of branch^0.
1487        # i like branch^0.
1488        from refs/heads/branch^0
1489        # and we need to reuse file2/file5 from N3 above.
1490        M 644 inline file2/file5
1491        # otherwise the tree will be different
1492        data <<EOF
1493        $file5_data
1494        EOF
1495
1496        # do not forget to copy file2 to file3
1497        C file2 file3
1498        #
1499        # or to delete file5 from file2.
1500        D file2/file5
1501        # are we done yet?
1502
1503        INPUT_END
1504
1505        git fast-import <input &&
1506        test $(git rev-parse N3) = $(git rev-parse O1)
1507'
1508
1509test_expect_success 'O: blank lines not necessary after data commands' '
1510        cat >input <<-INPUT_END &&
1511        commit refs/heads/O2
1512        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1513        data <<COMMIT
1514        dirty directory copy
1515        COMMIT
1516        from refs/heads/branch^0
1517        M 644 inline file2/file5
1518        data <<EOF
1519        $file5_data
1520        EOF
1521        C file2 file3
1522        D file2/file5
1523
1524        INPUT_END
1525
1526        git fast-import <input &&
1527        test $(git rev-parse N3) = $(git rev-parse O2)
1528'
1529
1530test_expect_success 'O: repack before next test' '
1531        git repack -a -d
1532'
1533
1534test_expect_success 'O: blank lines not necessary after other commands' '
1535        cat >input <<-INPUT_END &&
1536        commit refs/heads/O3
1537        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1538        data <<COMMIT
1539        zstring
1540        COMMIT
1541        commit refs/heads/O3
1542        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1543        data <<COMMIT
1544        zof
1545        COMMIT
1546        checkpoint
1547        commit refs/heads/O3
1548        mark :5
1549        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1550        data <<COMMIT
1551        zempty
1552        COMMIT
1553        checkpoint
1554        commit refs/heads/O3
1555        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1556        data <<COMMIT
1557        zcommits
1558        COMMIT
1559        reset refs/tags/O3-2nd
1560        from :5
1561        reset refs/tags/O3-3rd
1562        from :5
1563        INPUT_END
1564
1565        cat >expect <<-INPUT_END &&
1566        string
1567        of
1568        empty
1569        commits
1570        INPUT_END
1571
1572        git fast-import <input &&
1573        test 8 = $(find .git/objects/pack -type f | wc -l) &&
1574        test $(git rev-parse refs/tags/O3-2nd) = $(git rev-parse O3^) &&
1575        git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual &&
1576        test_cmp expect actual
1577'
1578
1579test_expect_success 'O: progress outputs as requested by input' '
1580        cat >input <<-INPUT_END &&
1581        commit refs/heads/O4
1582        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1583        data <<COMMIT
1584        zstring
1585        COMMIT
1586        commit refs/heads/O4
1587        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1588        data <<COMMIT
1589        zof
1590        COMMIT
1591        progress Two commits down, 2 to go!
1592        commit refs/heads/O4
1593        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1594        data <<COMMIT
1595        zempty
1596        COMMIT
1597        progress Three commits down, 1 to go!
1598        commit refs/heads/O4
1599        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1600        data <<COMMIT
1601        zcommits
1602        COMMIT
1603        progress done!
1604        INPUT_END
1605        git fast-import <input >actual &&
1606        grep "progress " <input >expect &&
1607        test_cmp expect actual
1608'
1609
1610###
1611### series P (gitlinks)
1612###
1613
1614test_expect_success 'P: superproject & submodule mix' '
1615        cat >input <<-INPUT_END &&
1616        blob
1617        mark :1
1618        data 10
1619        test file
1620
1621        reset refs/heads/sub
1622        commit refs/heads/sub
1623        mark :2
1624        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1625        data 12
1626        sub_initial
1627        M 100644 :1 file
1628
1629        blob
1630        mark :3
1631        data <<DATAEND
1632        [submodule "sub"]
1633                path = sub
1634                url = "$(pwd)/sub"
1635        DATAEND
1636
1637        commit refs/heads/subuse1
1638        mark :4
1639        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1640        data 8
1641        initial
1642        from refs/heads/master
1643        M 100644 :3 .gitmodules
1644        M 160000 :2 sub
1645
1646        blob
1647        mark :5
1648        data 20
1649        test file
1650        more data
1651
1652        commit refs/heads/sub
1653        mark :6
1654        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1655        data 11
1656        sub_second
1657        from :2
1658        M 100644 :5 file
1659
1660        commit refs/heads/subuse1
1661        mark :7
1662        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1663        data 7
1664        second
1665        from :4
1666        M 160000 :6 sub
1667
1668        INPUT_END
1669
1670        git fast-import <input &&
1671        git checkout subuse1 &&
1672        rm -rf sub &&
1673        mkdir sub &&
1674        (
1675                cd sub &&
1676                git init &&
1677                git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
1678                git checkout master
1679        ) &&
1680        git submodule init &&
1681        git submodule update
1682'
1683
1684test_expect_success 'P: verbatim SHA gitlinks' '
1685        SUBLAST=$(git rev-parse --verify sub) &&
1686        SUBPREV=$(git rev-parse --verify sub^) &&
1687
1688        cat >input <<-INPUT_END &&
1689        blob
1690        mark :1
1691        data <<DATAEND
1692        [submodule "sub"]
1693                path = sub
1694                url = "$(pwd)/sub"
1695        DATAEND
1696
1697        commit refs/heads/subuse2
1698        mark :2
1699        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1700        data 8
1701        initial
1702        from refs/heads/master
1703        M 100644 :1 .gitmodules
1704        M 160000 $SUBPREV sub
1705
1706        commit refs/heads/subuse2
1707        mark :3
1708        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1709        data 7
1710        second
1711        from :2
1712        M 160000 $SUBLAST sub
1713
1714        INPUT_END
1715
1716        git branch -D sub &&
1717        git gc &&
1718        git prune &&
1719        git fast-import <input &&
1720        test $(git rev-parse --verify subuse2) = $(git rev-parse --verify subuse1)
1721'
1722
1723test_expect_success 'P: fail on inline gitlink' '
1724        test_tick &&
1725        cat >input <<-INPUT_END &&
1726        commit refs/heads/subuse3
1727        mark :1
1728        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1729        data <<COMMIT
1730        corrupt
1731        COMMIT
1732
1733        from refs/heads/subuse2
1734        M 160000 inline sub
1735        data <<DATA
1736        $SUBPREV
1737        DATA
1738
1739        INPUT_END
1740
1741        test_must_fail git fast-import <input
1742'
1743
1744test_expect_success 'P: fail on blob mark in gitlink' '
1745        test_tick &&
1746        cat >input <<-INPUT_END &&
1747        blob
1748        mark :1
1749        data <<DATA
1750        $SUBPREV
1751        DATA
1752
1753        commit refs/heads/subuse3
1754        mark :2
1755        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1756        data <<COMMIT
1757        corrupt
1758        COMMIT
1759
1760        from refs/heads/subuse2
1761        M 160000 :1 sub
1762
1763        INPUT_END
1764
1765        test_must_fail git fast-import <input
1766'
1767
1768###
1769### series Q (notes)
1770###
1771
1772test_expect_success 'Q: commit notes' '
1773        note1_data="The first note for the first commit" &&
1774        note2_data="The first note for the second commit" &&
1775        note3_data="The first note for the third commit" &&
1776        note1b_data="The second note for the first commit" &&
1777        note1c_data="The third note for the first commit" &&
1778        note2b_data="The second note for the second commit" &&
1779
1780        test_tick &&
1781        cat >input <<-INPUT_END &&
1782        blob
1783        mark :2
1784        data <<EOF
1785        $file2_data
1786        EOF
1787
1788        commit refs/heads/notes-test
1789        mark :3
1790        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1791        data <<COMMIT
1792        first (:3)
1793        COMMIT
1794
1795        M 644 :2 file2
1796
1797        blob
1798        mark :4
1799        data $file4_len
1800        $file4_data
1801        commit refs/heads/notes-test
1802        mark :5
1803        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1804        data <<COMMIT
1805        second (:5)
1806        COMMIT
1807
1808        M 644 :4 file4
1809
1810        commit refs/heads/notes-test
1811        mark :6
1812        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1813        data <<COMMIT
1814        third (:6)
1815        COMMIT
1816
1817        M 644 inline file5
1818        data <<EOF
1819        $file5_data
1820        EOF
1821
1822        M 755 inline file6
1823        data <<EOF
1824        $file6_data
1825        EOF
1826
1827        blob
1828        mark :7
1829        data <<EOF
1830        $note1_data
1831        EOF
1832
1833        blob
1834        mark :8
1835        data <<EOF
1836        $note2_data
1837        EOF
1838
1839        commit refs/notes/foobar
1840        mark :9
1841        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1842        data <<COMMIT
1843        notes (:9)
1844        COMMIT
1845
1846        N :7 :3
1847        N :8 :5
1848        N inline :6
1849        data <<EOF
1850        $note3_data
1851        EOF
1852
1853        commit refs/notes/foobar
1854        mark :10
1855        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1856        data <<COMMIT
1857        notes (:10)
1858        COMMIT
1859
1860        N inline :3
1861        data <<EOF
1862        $note1b_data
1863        EOF
1864
1865        commit refs/notes/foobar2
1866        mark :11
1867        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1868        data <<COMMIT
1869        notes (:11)
1870        COMMIT
1871
1872        N inline :3
1873        data <<EOF
1874        $note1c_data
1875        EOF
1876
1877        commit refs/notes/foobar
1878        mark :12
1879        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1880        data <<COMMIT
1881        notes (:12)
1882        COMMIT
1883
1884        deleteall
1885        N inline :5
1886        data <<EOF
1887        $note2b_data
1888        EOF
1889
1890        INPUT_END
1891
1892        git fast-import <input &&
1893        git whatchanged notes-test
1894'
1895
1896test_expect_success 'Q: verify pack' '
1897        verify_packs
1898'
1899
1900test_expect_success 'Q: verify first commit' '
1901        commit1=$(git rev-parse notes-test~2) &&
1902        commit2=$(git rev-parse notes-test^) &&
1903        commit3=$(git rev-parse notes-test) &&
1904
1905        cat >expect <<-EOF &&
1906        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1907        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1908
1909        first (:3)
1910        EOF
1911        git cat-file commit notes-test~2 | sed 1d >actual &&
1912        test_cmp expect actual
1913'
1914
1915test_expect_success 'Q: verify second commit' '
1916        cat >expect <<-EOF &&
1917        parent $commit1
1918        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1919        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1920
1921        second (:5)
1922        EOF
1923        git cat-file commit notes-test^ | sed 1d >actual &&
1924        test_cmp expect actual
1925'
1926
1927test_expect_success 'Q: verify third commit' '
1928        cat >expect <<-EOF &&
1929        parent $commit2
1930        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1931        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1932
1933        third (:6)
1934        EOF
1935        git cat-file commit notes-test | sed 1d >actual &&
1936        test_cmp expect actual
1937'
1938
1939test_expect_success 'Q: verify first notes commit' '
1940        cat >expect <<-EOF &&
1941        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1942        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1943
1944        notes (:9)
1945        EOF
1946        git cat-file commit refs/notes/foobar~2 | sed 1d >actual &&
1947        test_cmp expect actual
1948'
1949
1950test_expect_success 'Q: verify first notes tree' '
1951        cat >expect.unsorted <<-EOF &&
1952        100644 blob $commit1
1953        100644 blob $commit2
1954        100644 blob $commit3
1955        EOF
1956        cat expect.unsorted | sort >expect &&
1957        git cat-file -p refs/notes/foobar~2^{tree} | sed "s/ [0-9a-f]*  / /" >actual &&
1958        test_cmp expect actual
1959'
1960
1961test_expect_success 'Q: verify first note for first commit' '
1962        echo "$note1_data" >expect &&
1963        git cat-file blob refs/notes/foobar~2:$commit1 >actual &&
1964        test_cmp expect actual
1965'
1966
1967test_expect_success 'Q: verify first note for second commit' '
1968        echo "$note2_data" >expect &&
1969        git cat-file blob refs/notes/foobar~2:$commit2 >actual &&
1970        test_cmp expect actual
1971'
1972
1973test_expect_success 'Q: verify first note for third commit' '
1974        echo "$note3_data" >expect &&
1975        git cat-file blob refs/notes/foobar~2:$commit3 >actual &&
1976        test_cmp expect actual
1977'
1978
1979test_expect_success 'Q: verify second notes commit' '
1980        cat >expect <<-EOF &&
1981        parent $(git rev-parse --verify refs/notes/foobar~2)
1982        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1983        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
1984
1985        notes (:10)
1986        EOF
1987        git cat-file commit refs/notes/foobar^ | sed 1d >actual &&
1988        test_cmp expect actual
1989'
1990
1991test_expect_success 'Q: verify second notes tree' '
1992        cat >expect.unsorted <<-EOF &&
1993        100644 blob $commit1
1994        100644 blob $commit2
1995        100644 blob $commit3
1996        EOF
1997        cat expect.unsorted | sort >expect &&
1998        git cat-file -p refs/notes/foobar^^{tree} | sed "s/ [0-9a-f]*   / /" >actual &&
1999        test_cmp expect actual
2000'
2001
2002test_expect_success 'Q: verify second note for first commit' '
2003        echo "$note1b_data" >expect &&
2004        git cat-file blob refs/notes/foobar^:$commit1 >actual &&
2005        test_cmp expect actual
2006'
2007
2008test_expect_success 'Q: verify first note for second commit' '
2009        echo "$note2_data" >expect &&
2010        git cat-file blob refs/notes/foobar^:$commit2 >actual &&
2011        test_cmp expect actual
2012'
2013
2014test_expect_success 'Q: verify first note for third commit' '
2015        echo "$note3_data" >expect &&
2016        git cat-file blob refs/notes/foobar^:$commit3 >actual &&
2017        test_cmp expect actual
2018'
2019
2020test_expect_success 'Q: verify third notes commit' '
2021        cat >expect <<-EOF &&
2022        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2023        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2024
2025        notes (:11)
2026        EOF
2027        git cat-file commit refs/notes/foobar2 | sed 1d >actual &&
2028        test_cmp expect actual
2029'
2030
2031test_expect_success 'Q: verify third notes tree' '
2032        cat >expect.unsorted <<-EOF &&
2033        100644 blob $commit1
2034        EOF
2035        cat expect.unsorted | sort >expect &&
2036        git cat-file -p refs/notes/foobar2^{tree} | sed "s/ [0-9a-f]*   / /" >actual &&
2037        test_cmp expect actual
2038'
2039
2040test_expect_success 'Q: verify third note for first commit' '
2041        echo "$note1c_data" >expect &&
2042        git cat-file blob refs/notes/foobar2:$commit1 >actual &&
2043        test_cmp expect actual
2044'
2045
2046test_expect_success 'Q: verify fourth notes commit' '
2047        cat >expect <<-EOF &&
2048        parent $(git rev-parse --verify refs/notes/foobar^)
2049        author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2050        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2051
2052        notes (:12)
2053        EOF
2054        git cat-file commit refs/notes/foobar | sed 1d >actual &&
2055        test_cmp expect actual
2056'
2057
2058test_expect_success 'Q: verify fourth notes tree' '
2059        cat >expect.unsorted <<-EOF &&
2060        100644 blob $commit2
2061        EOF
2062        cat expect.unsorted | sort >expect &&
2063        git cat-file -p refs/notes/foobar^{tree} | sed "s/ [0-9a-f]*    / /" >actual &&
2064        test_cmp expect actual
2065'
2066
2067test_expect_success 'Q: verify second note for second commit' '
2068        echo "$note2b_data" >expect &&
2069        git cat-file blob refs/notes/foobar:$commit2 >actual &&
2070        test_cmp expect actual
2071'
2072
2073test_expect_success 'Q: deny note on empty branch' '
2074        cat >input <<-EOF &&
2075        reset refs/heads/Q0
2076
2077        commit refs/heads/note-Q0
2078        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2079        data <<COMMIT
2080        Note for an empty branch.
2081        COMMIT
2082
2083        N inline refs/heads/Q0
2084        data <<NOTE
2085        some note
2086        NOTE
2087        EOF
2088        test_must_fail git fast-import <input
2089'
2090###
2091### series R (feature and option)
2092###
2093
2094test_expect_success 'R: abort on unsupported feature' '
2095        cat >input <<-EOF &&
2096        feature no-such-feature-exists
2097        EOF
2098
2099        test_must_fail git fast-import <input
2100'
2101
2102test_expect_success 'R: supported feature is accepted' '
2103        cat >input <<-EOF &&
2104        feature date-format=now
2105        EOF
2106
2107        git fast-import <input
2108'
2109
2110test_expect_success 'R: abort on receiving feature after data command' '
2111        cat >input <<-EOF &&
2112        blob
2113        data 3
2114        hi
2115        feature date-format=now
2116        EOF
2117
2118        test_must_fail git fast-import <input
2119'
2120
2121test_expect_success 'R: only one import-marks feature allowed per stream' '
2122        cat >input <<-EOF &&
2123        feature import-marks=git.marks
2124        feature import-marks=git2.marks
2125        EOF
2126
2127        test_must_fail git fast-import <input
2128'
2129
2130test_expect_success 'R: export-marks feature results in a marks file being created' '
2131        cat >input <<-EOF &&
2132        feature export-marks=git.marks
2133        blob
2134        mark :1
2135        data 3
2136        hi
2137
2138        EOF
2139
2140        cat input | git fast-import &&
2141        grep :1 git.marks
2142'
2143
2144test_expect_success 'R: export-marks options can be overridden by commandline options' '
2145        cat input | git fast-import --export-marks=other.marks &&
2146        grep :1 other.marks
2147'
2148
2149test_expect_success 'R: catch typo in marks file name' '
2150        test_must_fail git fast-import --import-marks=nonexistent.marks </dev/null &&
2151        echo "feature import-marks=nonexistent.marks" |
2152        test_must_fail git fast-import
2153'
2154
2155test_expect_success 'R: import and output marks can be the same file' '
2156        rm -f io.marks &&
2157        blob=$(echo hi | git hash-object --stdin) &&
2158        cat >expect <<-EOF &&
2159        :1 $blob
2160        :2 $blob
2161        EOF
2162        git fast-import --export-marks=io.marks <<-\EOF &&
2163        blob
2164        mark :1
2165        data 3
2166        hi
2167
2168        EOF
2169        git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF &&
2170        blob
2171        mark :2
2172        data 3
2173        hi
2174
2175        EOF
2176        test_cmp expect io.marks
2177'
2178
2179test_expect_success 'R: --import-marks=foo --output-marks=foo to create foo fails' '
2180        rm -f io.marks &&
2181        test_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF
2182        blob
2183        mark :1
2184        data 3
2185        hi
2186
2187        EOF
2188'
2189
2190test_expect_success 'R: --import-marks-if-exists' '
2191        rm -f io.marks &&
2192        blob=$(echo hi | git hash-object --stdin) &&
2193        echo ":1 $blob" >expect &&
2194        git fast-import --import-marks-if-exists=io.marks --export-marks=io.marks <<-\EOF &&
2195        blob
2196        mark :1
2197        data 3
2198        hi
2199
2200        EOF
2201        test_cmp expect io.marks
2202'
2203
2204test_expect_success 'R: feature import-marks-if-exists' '
2205        rm -f io.marks &&
2206        >expect &&
2207
2208        git fast-import --export-marks=io.marks <<-\EOF &&
2209        feature import-marks-if-exists=not_io.marks
2210        EOF
2211        test_cmp expect io.marks &&
2212
2213        blob=$(echo hi | git hash-object --stdin) &&
2214
2215        echo ":1 $blob" >io.marks &&
2216        echo ":1 $blob" >expect &&
2217        echo ":2 $blob" >>expect &&
2218
2219        git fast-import --export-marks=io.marks <<-\EOF &&
2220        feature import-marks-if-exists=io.marks
2221        blob
2222        mark :2
2223        data 3
2224        hi
2225
2226        EOF
2227        test_cmp expect io.marks &&
2228
2229        echo ":3 $blob" >>expect &&
2230
2231        git fast-import --import-marks=io.marks \
2232                        --export-marks=io.marks <<-\EOF &&
2233        feature import-marks-if-exists=not_io.marks
2234        blob
2235        mark :3
2236        data 3
2237        hi
2238
2239        EOF
2240        test_cmp expect io.marks &&
2241
2242        >expect &&
2243
2244        git fast-import --import-marks-if-exists=not_io.marks \
2245                        --export-marks=io.marks <<-\EOF &&
2246        feature import-marks-if-exists=io.marks
2247        EOF
2248        test_cmp expect io.marks
2249'
2250
2251test_expect_success 'R: import to output marks works without any content' '
2252        cat >input <<-EOF &&
2253        feature import-marks=marks.out
2254        feature export-marks=marks.new
2255        EOF
2256
2257        cat input | git fast-import &&
2258        test_cmp marks.out marks.new
2259'
2260
2261test_expect_success 'R: import marks prefers commandline marks file over the stream' '
2262        cat >input <<-EOF &&
2263        feature import-marks=nonexistent.marks
2264        feature export-marks=marks.new
2265        EOF
2266
2267        cat input | git fast-import --import-marks=marks.out &&
2268        test_cmp marks.out marks.new
2269'
2270
2271
2272test_expect_success 'R: multiple --import-marks= should be honoured' '
2273        cat >input <<-EOF &&
2274        feature import-marks=nonexistent.marks
2275        feature export-marks=combined.marks
2276        EOF
2277
2278        head -n2 marks.out > one.marks &&
2279        tail -n +3 marks.out > two.marks &&
2280        git fast-import --import-marks=one.marks --import-marks=two.marks <input &&
2281        test_cmp marks.out combined.marks
2282'
2283
2284test_expect_success 'R: feature relative-marks should be honoured' '
2285        cat >input <<-EOF &&
2286        feature relative-marks
2287        feature import-marks=relative.in
2288        feature export-marks=relative.out
2289        EOF
2290
2291        mkdir -p .git/info/fast-import/ &&
2292        cp marks.new .git/info/fast-import/relative.in &&
2293        git fast-import <input &&
2294        test_cmp marks.new .git/info/fast-import/relative.out
2295'
2296
2297test_expect_success 'R: feature no-relative-marks should be honoured' '
2298        cat >input <<-EOF &&
2299        feature relative-marks
2300        feature import-marks=relative.in
2301        feature no-relative-marks
2302        feature export-marks=non-relative.out
2303        EOF
2304
2305        git fast-import <input &&
2306        test_cmp marks.new non-relative.out
2307'
2308
2309test_expect_success 'R: feature ls supported' '
2310        echo "feature ls" |
2311        git fast-import
2312'
2313
2314test_expect_success 'R: feature cat-blob supported' '
2315        echo "feature cat-blob" |
2316        git fast-import
2317'
2318
2319test_expect_success 'R: cat-blob-fd must be a nonnegative integer' '
2320        test_must_fail git fast-import --cat-blob-fd=-1 </dev/null
2321'
2322
2323test_expect_success !MINGW 'R: print old blob' '
2324        blob=$(echo "yes it can" | git hash-object -w --stdin) &&
2325        cat >expect <<-EOF &&
2326        ${blob} blob 11
2327        yes it can
2328
2329        EOF
2330        echo "cat-blob $blob" |
2331        git fast-import --cat-blob-fd=6 6>actual &&
2332        test_cmp expect actual
2333'
2334
2335test_expect_success !MINGW 'R: in-stream cat-blob-fd not respected' '
2336        echo hello >greeting &&
2337        blob=$(git hash-object -w greeting) &&
2338        cat >expect <<-EOF &&
2339        ${blob} blob 6
2340        hello
2341
2342        EOF
2343        git fast-import --cat-blob-fd=3 3>actual.3 >actual.1 <<-EOF &&
2344        cat-blob $blob
2345        EOF
2346        test_cmp expect actual.3 &&
2347        test_must_be_empty actual.1 &&
2348        git fast-import 3>actual.3 >actual.1 <<-EOF &&
2349        option cat-blob-fd=3
2350        cat-blob $blob
2351        EOF
2352        test_must_be_empty actual.3 &&
2353        test_cmp expect actual.1
2354'
2355
2356test_expect_success !MINGW 'R: print mark for new blob' '
2357        echo "effluentish" | git hash-object --stdin >expect &&
2358        git fast-import --cat-blob-fd=6 6>actual <<-\EOF &&
2359        blob
2360        mark :1
2361        data <<BLOB_END
2362        effluentish
2363        BLOB_END
2364        get-mark :1
2365        EOF
2366        test_cmp expect actual
2367'
2368
2369test_expect_success !MINGW 'R: print new blob' '
2370        blob=$(echo "yep yep yep" | git hash-object --stdin) &&
2371        cat >expect <<-EOF &&
2372        ${blob} blob 12
2373        yep yep yep
2374
2375        EOF
2376        git fast-import --cat-blob-fd=6 6>actual <<-\EOF &&
2377        blob
2378        mark :1
2379        data <<BLOB_END
2380        yep yep yep
2381        BLOB_END
2382        cat-blob :1
2383        EOF
2384        test_cmp expect actual
2385'
2386
2387test_expect_success !MINGW 'R: print new blob by sha1' '
2388        blob=$(echo "a new blob named by sha1" | git hash-object --stdin) &&
2389        cat >expect <<-EOF &&
2390        ${blob} blob 25
2391        a new blob named by sha1
2392
2393        EOF
2394        git fast-import --cat-blob-fd=6 6>actual <<-EOF &&
2395        blob
2396        data <<BLOB_END
2397        a new blob named by sha1
2398        BLOB_END
2399        cat-blob $blob
2400        EOF
2401        test_cmp expect actual
2402'
2403
2404test_expect_success 'setup: big file' '
2405        (
2406                echo "the quick brown fox jumps over the lazy dog" >big &&
2407                for i in 1 2 3
2408                do
2409                        cat big big big big >bigger &&
2410                        cat bigger bigger bigger bigger >big ||
2411                        exit
2412                done
2413        )
2414'
2415
2416test_expect_success 'R: print two blobs to stdout' '
2417        blob1=$(git hash-object big) &&
2418        blob1_len=$(wc -c <big) &&
2419        blob2=$(echo hello | git hash-object --stdin) &&
2420        {
2421                echo ${blob1} blob $blob1_len &&
2422                cat big &&
2423                cat <<-EOF
2424
2425                ${blob2} blob 6
2426                hello
2427
2428                EOF
2429        } >expect &&
2430        {
2431                cat <<-\END_PART1 &&
2432                        blob
2433                        mark :1
2434                        data <<data_end
2435                END_PART1
2436                cat big &&
2437                cat <<-\EOF
2438                        data_end
2439                        blob
2440                        mark :2
2441                        data <<data_end
2442                        hello
2443                        data_end
2444                        cat-blob :1
2445                        cat-blob :2
2446                EOF
2447        } |
2448        git fast-import >actual &&
2449        test_cmp expect actual
2450'
2451
2452test_expect_success PIPE 'R: copy using cat-file' '
2453        expect_id=$(git hash-object big) &&
2454        expect_len=$(wc -c <big) &&
2455        echo $expect_id blob $expect_len >expect.response &&
2456
2457        rm -f blobs &&
2458        cat >frontend <<-\FRONTEND_END &&
2459        #!/bin/sh
2460        FRONTEND_END
2461
2462        mkfifo blobs &&
2463        (
2464                export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE &&
2465                cat <<-\EOF &&
2466                feature cat-blob
2467                blob
2468                mark :1
2469                data <<BLOB
2470                EOF
2471                cat big &&
2472                cat <<-\EOF &&
2473                BLOB
2474                cat-blob :1
2475                EOF
2476
2477                read blob_id type size <&3 &&
2478                echo "$blob_id $type $size" >response &&
2479                head_c $size >blob <&3 &&
2480                read newline <&3 &&
2481
2482                cat <<-EOF &&
2483                commit refs/heads/copied
2484                committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2485                data <<COMMIT
2486                copy big file as file3
2487                COMMIT
2488                M 644 inline file3
2489                data <<BLOB
2490                EOF
2491                cat blob &&
2492                echo BLOB
2493        ) 3<blobs |
2494        git fast-import --cat-blob-fd=3 3>blobs &&
2495        git show copied:file3 >actual &&
2496        test_cmp expect.response response &&
2497        test_cmp big actual
2498'
2499
2500test_expect_success PIPE 'R: print blob mid-commit' '
2501        rm -f blobs &&
2502        echo "A blob from _before_ the commit." >expect &&
2503        mkfifo blobs &&
2504        (
2505                exec 3<blobs &&
2506                cat <<-EOF &&
2507                feature cat-blob
2508                blob
2509                mark :1
2510                data <<BLOB
2511                A blob from _before_ the commit.
2512                BLOB
2513                commit refs/heads/temporary
2514                committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2515                data <<COMMIT
2516                Empty commit
2517                COMMIT
2518                cat-blob :1
2519                EOF
2520
2521                read blob_id type size <&3 &&
2522                head_c $size >actual <&3 &&
2523                read newline <&3 &&
2524
2525                echo
2526        ) |
2527        git fast-import --cat-blob-fd=3 3>blobs &&
2528        test_cmp expect actual
2529'
2530
2531test_expect_success PIPE 'R: print staged blob within commit' '
2532        rm -f blobs &&
2533        echo "A blob from _within_ the commit." >expect &&
2534        mkfifo blobs &&
2535        (
2536                exec 3<blobs &&
2537                cat <<-EOF &&
2538                feature cat-blob
2539                commit refs/heads/within
2540                committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2541                data <<COMMIT
2542                Empty commit
2543                COMMIT
2544                M 644 inline within
2545                data <<BLOB
2546                A blob from _within_ the commit.
2547                BLOB
2548                EOF
2549
2550                to_get=$(
2551                        echo "A blob from _within_ the commit." |
2552                        git hash-object --stdin
2553                ) &&
2554                echo "cat-blob $to_get" &&
2555
2556                read blob_id type size <&3 &&
2557                head_c $size >actual <&3 &&
2558                read newline <&3 &&
2559
2560                echo deleteall
2561        ) |
2562        git fast-import --cat-blob-fd=3 3>blobs &&
2563        test_cmp expect actual
2564'
2565
2566test_expect_success 'R: quiet option results in no stats being output' '
2567        cat >input <<-EOF &&
2568        option git quiet
2569        blob
2570        data 3
2571        hi
2572
2573        EOF
2574
2575        cat input | git fast-import 2> output &&
2576        test_must_be_empty output
2577'
2578
2579test_expect_success 'R: feature done means terminating "done" is mandatory' '
2580        echo feature done | test_must_fail git fast-import &&
2581        test_must_fail git fast-import --done </dev/null
2582'
2583
2584test_expect_success 'R: terminating "done" with trailing gibberish is ok' '
2585        git fast-import <<-\EOF &&
2586        feature done
2587        done
2588        trailing gibberish
2589        EOF
2590        git fast-import <<-\EOF
2591        done
2592        more trailing gibberish
2593        EOF
2594'
2595
2596test_expect_success 'R: terminating "done" within commit' '
2597        cat >expect <<-\EOF &&
2598        OBJID
2599        :000000 100644 OBJID OBJID A    hello.c
2600        :000000 100644 OBJID OBJID A    hello2.c
2601        EOF
2602        git fast-import <<-EOF &&
2603        commit refs/heads/done-ends
2604        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2605        data <<EOT
2606        Commit terminated by "done" command
2607        EOT
2608        M 100644 inline hello.c
2609        data <<EOT
2610        Hello, world.
2611        EOT
2612        C hello.c hello2.c
2613        done
2614        EOF
2615        git rev-list done-ends |
2616        git diff-tree -r --stdin --root --always |
2617        sed -e "s/$_x40/OBJID/g" >actual &&
2618        test_cmp expect actual
2619'
2620
2621test_expect_success 'R: die on unknown option' '
2622        cat >input <<-EOF &&
2623        option git non-existing-option
2624        EOF
2625
2626        test_must_fail git fast-import <input
2627'
2628
2629test_expect_success 'R: unknown commandline options are rejected' '\
2630        test_must_fail git fast-import --non-existing-option < /dev/null
2631'
2632
2633test_expect_success 'R: die on invalid option argument' '
2634        echo "option git active-branches=-5" |
2635        test_must_fail git fast-import &&
2636        echo "option git depth=" |
2637        test_must_fail git fast-import &&
2638        test_must_fail git fast-import --depth="5 elephants" </dev/null
2639'
2640
2641test_expect_success 'R: ignore non-git options' '
2642        cat >input <<-EOF &&
2643        option non-existing-vcs non-existing-option
2644        EOF
2645
2646        git fast-import <input
2647'
2648
2649##
2650## R: very large blobs
2651##
2652test_expect_success 'R: blob bigger than threshold' '
2653        blobsize=$((2*1024*1024 + 53)) &&
2654        test-genrandom bar $blobsize >expect &&
2655        cat >input <<-INPUT_END &&
2656        commit refs/heads/big-file
2657        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2658        data <<COMMIT
2659        R - big file
2660        COMMIT
2661
2662        M 644 inline big1
2663        data $blobsize
2664        INPUT_END
2665        cat expect >>input &&
2666        cat >>input <<-INPUT_END &&
2667        M 644 inline big2
2668        data $blobsize
2669        INPUT_END
2670        cat expect >>input &&
2671        echo >>input &&
2672
2673        test_create_repo R &&
2674        git --git-dir=R/.git fast-import --big-file-threshold=1 <input
2675'
2676
2677test_expect_success 'R: verify created pack' '
2678        (
2679                cd R &&
2680                verify_packs -v > ../verify
2681        )
2682'
2683
2684test_expect_success 'R: verify written objects' '
2685        git --git-dir=R/.git cat-file blob big-file:big1 >actual &&
2686        test_cmp_bin expect actual &&
2687        a=$(git --git-dir=R/.git rev-parse big-file:big1) &&
2688        b=$(git --git-dir=R/.git rev-parse big-file:big2) &&
2689        test $a = $b
2690'
2691
2692test_expect_success 'R: blob appears only once' '
2693        n=$(grep $a verify | wc -l) &&
2694        test 1 = $n
2695'
2696
2697###
2698### series S
2699###
2700#
2701# Make sure missing spaces and EOLs after mark references
2702# cause errors.
2703#
2704# Setup:
2705#
2706#   1--2--4
2707#    \   /
2708#     -3-
2709#
2710#   commit marks:  301, 302, 303, 304
2711#   blob marks:              403, 404, resp.
2712#   note mark:          202
2713#
2714# The error message when a space is missing not at the
2715# end of the line is:
2716#
2717#   Missing space after ..
2718#
2719# or when extra characters come after the mark at the end
2720# of the line:
2721#
2722#   Garbage after ..
2723#
2724# or when the dataref is neither "inline " or a known SHA1,
2725#
2726#   Invalid dataref ..
2727#
2728test_expect_success 'S: initialize for S tests' '
2729        test_tick &&
2730
2731        cat >input <<-INPUT_END &&
2732        commit refs/heads/S
2733        mark :301
2734        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2735        data <<COMMIT
2736        commit 1
2737        COMMIT
2738        M 100644 inline hello.c
2739        data <<BLOB
2740        blob 1
2741        BLOB
2742
2743        commit refs/heads/S
2744        mark :302
2745        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2746        data <<COMMIT
2747        commit 2
2748        COMMIT
2749        from :301
2750        M 100644 inline hello.c
2751        data <<BLOB
2752        blob 2
2753        BLOB
2754
2755        blob
2756        mark :403
2757        data <<BLOB
2758        blob 3
2759        BLOB
2760
2761        blob
2762        mark :202
2763        data <<BLOB
2764        note 2
2765        BLOB
2766        INPUT_END
2767
2768        git fast-import --export-marks=marks <input
2769'
2770
2771#
2772# filemodify, three datarefs
2773#
2774test_expect_success 'S: filemodify with garbage after mark must fail' '
2775        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2776        commit refs/heads/S
2777        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2778        data <<COMMIT
2779        commit N
2780        COMMIT
2781        M 100644 :403x hello.c
2782        EOF
2783        cat err &&
2784        test_i18ngrep "space after mark" err
2785'
2786
2787# inline is misspelled; fast-import thinks it is some unknown dataref
2788test_expect_success 'S: filemodify with garbage after inline must fail' '
2789        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2790        commit refs/heads/S
2791        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2792        data <<COMMIT
2793        commit N
2794        COMMIT
2795        M 100644 inlineX hello.c
2796        data <<BLOB
2797        inline
2798        BLOB
2799        EOF
2800        cat err &&
2801        test_i18ngrep "nvalid dataref" err
2802'
2803
2804test_expect_success 'S: filemodify with garbage after sha1 must fail' '
2805        sha1=$(grep :403 marks | cut -d\  -f2) &&
2806        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2807        commit refs/heads/S
2808        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2809        data <<COMMIT
2810        commit N
2811        COMMIT
2812        M 100644 ${sha1}x hello.c
2813        EOF
2814        cat err &&
2815        test_i18ngrep "space after SHA1" err
2816'
2817
2818#
2819# notemodify, three ways to say dataref
2820#
2821test_expect_success 'S: notemodify with garabge after mark dataref must fail' '
2822        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2823        commit refs/heads/S
2824        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2825        data <<COMMIT
2826        commit S note dataref markref
2827        COMMIT
2828        N :202x :302
2829        EOF
2830        cat err &&
2831        test_i18ngrep "space after mark" err
2832'
2833
2834test_expect_success 'S: notemodify with garbage after inline dataref must fail' '
2835        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2836        commit refs/heads/S
2837        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2838        data <<COMMIT
2839        commit S note dataref inline
2840        COMMIT
2841        N inlineX :302
2842        data <<BLOB
2843        note blob
2844        BLOB
2845        EOF
2846        cat err &&
2847        test_i18ngrep "nvalid dataref" err
2848'
2849
2850test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' '
2851        sha1=$(grep :202 marks | cut -d\  -f2) &&
2852        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2853        commit refs/heads/S
2854        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2855        data <<COMMIT
2856        commit S note dataref sha1
2857        COMMIT
2858        N ${sha1}x :302
2859        EOF
2860        cat err &&
2861        test_i18ngrep "space after SHA1" err
2862'
2863
2864#
2865# notemodify, mark in commit-ish
2866#
2867test_expect_success 'S: notemodify with garbage after mark commit-ish must fail' '
2868        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2869        commit refs/heads/Snotes
2870        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2871        data <<COMMIT
2872        commit S note commit-ish
2873        COMMIT
2874        N :202 :302x
2875        EOF
2876        cat err &&
2877        test_i18ngrep "after mark" err
2878'
2879
2880#
2881# from
2882#
2883test_expect_success 'S: from with garbage after mark must fail' '
2884        test_must_fail \
2885        git fast-import --import-marks=marks --export-marks=marks <<-EOF 2>err &&
2886        commit refs/heads/S2
2887        mark :303
2888        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2889        data <<COMMIT
2890        commit 3
2891        COMMIT
2892        from :301x
2893        M 100644 :403 hello.c
2894        EOF
2895
2896
2897        # go create the commit, need it for merge test
2898        git fast-import --import-marks=marks --export-marks=marks <<-EOF &&
2899        commit refs/heads/S2
2900        mark :303
2901        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2902        data <<COMMIT
2903        commit 3
2904        COMMIT
2905        from :301
2906        M 100644 :403 hello.c
2907        EOF
2908
2909        # now evaluate the error
2910        cat err &&
2911        test_i18ngrep "after mark" err
2912'
2913
2914
2915#
2916# merge
2917#
2918test_expect_success 'S: merge with garbage after mark must fail' '
2919        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2920        commit refs/heads/S
2921        mark :304
2922        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2923        data <<COMMIT
2924        merge 4
2925        COMMIT
2926        from :302
2927        merge :303x
2928        M 100644 :403 hello.c
2929        EOF
2930        cat err &&
2931        test_i18ngrep "after mark" err
2932'
2933
2934#
2935# tag, from markref
2936#
2937test_expect_success 'S: tag with garbage after mark must fail' '
2938        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2939        tag refs/tags/Stag
2940        from :302x
2941        tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
2942        data <<TAG
2943        tag S
2944        TAG
2945        EOF
2946        cat err &&
2947        test_i18ngrep "after mark" err
2948'
2949
2950#
2951# cat-blob markref
2952#
2953test_expect_success 'S: cat-blob with garbage after mark must fail' '
2954        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2955        cat-blob :403x
2956        EOF
2957        cat err &&
2958        test_i18ngrep "after mark" err
2959'
2960
2961#
2962# ls markref
2963#
2964test_expect_success 'S: ls with garbage after mark must fail' '
2965        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2966        ls :302x hello.c
2967        EOF
2968        cat err &&
2969        test_i18ngrep "space after mark" err
2970'
2971
2972test_expect_success 'S: ls with garbage after sha1 must fail' '
2973        sha1=$(grep :302 marks | cut -d\  -f2) &&
2974        test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
2975        ls ${sha1}x hello.c
2976        EOF
2977        cat err &&
2978        test_i18ngrep "space after tree-ish" err
2979'
2980
2981###
2982### series T (ls)
2983###
2984# Setup is carried over from series S.
2985
2986test_expect_success 'T: ls root tree' '
2987        sed -e "s/Z\$//" >expect <<-EOF &&
2988        040000 tree $(git rev-parse S^{tree})   Z
2989        EOF
2990        sha1=$(git rev-parse --verify S) &&
2991        git fast-import --import-marks=marks <<-EOF >actual &&
2992        ls $sha1 ""
2993        EOF
2994        test_cmp expect actual
2995'
2996
2997test_expect_success 'T: delete branch' '
2998        git branch to-delete &&
2999        git fast-import <<-EOF &&
3000        reset refs/heads/to-delete
3001        from 0000000000000000000000000000000000000000
3002        EOF
3003        test_must_fail git rev-parse --verify refs/heads/to-delete
3004'
3005
3006test_expect_success 'T: empty reset doesnt delete branch' '
3007        git branch not-to-delete &&
3008        git fast-import <<-EOF &&
3009        reset refs/heads/not-to-delete
3010        EOF
3011        git show-ref &&
3012        git rev-parse --verify refs/heads/not-to-delete
3013'
3014
3015###
3016### series U (filedelete)
3017###
3018
3019test_expect_success 'U: initialize for U tests' '
3020        cat >input <<-INPUT_END &&
3021        commit refs/heads/U
3022        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
3023        data <<COMMIT
3024        test setup
3025        COMMIT
3026        M 100644 inline hello.c
3027        data <<BLOB
3028        blob 1
3029        BLOB
3030        M 100644 inline good/night.txt
3031        data <<BLOB
3032        sleep well
3033        BLOB
3034        M 100644 inline good/bye.txt
3035        data <<BLOB
3036        au revoir
3037        BLOB
3038
3039        INPUT_END
3040
3041        git fast-import <input
3042'
3043
3044test_expect_success 'U: filedelete file succeeds' '
3045        cat >input <<-INPUT_END &&
3046        commit refs/heads/U
3047        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
3048        data <<COMMIT
3049        delete good/night.txt
3050        COMMIT
3051        from refs/heads/U^0
3052        D good/night.txt
3053
3054        INPUT_END
3055
3056        git fast-import <input
3057'
3058
3059test_expect_success 'U: validate file delete result' '
3060        cat >expect <<-EOF &&
3061        :100644 000000 2907ebb4bf85d91bf0716bb3bd8a68ef48d6da76 0000000000000000000000000000000000000000 D      good/night.txt
3062        EOF
3063
3064        git diff-tree -M -r U^1 U >actual &&
3065
3066        compare_diff_raw expect actual
3067'
3068
3069test_expect_success 'U: filedelete directory succeeds' '
3070        cat >input <<-INPUT_END &&
3071        commit refs/heads/U
3072        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
3073        data <<COMMIT
3074        delete good dir
3075        COMMIT
3076        from refs/heads/U^0
3077        D good
3078
3079        INPUT_END
3080
3081        git fast-import <input
3082'
3083
3084test_expect_success 'U: validate directory delete result' '
3085        cat >expect <<-EOF &&
3086        :100644 000000 69cb75792f55123d8389c156b0b41c2ff00ed507 0000000000000000000000000000000000000000 D      good/bye.txt
3087        EOF
3088
3089        git diff-tree -M -r U^1 U >actual &&
3090
3091        compare_diff_raw expect actual
3092'
3093
3094test_expect_success 'U: filedelete root succeeds' '
3095        cat >input <<-INPUT_END &&
3096        commit refs/heads/U
3097        committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
3098        data <<COMMIT
3099        must succeed
3100        COMMIT
3101        from refs/heads/U^0
3102        D ""
3103
3104        INPUT_END
3105
3106        git fast-import <input
3107'
3108
3109test_expect_success 'U: validate root delete result' '
3110        cat >expect <<-EOF &&
3111        :100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D      hello.c
3112        EOF
3113
3114        git diff-tree -M -r U^1 U >actual &&
3115
3116        compare_diff_raw expect actual
3117'
3118
3119test_done