(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"test git fast-import utility">)}
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (Sentence
      child: (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/diff-lib.sh)})
      terminator: <Op_Semi ";">
    )
    (FuncDef
      name: verify_packs
      body: 
        (BraceGroup
          children: [
            (ForEach
              iter_name: p
              iter_words: [{(.git/objects/pack/) (Lit_Other "*") (.pack)}]
              do_arg_iter: False
              body: 
                (DoGroup
                  children: [
                    (AndOr
                      children: [
                        (C {(git)} {(verify-pack)} {(DQ ($ VSub_At "$@"))} {(DQ ($ VSub_Name "$p"))})
                        (ControlFlow token:<ControlFlow_Return return>)
                      ]
                      op_id: Op_DPipe
                    )
                  ]
                  spids: [53 73]
                )
              spids: [47 -1]
            )
          ]
          spids: [39]
        )
      spids: [34 38]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:file2_data)
          op: Equal
          rhs: {(SQ <"file2\n"> <"second line of EOF">)}
          spids: [78]
        )
      ]
      spids: [78]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:file3_data)
          op: Equal
          rhs: {(SQ <"EOF\n"> <"in 3rd file\n"> <" END">)}
          spids: [85]
        )
      ]
      spids: [85]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:file4_data) op:Equal rhs:{(abcd)} spids:[93])]
      spids: [93]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:file4_len) op:Equal rhs:{(4)} spids:[96])]
      spids: [96]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:file5_data)
          op: Equal
          rhs: {(SQ <"an inline file.\n"> <"  we should see it later.">)}
          spids: [100]
        )
      ]
      spids: [100]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:file6_data)
          op: Equal
          rhs: {(SQ <"#!/bin/sh\n"> <"echo \"$@\"">)}
          spids: [107]
        )
      ]
      spids: [107]
    )
    (C {(test_expect_success)} {(SQ <"empty stream succeeds">)} 
      {(SQ <"\n"> <"\tgit config fastimport.unpackLimit 0 &&\n"> <"\tgit fast-import </dev/null\n">)}
    )
    (C {(test_expect_success)} {(SQ <"truncated stream complains">)} 
      {(SQ <"\n"> <"\techo \"tag foo\" | test_must_fail git fast-import\n">)}
    )
    (C {(test_expect_success)} {(SQ <"A: create pack from stdin">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :2\n"> 
          <"\tdata <<EOF\n"> <"\t$file2_data\n"> <"\tEOF\n"> <"\n"> <"\tblob\n"> <"\tmark :3\n"> <"\tdata <<END\n"> <"\t$file3_data\n"> 
          <"\tEND\n"> <"\n"> <"\tblob\n"> <"\tmark :4\n"> <"\tdata $file4_len\n"> <"\t$file4_data\n"> 
          <"\tcommit refs/heads/master\n"> <"\tmark :5\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tinitial\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 :2 file2\n"> <"\tM 644 :3 file3\n"> <"\tM 755 :4 file4\n"> 
          <"\n"> <"\ttag series-A\n"> <"\tfrom :5\n"> <"\tdata <<EOF\n"> <"\tAn annotated tag without a tagger\n"> 
          <"\tEOF\n"> <"\n"> <"\ttag series-A-blob\n"> <"\tfrom :3\n"> <"\tdata <<EOF\n"> 
          <"\tAn annotated tag that annotates a blob.\n"> <"\tEOF\n"> <"\n"> <"\tINPUT_END\n"> <"\tgit fast-import --export-marks=marks.out <input &&\n"> 
          <"\tgit whatchanged master\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"A: verify commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> <"\tinitial\n"> 
          <"\tEOF\n"> <"\tgit cat-file commit master | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\t100644 blob file2\n"> <"\t100644 blob file3\n"> 
          <"\t100755 blob file4\n"> <"\tEOF\n"> <"\tgit cat-file -p master^{tree} | sed \"s/ [0-9a-f]*\t/ /\" >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify file2">)} 
      {
        (SQ <"\n"> <"\techo \"$file2_data\" >expect &&\n"> 
          <"\tgit cat-file blob master:file2 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify file3">)} 
      {
        (SQ <"\n"> <"\techo \"$file3_data\" >expect &&\n"> 
          <"\tgit cat-file blob master:file3 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify file4">)} 
      {
        (SQ <"\n"> <"\tprintf \"$file4_data\" >expect &&\n"> 
          <"\tgit cat-file blob master:file4 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify tag/series-A">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\tobject $(git rev-parse refs/heads/master)\n"> 
          <"\ttype commit\n"> <"\ttag series-A\n"> <"\n"> <"\tAn annotated tag without a tagger\n"> <"\tEOF\n"> 
          <"\tgit cat-file tag tags/series-A >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify tag/series-A-blob">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tobject $(git rev-parse refs/heads/master:file3)\n"> <"\ttype blob\n"> <"\ttag series-A-blob\n"> <"\n"> <"\tAn annotated tag that annotates a blob.\n"> 
          <"\tEOF\n"> <"\tgit cat-file tag tags/series-A-blob >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify marks output">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\t:2 $(git rev-parse --verify master:file2)\n"> 
          <"\t:3 $(git rev-parse --verify master:file3)\n"> <"\t:4 $(git rev-parse --verify master:file4)\n"> <"\t:5 $(git rev-parse --verify master^0)\n"> 
          <"\tEOF\n"> <"\ttest_cmp expect marks.out\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify marks import">)} 
      {
        (SQ <"\n"> <"\tgit fast-import \\\n"> <"\t\t--import-marks=marks.out \\\n"> 
          <"\t\t--export-marks=marks.new \\\n"> <"\t\t</dev/null &&\n"> <"\ttest_cmp expect marks.new\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: tag blob by sha1">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tnew_blob=$(echo testing | git hash-object --stdin) &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\ttag series-A-blob-2\n"> <"\tfrom $(git rev-parse refs/heads/master:file3)\n"> <"\tdata <<EOF\n"> 
          <"\tTag blob by sha1.\n"> <"\tEOF\n"> <"\n"> <"\tblob\n"> <"\tmark :6\n"> <"\tdata <<EOF\n"> <"\ttesting\n"> <"\tEOF\n"> <"\n"> 
          <"\tcommit refs/heads/new_blob\n"> <"\tcommitter  <> 0 +0000\n"> <"\tdata 0\n"> <"\tM 644 :6 new_blob\n"> 
          <"\t#pretend we got sha1 from fast-import\n"> <"\tls \"new_blob\"\n"> <"\n"> <"\ttag series-A-blob-3\n"> <"\tfrom $new_blob\n"> <"\tdata <<EOF\n"> 
          <"\tTag new_blob.\n"> <"\tEOF\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tobject $(git rev-parse refs/heads/master:file3)\n"> <"\ttype blob\n"> <"\ttag series-A-blob-2\n"> <"\n"> <"\tTag blob by sha1.\n"> <"\tobject $new_blob\n"> 
          <"\ttype blob\n"> <"\ttag series-A-blob-3\n"> <"\n"> <"\tTag new_blob.\n"> <"\tEOF\n"> <"\n"> 
          <"\tgit fast-import <input &&\n"> <"\tgit cat-file tag tags/series-A-blob-2 >actual &&\n"> 
          <"\tgit cat-file tag tags/series-A-blob-3 >>actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify marks import does not crash">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/verify--import-marks\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\trecreate from :5\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom :5\n"> <"\tM 755 :2 copy-of-file2\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\tgit fast-import --import-marks=marks.out <input &&\n"> <"\tgit whatchanged verify--import-marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"A: verify diff">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A\tcopy-of-file2\n"
          > <"\tEOF\n"> <"\tgit diff-tree -M -r master verify--import-marks >actual &&\n"> 
          <"\tcompare_diff_raw expect actual &&\n"> <"\ttest $(git rev-parse --verify master:file2) \\\n"> 
          <"\t    = $(git rev-parse --verify verify--import-marks:copy-of-file2)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"A: export marks with large values">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tmt=$(git hash-object --stdin < /dev/null) &&\n"> 
          <"\t>input.blob &&\n"> <"\t>marks.exp &&\n"> <"\t>tree.exp &&\n"> <"\n"> <"\tcat >input.commit <<-EOF &&\n"> 
          <"\tcommit refs/heads/verify--dump-marks\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\ttest the sparse array dumping routines with exponentially growing marks\n"> <"\tCOMMIT\n"> <"\tEOF\n"> <"\n"> <"\ti=0 l=4 m=6 n=7 &&\n"> <"\twhile test \"$i\" -lt 27\n"> <"\tdo\n"> 
          <"\t\tcat >>input.blob <<-EOF &&\n"> <"\t\tblob\n"> <"\t\tmark :$l\n"> <"\t\tdata 0\n"> <"\t\tblob\n"> <"\t\tmark :$m\n"> <"\t\tdata 0\n"> 
          <"\t\tblob\n"> <"\t\tmark :$n\n"> <"\t\tdata 0\n"> <"\t\tEOF\n"> <"\t\techo \"M 100644 :$l l$i\" >>input.commit &&\n"> 
          <"\t\techo \"M 100644 :$m m$i\" >>input.commit &&\n"> <"\t\techo \"M 100644 :$n n$i\" >>input.commit &&\n"> <"\n"> <"\t\techo \":$l $mt\" >>marks.exp &&\n"> 
          <"\t\techo \":$m $mt\" >>marks.exp &&\n"> <"\t\techo \":$n $mt\" >>marks.exp &&\n"> <"\n"> 
          <"\t\tprintf \"100644 blob $mt\\tl$i\\n\" >>tree.exp &&\n"> <"\t\tprintf \"100644 blob $mt\\tm$i\\n\" >>tree.exp &&\n"> 
          <"\t\tprintf \"100644 blob $mt\\tn$i\\n\" >>tree.exp &&\n"> <"\n"> <"\t\tl=$(($l + $l)) &&\n"> <"\t\tm=$(($m + $m)) &&\n"> <"\t\tn=$(($l + $n)) &&\n"> <"\n"> 
          <"\t\ti=$((1 + $i)) || return 1\n"> <"\tdone &&\n"> <"\n"> <"\tsort tree.exp > tree.exp_s &&\n"> <"\n"> 
          <"\tcat input.blob input.commit | git fast-import --export-marks=marks.large &&\n"> <"\tgit ls-tree refs/heads/verify--dump-marks >tree.out &&\n"> <"\ttest_cmp tree.exp_s tree.out &&\n"> 
          <"\ttest_cmp marks.exp marks.large\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid blob sha1">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/branch\n"> <"\tmark :1\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tcorrupt\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/master\n"> 
          <"\tM 755 0000000000000000000000000000000000000001 zero1\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"rm -f .git/objects/pack_* .git/objects/index_*\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: accept branch name \"TEMP_TAG\"">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit TEMP_TAG\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\ttag base\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/master\n"> <"\n"> 
          <"\tINPUT_END\n"> <"\n"> <"\ttest_when_finished \"rm -f .git/TEMP_TAG\n"> <"\t\tgit gc\n"> <"\t\tgit prune\" &&\n"> 
          <"\tgit fast-import <input &&\n"> <"\ttest -f .git/TEMP_TAG &&\n"> <"\ttest $(git rev-parse master) = $(git rev-parse TEMP_TAG^)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: accept empty committer">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/empty-committer-1\n"> 
          <"\tcommitter  <> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/empty-committer-1\n"> <"\t\tgit gc\n"> <"\t\tgit prune\" &&\n"> <"\tgit fast-import <input &&\n"> <"\tout=$(git fsck) &&\n"> 
          <"\techo \"$out\" &&\n"> <"\ttest -z \"$out\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: accept and fixup committer with no name">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/empty-committer-2\n"> 
          <"\tcommitter <a@b.com> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/empty-committer-2\n"> <"\t\tgit gc\n"> <"\t\tgit prune\" &&\n"> <"\tgit fast-import <input &&\n"> <"\tout=$(git fsck) &&\n"> 
          <"\techo \"$out\" &&\n"> <"\ttest -z \"$out\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid committer (1)">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/invalid-committer\n"> 
          <"\tcommitter Name email> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/invalid-committer\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid committer (2)">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/invalid-committer\n"> 
          <"\tcommitter Name <e<mail> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/invalid-committer\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid committer (3)">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/invalid-committer\n"> 
          <"\tcommitter Name <email>> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/invalid-committer\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid committer (4)">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/invalid-committer\n"> 
          <"\tcommitter Name <email $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/invalid-committer\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"B: fail on invalid committer (5)">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/invalid-committer\n"> 
          <"\tcommitter Name<email> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tempty commit\n"> <"\tCOMMIT\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/invalid-committer\" &&\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"C: incremental import create pack from stdin">)} 
      {
        (SQ <"\n"> <"\tnewf=$(echo hi newf | git hash-object -w --stdin) &&\n"> 
          <"\toldf=$(git rev-parse --verify master:file2) &&\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/branch\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tsecond\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/master\n"> 
          <"\tM 644 $oldf file2/oldf\n"> <"\tM 755 $newf file2/newf\n"> <"\tD file3\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\tgit fast-import <input &&\n"> <"\tgit whatchanged branch\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"C: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"C: validate reuse existing blob">)} 
      {
        (SQ <"\n"> <"\ttest $newf = $(git rev-parse --verify branch:file2/newf) &&\n"> 
          <"\ttest $oldf = $(git rev-parse --verify branch:file2/oldf)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"C: verify commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\tparent $(git rev-parse --verify master^0)\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> <"\tsecond\n"> 
          <"\tEOF\n"> <"\n"> <"\tgit cat-file commit branch | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"C: validate rename result">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A\tfile2/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100\tfile2\tfile2/oldf\n"
          > 
          <
"\t:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D\tfile3\n"
          > <"\tEOF\n"> <"\tgit diff-tree -M -r master branch >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"D: inline data in commit">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/branch\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tthird\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> <"\tM 644 inline newdir/interesting\n"> 
          <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\n"> <"\tM 755 inline newdir/exec.sh\n"> <"\tdata <<EOF\n"> 
          <"\t$file6_data\n"> <"\tEOF\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit whatchanged branch\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"D: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"D: validate new files added">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:000000 100755 0000000000000000000000000000000000000000 e74b7d465e52746be2b4bae983670711e6e66657 A\tnewdir/exec.sh\n"
          > 
          <
"\t:000000 100644 0000000000000000000000000000000000000000 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 A\tnewdir/interesting\n"
          > <"\tEOF\n"> <"\tgit diff-tree -M -r branch^ branch >actual &&\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"D: verify file5">)} 
      {
        (SQ <"\n"> <"\techo \"$file5_data\" >expect &&\n"> 
          <"\tgit cat-file blob branch:newdir/interesting >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"D: verify file6">)} 
      {
        (SQ <"\n"> <"\techo \"$file6_data\" >expect &&\n"> 
          <"\tgit cat-file blob branch:newdir/exec.sh >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"E: rfc2822 date, --date-format=raw">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/branch\n"> 
          <"\tauthor $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500\n"> 
          <"\tdata <<COMMIT\n"> <"\tRFC 2822 type date\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> <"\n"> <"\tINPUT_END\n"> 
          <"\n"> <"\ttest_must_fail git fast-import --date-format=raw <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"E: rfc2822 date, --date-format=rfc2822">)} 
      {(SQ <"\n"> <"\tgit fast-import --date-format=rfc2822 <input\n">)}
    )
    (C {(test_expect_success)} {(SQ <"E: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"E: verify commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tauthor $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500\n"> <"\n"> 
          <"\tRFC 2822 type date\n"> <"\tEOF\n"> <"\tgit cat-file commit branch | sed 1,2d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"F: non-fast-forward update skips">)} 
      {
        (SQ <"\n"> <"\told_branch=$(git rev-parse --verify branch^0) &&\n"> <"\ttest_tick &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/branch\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tlosing things already?\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch~1\n"> <"\n"> <"\treset refs/heads/other\n"> <"\tfrom refs/heads/branch\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_must_fail git fast-import <input &&\n"> <"\t# branch must remain unaffected\n"> <"\ttest $old_branch = $(git rev-parse --verify branch^0)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"F: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"F: verify other commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\ttree $(git rev-parse branch~1^{tree})\n"> 
          <"\tparent $(git rev-parse branch~1)\n"> <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> <"\tlosing things already?\n"> <"\tEOF\n"> <"\tgit cat-file commit other >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"G: non-fast-forward update forced">)} 
      {
        (SQ <"\n"> <"\told_branch=$(git rev-parse --verify branch^0) &&\n"> <"\ttest_tick &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/branch\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tlosing things already?\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch~1\n"> <"\n"> <"\tINPUT_END\n"> <"\tgit fast-import --force <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"G: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"G: branch changed, but logged">)} 
      {
        (SQ <"\n"> <"\ttest $old_branch != $(git rev-parse --verify branch^0) &&\n"> 
          <"\ttest $old_branch = $(git rev-parse --verify branch@{1})\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"H: deletall, add 1">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/H\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tthird\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tM 644 inline i-will-die\n"> <"\tdata <<EOF\n"> <"\tthis file will never exist.\n"> <"\tEOF\n"> <"\n"> <"\tdeleteall\n"> 
          <"\tM 644 inline h/e/l/lo\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\n"> <"\tINPUT_END\n"> 
          <"\tgit fast-import <input &&\n"> <"\tgit whatchanged H\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"H: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"H: validate old files removed, new files added">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D\tfile2/newf\n"
          > 
          <
"\t:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D\tfile2/oldf\n"
          > 
          <
"\t:100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D\tfile4\n"
          > 
          <
"\t:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100\tnewdir/interesting\th/e/l/lo\n"
          > 
          <
"\t:100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D\tnewdir/exec.sh\n"
          > <"\tEOF\n"> <"\tgit diff-tree -M -r H^ H >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"H: verify file">)} 
      {
        (SQ <"\n"> <"\techo \"$file5_data\" >expect &&\n"> 
          <"\tgit cat-file blob H:h/e/l/lo >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"I: export-pack-edges">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/export-boundary\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\twe have a border.  its only 40 characters wide.\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch\n"> <"\n"> <"\tINPUT_END\n"> <"\tgit fast-import --export-pack-edges=edges.list <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"I: verify edge list">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\t.git/objects/pack/pack-.pack: $(git rev-parse --verify export-boundary)\n"> <"\tEOF\n"> <"\tsed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"J: reset existing branch creates empty commit">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/J\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcreate J\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch\n"> <"\n"> 
          <"\treset refs/heads/J\n"> <"\n"> <"\tcommit refs/heads/J\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tinitialize J\n"> <"\tCOMMIT\n"> <"\n"> <"\tINPUT_END\n"> 
          <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"J: branch has 1 commit, empty tree">)} 
      {
        (SQ <"\n"> <"\ttest 1 = $(git rev-list J | wc -l) &&\n"> 
          <"\ttest 0 = $(git ls-tree J | wc -l)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"J: tag must fail on empty branch">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\treset refs/heads/J2\n"> <"\n"> 
          <"\ttag wrong_tag\n"> <"\tfrom refs/heads/J2\n"> <"\tdata <<EOF\n"> <"\tTag branch that was reset.\n"> <"\tEOF\n"> 
          <"\tINPUT_END\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"K: reinit branch with from">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/K\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcreate K\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch\n"> <"\n"> 
          <"\tcommit refs/heads/K\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tredo K\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^1\n"> <"\n"> <"\tINPUT_END\n"> 
          <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"K: verify K^1 = branch^1">)} 
      {
        (SQ <"\n"> <"\ttest $(git rev-parse --verify branch^1) \\\n"> 
          <"\t\t= $(git rev-parse --verify K^1)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"L: verify internal tree sorting">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata <<EOF\n"> 
          <"\tsome data\n"> <"\tEOF\n"> <"\n"> <"\tblob\n"> <"\tmark :2\n"> <"\tdata <<EOF\n"> <"\tother data\n"> <"\tEOF\n"> <"\n"> 
          <"\tcommit refs/heads/L\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcreate L\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 :1 b.\n"> <"\tM 644 :1 b/other\n"> <"\tM 644 :1 ba\n"> <"\n"> 
          <"\tcommit refs/heads/L\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tupdate L\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 :2 b.\n"> <"\tM 644 :2 b/other\n"> <"\tM 644 :2 ba\n"> <"\tINPUT_END\n"> 
          <"\n"> <"\tcat >expect <<-EXPECT_END &&\n"> <"\t:100644 100644 4268632... 55d3a52... M\tb.\n"> 
          <"\t:040000 040000 0ae5cac... 443c768... M\tb\n"> <"\t:100644 100644 4268632... 55d3a52... M\tba\n"> <"\tEXPECT_END\n"> <"\n"> 
          <"\tgit fast-import <input &&\n"> <"\tgit diff-tree --abbrev --raw L^ L >output &&\n"> <"\ttest_cmp expect output\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"L: nested tree copy does not corrupt deltas">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata <<EOF\n"> 
          <"\tthe data\n"> <"\tEOF\n"> <"\n"> <"\tcommit refs/heads/L2\n"> 
          <"\tcommitter C O Mitter <committer@example.com> 1112912473 -0700\n"> <"\tdata <<COMMIT\n"> <"\tinit L2\n"> <"\tCOMMIT\n"> <"\tM 644 :1 a/b/c\n"> <"\tM 644 :1 a/b/d\n"> 
          <"\tM 644 :1 a/e/f\n"> <"\n"> <"\tcommit refs/heads/L2\n"> 
          <"\tcommitter C O Mitter <committer@example.com> 1112912473 -0700\n"> <"\tdata <<COMMIT\n"> <"\tupdate L2\n"> <"\tCOMMIT\n"> <"\tC a g\n"> <"\tC a/e g/b\n"> 
          <"\tM 644 :1 g/b/h\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-\\EOF &&\n"> <"\tg/b/f\n"> <"\tg/b/h\n"> <"\tEOF\n"> <"\n"> 
          <"\ttest_when_finished \"git update-ref -d refs/heads/L2\" &&\n"> <"\tgit fast-import <input &&\n"> <"\tgit ls-tree L2 g/b/ >tmp &&\n"> 
          <"\tcat tmp | cut -f 2 >actual &&\n"> <"\ttest_cmp expect actual &&\n"> <"\tgit fsck $(git rev-parse L2)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"M: rename file in same subdirectory">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/M1\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tfile rename\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tR file2/newf file2/n.e.w.f\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100\tfile2/newf\tfile2/n.e.w.f\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> <"\tgit diff-tree -M -r M1^ M1 >actual &&\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"M: rename file to new subdirectory">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/M2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tfile rename\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tR file2/newf i/am/new/to/you\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100\tfile2/newf\ti/am/new/to/you\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> <"\tgit diff-tree -M -r M2^ M2 >actual &&\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"M: rename subdirectory to new subdirectory">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/M3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tfile rename\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/M2^0\n"> 
          <"\tR i other/sub\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100\ti/am/new/to/you\tother/sub/am/new/to/you\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> <"\tgit diff-tree -M -r M3^ M3 >actual &&\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"M: rename root to subdirectory">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/M4\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\trename root\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/M2^0\n"> 
          <"\tR \"\" sub\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100\tfile2/oldf\tsub/file2/oldf\n"
          > 
          <
"\t:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 R100\tfile4\tsub/file4\n"
          > 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100\ti/am/new/to/you\tsub/i/am/new/to/you\n"
          > 
          <
"\t:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 R100\tnewdir/exec.sh\tsub/newdir/exec.sh\n"
          > 
          <
"\t:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100\tnewdir/interesting\tsub/newdir/interesting\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> <"\tgit diff-tree -M -r M4^ M4 >actual &&\n"> 
          <"\tcat actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy file in same subdirectory">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N1\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tfile copy\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tC file2/newf file2/n.e.w.f\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\tfile2/n.e.w.f\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N1^ N1 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy then modify subdirectory">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tclean directory copy\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tC file2 file3\n"> <"\n"> <"\tcommit refs/heads/N2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tmodify directory copy\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tM 644 inline file3/file5\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100\tnewdir/interesting\tfile3/file5\n"
          > 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\tfile3/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100\tfile2/oldf\tfile3/oldf\n"
          > <"\tEOF\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N2^^ N2 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy dirty subdirectory">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tdirty directory copy\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tM 644 inline file2/file5\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\n"> <"\tC file2 file3\n"> <"\tD file2/file5\n"> 
          <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\ttest $(git rev-parse N2^{tree}) = $(git rev-parse N3^{tree})\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy directory by id">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\tfile3/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100\tfile2/oldf\tfile3/oldf\n"
          > <"\tEOF\n"> <"\tsubdir=$(git rev-parse refs/heads/branch^0:file2) &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N4\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy by tree hash\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tM 040000 $subdir file3\n"> <"\tINPUT_END\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N4^ N4 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(PIPE)} {(SQ <"N: read and copy directory">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\tfile3/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100\tfile2/oldf\tfile3/oldf\n"
          > <"\tEOF\n"> <"\tgit update-ref -d refs/heads/N4 &&\n"> <"\trm -f backflow &&\n"> 
          <"\tmkfifo backflow &&\n"> <"\t(\n"> <"\t\texec <backflow &&\n"> <"\t\tcat <<-EOF &&\n"> <"\t\tcommit refs/heads/N4\n"> 
          <"\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\t\tdata <<COMMIT\n"> <"\t\tcopy by tree hash, part 2\n"> <"\t\tCOMMIT\n"> <"\n"> 
          <"\t\tfrom refs/heads/branch^0\n"> <"\t\tls \"file2\"\n"> <"\t\tEOF\n"> <"\t\tread mode type tree filename &&\n"> 
          <"\t\techo \"M 040000 $tree file3\"\n"> <"\t) |\n"> <"\tgit fast-import --cat-blob-fd=3 3>backflow &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N4^ N4 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(PIPE)} {(SQ <"N: empty directory reads as missing">)} 
      {
        (SQ <"\n"> <"\tcat <<-\\EOF >expect &&\n"> <"\tOBJNAME\n"> 
          <"\t:000000 100644 OBJNAME OBJNAME A\tunrelated\n"> <"\tEOF\n"> <"\techo \"missing src\" >expect.response &&\n"> 
          <"\tgit update-ref -d refs/heads/read-empty &&\n"> <"\trm -f backflow &&\n"> <"\tmkfifo backflow &&\n"> <"\t(\n"> <"\t\texec <backflow &&\n"> 
          <"\t\tcat <<-EOF &&\n"> <"\t\tcommit refs/heads/read-empty\n"> 
          <"\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\t\tdata <<COMMIT\n"> <"\t\tread \"empty\" (missing) directory\n"> <"\t\tCOMMIT\n"> <"\n"> 
          <"\t\tM 100644 inline src/greeting\n"> <"\t\tdata <<BLOB\n"> <"\t\thello\n"> <"\t\tBLOB\n"> <"\t\tC src/greeting dst1/non-greeting\n"> 
          <"\t\tC src/greeting unrelated\n"> <"\t\t# leave behind \"empty\" src directory\n"> <"\t\tD src/greeting\n"> <"\t\tls \"src\"\n"> 
          <"\t\tEOF\n"> <"\t\tread -r line &&\n"> <"\t\tprintf \"%s\\n\" \"$line\" >response &&\n"> <"\t\tcat <<-\\EOF\n"> 
          <"\t\tD dst1\n"> <"\t\tD dst2\n"> <"\t\tEOF\n"> <"\t) |\n"> <"\tgit fast-import --cat-blob-fd=3 3>backflow &&\n"> 
          <"\ttest_cmp expect.response response &&\n"> <"\tgit rev-list read-empty |\n"> <"\tgit diff-tree -r --root --stdin |\n"> 
          <"\tsed \"s/$_x40/OBJNAME/g\" >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy root directory by tree hash">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <
"\t:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D\tfile3/newf\n"
          > 
          <
"\t:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D\tfile3/oldf\n"
          > <"\tEOF\n"> <"\troot=$(git rev-parse refs/heads/branch^0^{tree}) &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N6\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy root directory by tree hash\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tM 040000 $root \"\"\n"> <"\tINPUT_END\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N4 N6 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy root by path">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\toldroot/file2/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100\tfile2/oldf\toldroot/file2/oldf\n"
          > 
          <
"\t:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 C100\tfile4\toldroot/file4\n"
          > 
          <
"\t:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 C100\tnewdir/exec.sh\toldroot/newdir/exec.sh\n"
          > 
          <
"\t:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100\tnewdir/interesting\toldroot/newdir/interesting\n"
          > <"\tEOF\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N-copy-root-path\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy root directory by (empty) path\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tC \"\" oldroot\n"> <"\tINPUT_END\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: delete directory by copying">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> <"\tOBJID\n"> 
          <"\t:100644 000000 OBJID OBJID D\tfoo/bar/qux\n"> <"\tOBJID\n"> <"\t:000000 100644 OBJID OBJID A\tfoo/bar/baz\n"> 
          <"\t:000000 100644 OBJID OBJID A\tfoo/bar/qux\n"> <"\tEOF\n"> <"\tempty_tree=$(git mktree </dev/null) &&\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/N-delete\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcollect data to be deleted\n"> <"\tCOMMIT\n"> <"\n"> <"\tdeleteall\n"> <"\tM 100644 inline foo/bar/baz\n"> <"\tdata <<DATA_END\n"> 
          <"\thello\n"> <"\tDATA_END\n"> <"\tC \"foo/bar/baz\" \"foo/bar/qux\"\n"> <"\tC \"foo/bar/baz\" \"foo/bar/quux/1\"\n"> 
          <"\tC \"foo/bar/baz\" \"foo/bar/quuux\"\n"> <"\tM 040000 $empty_tree foo/bar/quux\n"> <"\tM 040000 $empty_tree foo/bar/quuux\n"> <"\n"> 
          <"\tcommit refs/heads/N-delete\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tdelete subdirectory\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 040000 $empty_tree foo/bar/qux\n"> <"\tINPUT_END\n"> 
          <"\tgit fast-import <input &&\n"> <"\tgit rev-list N-delete |\n"> <"\t\tgit diff-tree -r --stdin --root --always |\n"> 
          <"\t\tsed -e \"s/$_x40/OBJID/g\" >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: modify copied tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> 
          <
"\t:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100\tnewdir/interesting\tfile3/file5\n"
          > 
          <
"\t:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100\tfile2/newf\tfile3/newf\n"
          > 
          <
"\t:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100\tfile2/oldf\tfile3/oldf\n"
          > <"\tEOF\n"> <"\tsubdir=$(git rev-parse refs/heads/branch^0:file2) &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N5\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy by tree hash\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tM 040000 $subdir file3\n"> <"\n"> <"\tcommit refs/heads/N5\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tmodify directory copy\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tM 644 inline file3/file5\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\tINPUT_END\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff-tree -C --find-copies-harder -r N5^^ N5 >actual &&\n"> <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: reject foo/ syntax">)} 
      {
        (SQ <"\n"> <"\tsubdir=$(git rev-parse refs/heads/branch^0:file2) &&\n"> 
          <"\ttest_must_fail git fast-import <<-INPUT_END\n"> <"\tcommit refs/heads/N5B\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy with invalid syntax\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tM 040000 $subdir file3/\n"> <"\tINPUT_END\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: reject foo/ syntax in copy source">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import <<-INPUT_END\n"> <"\tcommit refs/heads/N5C\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy with invalid syntax\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tC file2/ file3\n"> <"\tINPUT_END\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: reject foo/ syntax in rename source">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import <<-INPUT_END\n"> <"\tcommit refs/heads/N5D\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\trename with invalid syntax\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tR file2/ file3\n"> <"\tINPUT_END\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: reject foo/ syntax in ls argument">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import <<-INPUT_END\n"> <"\tcommit refs/heads/N5E\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy with invalid syntax\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\tls \"file2/\"\n"> <"\tINPUT_END\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: copy to root by id and modify">)} 
      {
        (SQ <"\n"> <"\techo \"hello, world\" >expect.foo &&\n"> <"\techo hello >expect.bar &&\n"> 
          <"\tgit fast-import <<-SETUP_END &&\n"> <"\tcommit refs/heads/N7\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\thello, tree\n"> <"\tCOMMIT\n"> <"\n"> <"\tdeleteall\n"> 
          <"\tM 644 inline foo/bar\n"> <"\tdata <<EOF\n"> <"\thello\n"> <"\tEOF\n"> <"\tSETUP_END\n"> <"\n"> 
          <"\ttree=$(git rev-parse --verify N7:) &&\n"> <"\tgit fast-import <<-INPUT_END &&\n"> <"\tcommit refs/heads/N8\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy to root by id and modify\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tM 040000 $tree \"\"\n"> <"\tM 644 inline foo/foo\n"> <"\tdata <<EOF\n"> <"\thello, world\n"> <"\tEOF\n"> <"\tINPUT_END\n"> 
          <"\tgit show N8:foo/foo >actual.foo &&\n"> <"\tgit show N8:foo/bar >actual.bar &&\n"> <"\ttest_cmp expect.foo actual.foo &&\n"> 
          <"\ttest_cmp expect.bar actual.bar\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: extract subtree">)} 
      {
        (SQ <"\n"> <"\tbranch=$(git rev-parse --verify refs/heads/branch^{tree}) &&\n"> 
          <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/N9\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\textract subtree branch:newdir\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tM 040000 $branch \"\"\n"> <"\tC \"newdir\" \"\"\n"> <"\tINPUT_END\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit diff --exit-code branch:newdir N9\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"N: modify subtree, extract it, and modify again">)} 
      {
        (SQ <"\n"> <"\techo hello >expect.baz &&\n"> <"\techo hello, world >expect.qux &&\n"> 
          <"\tgit fast-import <<-SETUP_END &&\n"> <"\tcommit refs/heads/N10\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\thello, tree\n"> <"\tCOMMIT\n"> <"\n"> <"\tdeleteall\n"> 
          <"\tM 644 inline foo/bar/baz\n"> <"\tdata <<EOF\n"> <"\thello\n"> <"\tEOF\n"> <"\tSETUP_END\n"> <"\n"> 
          <"\ttree=$(git rev-parse --verify N10:) &&\n"> <"\tgit fast-import <<-INPUT_END &&\n"> <"\tcommit refs/heads/N11\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcopy to root by id and modify\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\tM 040000 $tree \"\"\n"> <"\tM 100644 inline foo/bar/qux\n"> <"\tdata <<EOF\n"> <"\thello, world\n"> <"\tEOF\n"> 
          <"\tR \"foo\" \"\"\n"> <"\tC \"bar/qux\" \"bar/quux\"\n"> <"\tINPUT_END\n"> <"\tgit show N11:bar/baz >actual.baz &&\n"> 
          <"\tgit show N11:bar/qux >actual.qux &&\n"> <"\tgit show N11:bar/quux >actual.quux &&\n"> <"\ttest_cmp expect.baz actual.baz &&\n"> 
          <"\ttest_cmp expect.qux actual.qux &&\n"> <"\ttest_cmp expect.qux actual.quux">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"O: comments are all skipped">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\t#we will\n"> <"\tcommit refs/heads/O1\n"> 
          <"\t# -- ignore all of this text\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\t# $GIT_COMMITTER_NAME has inserted here for his benefit.\n"> <"\tdata <<COMMIT\n"> <"\tdirty directory copy\n"> <"\tCOMMIT\n"> <"\n"> 
          <"\t# do not forget the import blank line!\n"> <"\t#\n"> <"\t# yes, we started from our usual base of branch^0.\n"> <"\t# i like branch^0.\n"> 
          <"\tfrom refs/heads/branch^0\n"> <"\t# and we need to reuse file2/file5 from N3 above.\n"> <"\tM 644 inline file2/file5\n"> 
          <"\t# otherwise the tree will be different\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\n"> <"\t# do not forget to copy file2 to file3\n"> 
          <"\tC file2 file3\n"> <"\t#\n"> <"\t# or to delete file5 from file2.\n"> <"\tD file2/file5\n"> <"\t# are we done yet?\n"> 
          <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\ttest $(git rev-parse N3) = $(git rev-parse O1)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"O: blank lines not necessary after data commands">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/O2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tdirty directory copy\n"> <"\tCOMMIT\n"> <"\tfrom refs/heads/branch^0\n"> 
          <"\tM 644 inline file2/file5\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> <"\tEOF\n"> <"\tC file2 file3\n"> <"\tD file2/file5\n"> <"\n"> 
          <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> <"\ttest $(git rev-parse N3) = $(git rev-parse O2)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"O: repack before next test">)} 
      {(SQ <"\n"> <"\tgit repack -a -d\n">)}
    )
    (C {(test_expect_success)} {(SQ <"O: blank lines not necessary after other commands">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/O3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzstring\n"> <"\tCOMMIT\n"> <"\tcommit refs/heads/O3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzof\n"> <"\tCOMMIT\n"> <"\tcheckpoint\n"> <"\tcommit refs/heads/O3\n"> 
          <"\tmark :5\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tzempty\n"> <"\tCOMMIT\n"> <"\tcheckpoint\n"> <"\tcommit refs/heads/O3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzcommits\n"> <"\tCOMMIT\n"> <"\treset refs/tags/O3-2nd\n"> <"\tfrom :5\n"> 
          <"\treset refs/tags/O3-3rd\n"> <"\tfrom :5\n"> <"\tINPUT_END\n"> <"\n"> <"\tcat >expect <<-INPUT_END &&\n"> <"\tstring\n"> <"\tof\n"> 
          <"\tempty\n"> <"\tcommits\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\ttest 8 = $(find .git/objects/pack -type f | wc -l) &&\n"> <"\ttest $(git rev-parse refs/tags/O3-2nd) = $(git rev-parse O3^) &&\n"> 
          <"\tgit log --reverse --pretty=oneline O3 | sed s/^.*z// >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"O: progress outputs as requested by input">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/O4\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzstring\n"> <"\tCOMMIT\n"> <"\tcommit refs/heads/O4\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzof\n"> <"\tCOMMIT\n"> <"\tprogress Two commits down, 2 to go!\n"> 
          <"\tcommit refs/heads/O4\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tzempty\n"> <"\tCOMMIT\n"> <"\tprogress Three commits down, 1 to go!\n"> <"\tcommit refs/heads/O4\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tzcommits\n"> <"\tCOMMIT\n"> <"\tprogress done!\n"> <"\tINPUT_END\n"> 
          <"\tgit fast-import <input >actual &&\n"> <"\tgrep \"progress \" <input >expect &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"P: superproject & submodule mix">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata 10\n"> 
          <"\ttest file\n"> <"\n"> <"\treset refs/heads/sub\n"> <"\tcommit refs/heads/sub\n"> <"\tmark :2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata 12\n"> <"\tsub_initial\n"> <"\tM 100644 :1 file\n"> <"\n"> <"\tblob\n"> <"\tmark :3\n"> 
          <"\tdata <<DATAEND\n"> <"\t[submodule \"sub\"]\n"> <"\t\tpath = sub\n"> <"\t\turl = \"$(pwd)/sub\"\n"> <"\tDATAEND\n"> <"\n"> 
          <"\tcommit refs/heads/subuse1\n"> <"\tmark :4\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata 8\n"> <"\tinitial\n"> <"\tfrom refs/heads/master\n"> <"\tM 100644 :3 .gitmodules\n"> <"\tM 160000 :2 sub\n"> 
          <"\n"> <"\tblob\n"> <"\tmark :5\n"> <"\tdata 20\n"> <"\ttest file\n"> <"\tmore data\n"> <"\n"> 
          <"\tcommit refs/heads/sub\n"> <"\tmark :6\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata 11\n"> <"\tsub_second\n"> <"\tfrom :2\n"> <"\tM 100644 :5 file\n"> <"\n"> <"\tcommit refs/heads/subuse1\n"> 
          <"\tmark :7\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata 7\n"> 
          <"\tsecond\n"> <"\tfrom :4\n"> <"\tM 160000 :6 sub\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit checkout subuse1 &&\n"> <"\trm -rf sub &&\n"> <"\tmkdir sub &&\n"> <"\t(\n"> <"\t\tcd sub &&\n"> <"\t\tgit init &&\n"> 
          <"\t\tgit fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&\n"> <"\t\tgit checkout master\n"> <"\t) &&\n"> <"\tgit submodule init &&\n"> <"\tgit submodule update\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"P: verbatim SHA gitlinks">)} 
      {
        (SQ <"\n"> <"\tSUBLAST=$(git rev-parse --verify sub) &&\n"> 
          <"\tSUBPREV=$(git rev-parse --verify sub^) &&\n"> <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata <<DATAEND\n"> 
          <"\t[submodule \"sub\"]\n"> <"\t\tpath = sub\n"> <"\t\turl = \"$(pwd)/sub\"\n"> <"\tDATAEND\n"> <"\n"> 
          <"\tcommit refs/heads/subuse2\n"> <"\tmark :2\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata 8\n"> <"\tinitial\n"> <"\tfrom refs/heads/master\n"> <"\tM 100644 :1 .gitmodules\n"> 
          <"\tM 160000 $SUBPREV sub\n"> <"\n"> <"\tcommit refs/heads/subuse2\n"> <"\tmark :3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata 7\n"> <"\tsecond\n"> <"\tfrom :2\n"> <"\tM 160000 $SUBLAST sub\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\tgit branch -D sub &&\n"> <"\tgit gc &&\n"> <"\tgit prune &&\n"> <"\tgit fast-import <input &&\n"> 
          <"\ttest $(git rev-parse --verify subuse2) = $(git rev-parse --verify subuse1)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"P: fail on inline gitlink">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/subuse3\n"> <"\tmark :1\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tcorrupt\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/subuse2\n"> <"\tM 160000 inline sub\n"> 
          <"\tdata <<DATA\n"> <"\t$SUBPREV\n"> <"\tDATA\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> 
          <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"P: fail on blob mark in gitlink">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :1\n"> 
          <"\tdata <<DATA\n"> <"\t$SUBPREV\n"> <"\tDATA\n"> <"\n"> <"\tcommit refs/heads/subuse3\n"> <"\tmark :2\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcorrupt\n"> <"\tCOMMIT\n"> <"\n"> <"\tfrom refs/heads/subuse2\n"> 
          <"\tM 160000 :1 sub\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: commit notes">)} 
      {
        (SQ <"\n"> <"\tnote1_data=\"The first note for the first commit\" &&\n"> 
          <"\tnote2_data=\"The first note for the second commit\" &&\n"> <"\tnote3_data=\"The first note for the third commit\" &&\n"> 
          <"\tnote1b_data=\"The second note for the first commit\" &&\n"> <"\tnote1c_data=\"The third note for the first commit\" &&\n"> 
          <"\tnote2b_data=\"The second note for the second commit\" &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tblob\n"> <"\tmark :2\n"> 
          <"\tdata <<EOF\n"> <"\t$file2_data\n"> <"\tEOF\n"> <"\n"> <"\tcommit refs/heads/notes-test\n"> <"\tmark :3\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tfirst (:3)\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 :2 file2\n"> <"\n"> <"\tblob\n"> 
          <"\tmark :4\n"> <"\tdata $file4_len\n"> <"\t$file4_data\n"> <"\tcommit refs/heads/notes-test\n"> <"\tmark :5\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tsecond (:5)\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 :4 file4\n"> <"\n"> 
          <"\tcommit refs/heads/notes-test\n"> <"\tmark :6\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tthird (:6)\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 inline file5\n"> <"\tdata <<EOF\n"> <"\t$file5_data\n"> 
          <"\tEOF\n"> <"\n"> <"\tM 755 inline file6\n"> <"\tdata <<EOF\n"> <"\t$file6_data\n"> <"\tEOF\n"> <"\n"> <"\tblob\n"> 
          <"\tmark :7\n"> <"\tdata <<EOF\n"> <"\t$note1_data\n"> <"\tEOF\n"> <"\n"> <"\tblob\n"> <"\tmark :8\n"> <"\tdata <<EOF\n"> 
          <"\t$note2_data\n"> <"\tEOF\n"> <"\n"> <"\tcommit refs/notes/foobar\n"> <"\tmark :9\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tnotes (:9)\n"> <"\tCOMMIT\n"> <"\n"> <"\tN :7 :3\n"> <"\tN :8 :5\n"> 
          <"\tN inline :6\n"> <"\tdata <<EOF\n"> <"\t$note3_data\n"> <"\tEOF\n"> <"\n"> <"\tcommit refs/notes/foobar\n"> 
          <"\tmark :10\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tnotes (:10)\n"> <"\tCOMMIT\n"> <"\n"> <"\tN inline :3\n"> <"\tdata <<EOF\n"> <"\t$note1b_data\n"> <"\tEOF\n"> <"\n"> 
          <"\tcommit refs/notes/foobar2\n"> <"\tmark :11\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tnotes (:11)\n"> <"\tCOMMIT\n"> <"\n"> <"\tN inline :3\n"> <"\tdata <<EOF\n"> <"\t$note1c_data\n"> 
          <"\tEOF\n"> <"\n"> <"\tcommit refs/notes/foobar\n"> <"\tmark :12\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tnotes (:12)\n"> <"\tCOMMIT\n"> <"\n"> <"\tdeleteall\n"> <"\tN inline :5\n"> 
          <"\tdata <<EOF\n"> <"\t$note2b_data\n"> <"\tEOF\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input &&\n"> 
          <"\tgit whatchanged notes-test\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify pack">)} {(SQ <"\n"> <"\tverify_packs\n">)})
    (C {(test_expect_success)} {(SQ <"Q: verify first commit">)} 
      {
        (SQ <"\n"> <"\tcommit1=$(git rev-parse notes-test~2) &&\n"> 
          <"\tcommit2=$(git rev-parse notes-test^) &&\n"> <"\tcommit3=$(git rev-parse notes-test) &&\n"> <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> 
          <"\tfirst (:3)\n"> <"\tEOF\n"> <"\tgit cat-file commit notes-test~2 | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify second commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\tparent $commit1\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> 
          <"\tsecond (:5)\n"> <"\tEOF\n"> <"\tgit cat-file commit notes-test^ | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify third commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> <"\tparent $commit2\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> 
          <"\tthird (:6)\n"> <"\tEOF\n"> <"\tgit cat-file commit notes-test | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first notes commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> 
          <"\tnotes (:9)\n"> <"\tEOF\n"> <"\tgit cat-file commit refs/notes/foobar~2 | sed 1d >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first notes tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect.unsorted <<-EOF &&\n"> <"\t100644 blob $commit1\n"> 
          <"\t100644 blob $commit2\n"> <"\t100644 blob $commit3\n"> <"\tEOF\n"> <"\tcat expect.unsorted | sort >expect &&\n"> 
          <"\tgit cat-file -p refs/notes/foobar~2^{tree} | sed \"s/ [0-9a-f]*\t/ /\" >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first note for first commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note1_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar~2:$commit1 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first note for second commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note2_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar~2:$commit2 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first note for third commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note3_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar~2:$commit3 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify second notes commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tparent $(git rev-parse --verify refs/notes/foobar~2)\n"> <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> <"\tnotes (:10)\n"> <"\tEOF\n"> 
          <"\tgit cat-file commit refs/notes/foobar^ | sed 1d >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify second notes tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect.unsorted <<-EOF &&\n"> <"\t100644 blob $commit1\n"> 
          <"\t100644 blob $commit2\n"> <"\t100644 blob $commit3\n"> <"\tEOF\n"> <"\tcat expect.unsorted | sort >expect &&\n"> 
          <"\tgit cat-file -p refs/notes/foobar^^{tree} | sed \"s/ [0-9a-f]*\t/ /\" >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify second note for first commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note1b_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar^:$commit1 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first note for second commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note2_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar^:$commit2 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify first note for third commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note3_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar^:$commit3 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify third notes commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> 
          <"\tnotes (:11)\n"> <"\tEOF\n"> <"\tgit cat-file commit refs/notes/foobar2 | sed 1d >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify third notes tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect.unsorted <<-EOF &&\n"> <"\t100644 blob $commit1\n"> <"\tEOF\n"> 
          <"\tcat expect.unsorted | sort >expect &&\n"> <"\tgit cat-file -p refs/notes/foobar2^{tree} | sed \"s/ [0-9a-f]*\t/ /\" >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify third note for first commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note1c_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar2:$commit1 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify fourth notes commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <"\tparent $(git rev-parse --verify refs/notes/foobar^)\n"> <"\tauthor $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\n"> <"\tnotes (:12)\n"> <"\tEOF\n"> <"\tgit cat-file commit refs/notes/foobar | sed 1d >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify fourth notes tree">)} 
      {
        (SQ <"\n"> <"\tcat >expect.unsorted <<-EOF &&\n"> <"\t100644 blob $commit2\n"> <"\tEOF\n"> 
          <"\tcat expect.unsorted | sort >expect &&\n"> <"\tgit cat-file -p refs/notes/foobar^{tree} | sed \"s/ [0-9a-f]*\t/ /\" >actual &&\n"> 
          <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: verify second note for second commit">)} 
      {
        (SQ <"\n"> <"\techo \"$note2b_data\" >expect &&\n"> 
          <"\tgit cat-file blob refs/notes/foobar:$commit2 >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Q: deny note on empty branch">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\treset refs/heads/Q0\n"> <"\n"> 
          <"\tcommit refs/heads/note-Q0\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tNote for an empty branch.\n"> <"\tCOMMIT\n"> <"\n"> <"\tN inline refs/heads/Q0\n"> <"\tdata <<NOTE\n"> <"\tsome note\n"> <"\tNOTE\n"> 
          <"\tEOF\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: abort on unsupported feature">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature no-such-feature-exists\n"> <"\tEOF\n"> <"\n"> 
          <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: supported feature is accepted">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature date-format=now\n"> <"\tEOF\n"> <"\n"> 
          <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: abort on receiving feature after data command">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tblob\n"> <"\tdata 3\n"> <"\thi\n"> 
          <"\tfeature date-format=now\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: only one import-marks feature allowed per stream">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature import-marks=git.marks\n"> 
          <"\tfeature import-marks=git2.marks\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: export-marks feature results in a marks file being created">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature export-marks=git.marks\n"> <"\tblob\n"> 
          <"\tmark :1\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n"> <"\n"> <"\tcat input | git fast-import &&\n"> 
          <"\tgrep :1 git.marks\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"R: export-marks options can be overridden by commandline options">)} 
      {
        (SQ <"\n"> <"\tcat input | git fast-import --export-marks=other.marks &&\n"> 
          <"\tgrep :1 other.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: catch typo in marks file name">)} 
      {
        (SQ <"\n"> 
          <"\ttest_must_fail git fast-import --import-marks=nonexistent.marks </dev/null &&\n"> <"\techo \"feature import-marks=nonexistent.marks\" |\n"> <"\ttest_must_fail git fast-import\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: import and output marks can be the same file">)} 
      {
        (SQ <"\n"> <"\trm -f io.marks &&\n"> <"\tblob=$(echo hi | git hash-object --stdin) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t:1 $blob\n"> <"\t:2 $blob\n"> <"\tEOF\n"> 
          <"\tgit fast-import --export-marks=io.marks <<-\\EOF &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n"> 
          <"\tgit fast-import --import-marks=io.marks --export-marks=io.marks <<-\\EOF &&\n"> <"\tblob\n"> <"\tmark :2\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: --import-marks=foo --output-marks=foo to create foo fails">)} 
      {
        (SQ <"\n"> <"\trm -f io.marks &&\n"> 
          <
"\ttest_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\\EOF\n"
          > <"\tblob\n"> <"\tmark :1\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: --import-marks-if-exists">)} 
      {
        (SQ <"\n"> <"\trm -f io.marks &&\n"> <"\tblob=$(echo hi | git hash-object --stdin) &&\n"> 
          <"\techo \":1 $blob\" >expect &&\n"> <"\tgit fast-import --import-marks-if-exists=io.marks --export-marks=io.marks <<-\\EOF &&\n"> 
          <"\tblob\n"> <"\tmark :1\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: feature import-marks-if-exists">)} 
      {
        (SQ <"\n"> <"\trm -f io.marks &&\n"> <"\t>expect &&\n"> <"\n"> 
          <"\tgit fast-import --export-marks=io.marks <<-\\EOF &&\n"> <"\tfeature import-marks-if-exists=not_io.marks\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks &&\n"> 
          <"\n"> <"\tblob=$(echo hi | git hash-object --stdin) &&\n"> <"\n"> <"\techo \":1 $blob\" >io.marks &&\n"> 
          <"\techo \":1 $blob\" >expect &&\n"> <"\techo \":2 $blob\" >>expect &&\n"> <"\n"> 
          <"\tgit fast-import --export-marks=io.marks <<-\\EOF &&\n"> <"\tfeature import-marks-if-exists=io.marks\n"> <"\tblob\n"> <"\tmark :2\n"> <"\tdata 3\n"> <"\thi\n"> 
          <"\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks &&\n"> <"\n"> <"\techo \":3 $blob\" >>expect &&\n"> <"\n"> 
          <"\tgit fast-import --import-marks=io.marks \\\n"> <"\t\t\t--export-marks=io.marks <<-\\EOF &&\n"> <"\tfeature import-marks-if-exists=not_io.marks\n"> 
          <"\tblob\n"> <"\tmark :3\n"> <"\tdata 3\n"> <"\thi\n"> <"\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks &&\n"> <"\n"> 
          <"\t>expect &&\n"> <"\n"> <"\tgit fast-import --import-marks-if-exists=not_io.marks \\\n"> 
          <"\t\t\t--export-marks=io.marks <<-\\EOF &&\n"> <"\tfeature import-marks-if-exists=io.marks\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: import to output marks works without any content">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature import-marks=marks.out\n"> 
          <"\tfeature export-marks=marks.new\n"> <"\tEOF\n"> <"\n"> <"\tcat input | git fast-import &&\n"> <"\ttest_cmp marks.out marks.new\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: import marks prefers commandline marks file over the stream">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature import-marks=nonexistent.marks\n"> 
          <"\tfeature export-marks=marks.new\n"> <"\tEOF\n"> <"\n"> <"\tcat input | git fast-import --import-marks=marks.out &&\n"> 
          <"\ttest_cmp marks.out marks.new\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: multiple --import-marks= should be honoured">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature import-marks=nonexistent.marks\n"> 
          <"\tfeature export-marks=combined.marks\n"> <"\tEOF\n"> <"\n"> <"\thead -n2 marks.out > one.marks &&\n"> <"\ttail -n +3 marks.out > two.marks &&\n"> 
          <"\tgit fast-import --import-marks=one.marks --import-marks=two.marks <input &&\n"> <"\ttest_cmp marks.out combined.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: feature relative-marks should be honoured">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature relative-marks\n"> 
          <"\tfeature import-marks=relative.in\n"> <"\tfeature export-marks=relative.out\n"> <"\tEOF\n"> <"\n"> <"\tmkdir -p .git/info/fast-import/ &&\n"> 
          <"\tcp marks.new .git/info/fast-import/relative.in &&\n"> <"\tgit fast-import <input &&\n"> <"\ttest_cmp marks.new .git/info/fast-import/relative.out\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: feature no-relative-marks should be honoured">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\tfeature relative-marks\n"> 
          <"\tfeature import-marks=relative.in\n"> <"\tfeature no-relative-marks\n"> <"\tfeature export-marks=non-relative.out\n"> <"\tEOF\n"> <"\n"> 
          <"\tgit fast-import <input &&\n"> <"\ttest_cmp marks.new non-relative.out\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: feature ls supported">)} 
      {(SQ <"\n"> <"\techo \"feature ls\" |\n"> <"\tgit fast-import\n">)}
    )
    (C {(test_expect_success)} {(SQ <"R: feature cat-blob supported">)} 
      {(SQ <"\n"> <"\techo \"feature cat-blob\" |\n"> <"\tgit fast-import\n">)}
    )
    (C {(test_expect_success)} {(SQ <"R: cat-blob-fd must be a nonnegative integer">)} 
      {(SQ <"\n"> <"\ttest_must_fail git fast-import --cat-blob-fd=-1 </dev/null\n">)}
    )
    (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"R: print old blob">)} 
      {
        (SQ <"\n"> <"\tblob=$(echo \"yes it can\" | git hash-object -w --stdin) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t${blob} blob 11\n"> <"\tyes it can\n"> <"\n"> <"\tEOF\n"> <"\techo \"cat-blob $blob\" |\n"> 
          <"\tgit fast-import --cat-blob-fd=6 6>actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"R: in-stream cat-blob-fd not respected">)} 
      {
        (SQ <"\n"> <"\techo hello >greeting &&\n"> <"\tblob=$(git hash-object -w greeting) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t${blob} blob 6\n"> <"\thello\n"> <"\n"> <"\tEOF\n"> 
          <"\tgit fast-import --cat-blob-fd=3 3>actual.3 >actual.1 <<-EOF &&\n"> <"\tcat-blob $blob\n"> <"\tEOF\n"> <"\ttest_cmp expect actual.3 &&\n"> 
          <"\ttest_must_be_empty actual.1 &&\n"> <"\tgit fast-import 3>actual.3 >actual.1 <<-EOF &&\n"> <"\toption cat-blob-fd=3\n"> 
          <"\tcat-blob $blob\n"> <"\tEOF\n"> <"\ttest_must_be_empty actual.3 &&\n"> <"\ttest_cmp expect actual.1\n">
        )
      }
    )
    (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"R: print mark for new blob">)} 
      {
        (SQ <"\n"> <"\techo \"effluentish\" | git hash-object --stdin >expect &&\n"> 
          <"\tgit fast-import --cat-blob-fd=6 6>actual <<-\\EOF &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata <<BLOB_END\n"> <"\teffluentish\n"> <"\tBLOB_END\n"> 
          <"\tget-mark :1\n"> <"\tEOF\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"R: print new blob">)} 
      {
        (SQ <"\n"> <"\tblob=$(echo \"yep yep yep\" | git hash-object --stdin) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t${blob} blob 12\n"> <"\tyep yep yep\n"> <"\n"> <"\tEOF\n"> 
          <"\tgit fast-import --cat-blob-fd=6 6>actual <<-\\EOF &&\n"> <"\tblob\n"> <"\tmark :1\n"> <"\tdata <<BLOB_END\n"> <"\tyep yep yep\n"> <"\tBLOB_END\n"> 
          <"\tcat-blob :1\n"> <"\tEOF\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"R: print new blob by sha1">)} 
      {
        (SQ <"\n"> <"\tblob=$(echo \"a new blob named by sha1\" | git hash-object --stdin) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t${blob} blob 25\n"> <"\ta new blob named by sha1\n"> <"\n"> <"\tEOF\n"> 
          <"\tgit fast-import --cat-blob-fd=6 6>actual <<-EOF &&\n"> <"\tblob\n"> <"\tdata <<BLOB_END\n"> <"\ta new blob named by sha1\n"> <"\tBLOB_END\n"> 
          <"\tcat-blob $blob\n"> <"\tEOF\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup: big file">)} 
      {
        (SQ <"\n"> <"\t(\n"> <"\t\techo \"the quick brown fox jumps over the lazy dog\" >big &&\n"> 
          <"\t\tfor i in 1 2 3\n"> <"\t\tdo\n"> <"\t\t\tcat big big big big >bigger &&\n"> 
          <"\t\t\tcat bigger bigger bigger bigger >big ||\n"> <"\t\t\texit\n"> <"\t\tdone\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: print two blobs to stdout">)} 
      {
        (SQ <"\n"> <"\tblob1=$(git hash-object big) &&\n"> <"\tblob1_len=$(wc -c <big) &&\n"> 
          <"\tblob2=$(echo hello | git hash-object --stdin) &&\n"> <"\t{\n"> <"\t\techo ${blob1} blob $blob1_len &&\n"> <"\t\tcat big &&\n"> <"\t\tcat <<-EOF\n"> <"\n"> 
          <"\t\t${blob2} blob 6\n"> <"\t\thello\n"> <"\n"> <"\t\tEOF\n"> <"\t} >expect &&\n"> <"\t{\n"> <"\t\tcat <<-\\END_PART1 &&\n"> 
          <"\t\t\tblob\n"> <"\t\t\tmark :1\n"> <"\t\t\tdata <<data_end\n"> <"\t\tEND_PART1\n"> <"\t\tcat big &&\n"> 
          <"\t\tcat <<-\\EOF\n"> <"\t\t\tdata_end\n"> <"\t\t\tblob\n"> <"\t\t\tmark :2\n"> <"\t\t\tdata <<data_end\n"> <"\t\t\thello\n"> 
          <"\t\t\tdata_end\n"> <"\t\t\tcat-blob :1\n"> <"\t\t\tcat-blob :2\n"> <"\t\tEOF\n"> <"\t} |\n"> 
          <"\tgit fast-import >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(PIPE)} {(SQ <"R: copy using cat-file">)} 
      {
        (SQ <"\n"> <"\texpect_id=$(git hash-object big) &&\n"> <"\texpect_len=$(wc -c <big) &&\n"> 
          <"\techo $expect_id blob $expect_len >expect.response &&\n"> <"\n"> <"\trm -f blobs &&\n"> <"\tcat >frontend <<-\\FRONTEND_END &&\n"> <"\t#!/bin/sh\n"> 
          <"\tFRONTEND_END\n"> <"\n"> <"\tmkfifo blobs &&\n"> <"\t(\n"> 
          <"\t\texport GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE &&\n"> <"\t\tcat <<-\\EOF &&\n"> <"\t\tfeature cat-blob\n"> <"\t\tblob\n"> <"\t\tmark :1\n"> 
          <"\t\tdata <<BLOB\n"> <"\t\tEOF\n"> <"\t\tcat big &&\n"> <"\t\tcat <<-\\EOF &&\n"> <"\t\tBLOB\n"> <"\t\tcat-blob :1\n"> 
          <"\t\tEOF\n"> <"\n"> <"\t\tread blob_id type size <&3 &&\n"> <"\t\techo \"$blob_id $type $size\" >response &&\n"> 
          <"\t\ttest_copy_bytes $size >blob <&3 &&\n"> <"\t\tread newline <&3 &&\n"> <"\n"> <"\t\tcat <<-EOF &&\n"> <"\t\tcommit refs/heads/copied\n"> 
          <"\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\t\tdata <<COMMIT\n"> <"\t\tcopy big file as file3\n"> <"\t\tCOMMIT\n"> <"\t\tM 644 inline file3\n"> 
          <"\t\tdata <<BLOB\n"> <"\t\tEOF\n"> <"\t\tcat blob &&\n"> <"\t\techo BLOB\n"> <"\t) 3<blobs |\n"> 
          <"\tgit fast-import --cat-blob-fd=3 3>blobs &&\n"> <"\tgit show copied:file3 >actual &&\n"> <"\ttest_cmp expect.response response &&\n"> 
          <"\ttest_cmp big actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(PIPE)} {(SQ <"R: print blob mid-commit">)} 
      {
        (SQ <"\n"> <"\trm -f blobs &&\n"> <"\techo \"A blob from _before_ the commit.\" >expect &&\n"> 
          <"\tmkfifo blobs &&\n"> <"\t(\n"> <"\t\texec 3<blobs &&\n"> <"\t\tcat <<-EOF &&\n"> <"\t\tfeature cat-blob\n"> <"\t\tblob\n"> 
          <"\t\tmark :1\n"> <"\t\tdata <<BLOB\n"> <"\t\tA blob from _before_ the commit.\n"> <"\t\tBLOB\n"> 
          <"\t\tcommit refs/heads/temporary\n"> <"\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\t\tdata <<COMMIT\n"> <"\t\tEmpty commit\n"> <"\t\tCOMMIT\n"> <"\t\tcat-blob :1\n"> <"\t\tEOF\n"> <"\n"> 
          <"\t\tread blob_id type size <&3 &&\n"> <"\t\ttest_copy_bytes $size >actual <&3 &&\n"> <"\t\tread newline <&3 &&\n"> <"\n"> <"\t\techo\n"> 
          <"\t) |\n"> <"\tgit fast-import --cat-blob-fd=3 3>blobs &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(PIPE)} {(SQ <"R: print staged blob within commit">)} 
      {
        (SQ <"\n"> <"\trm -f blobs &&\n"> <"\techo \"A blob from _within_ the commit.\" >expect &&\n"> 
          <"\tmkfifo blobs &&\n"> <"\t(\n"> <"\t\texec 3<blobs &&\n"> <"\t\tcat <<-EOF &&\n"> <"\t\tfeature cat-blob\n"> 
          <"\t\tcommit refs/heads/within\n"> <"\t\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\t\tdata <<COMMIT\n"> <"\t\tEmpty commit\n"> <"\t\tCOMMIT\n"> <"\t\tM 644 inline within\n"> <"\t\tdata <<BLOB\n"> 
          <"\t\tA blob from _within_ the commit.\n"> <"\t\tBLOB\n"> <"\t\tEOF\n"> <"\n"> <"\t\tto_get=$(\n"> 
          <"\t\t\techo \"A blob from _within_ the commit.\" |\n"> <"\t\t\tgit hash-object --stdin\n"> <"\t\t) &&\n"> <"\t\techo \"cat-blob $to_get\" &&\n"> <"\n"> 
          <"\t\tread blob_id type size <&3 &&\n"> <"\t\ttest_copy_bytes $size >actual <&3 &&\n"> <"\t\tread newline <&3 &&\n"> <"\n"> 
          <"\t\techo deleteall\n"> <"\t) |\n"> <"\tgit fast-import --cat-blob-fd=3 3>blobs &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: quiet option results in no stats being output">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\toption git quiet\n"> <"\tblob\n"> <"\tdata 3\n"> 
          <"\thi\n"> <"\n"> <"\tEOF\n"> <"\n"> <"\tcat input | git fast-import 2> output &&\n"> 
          <"\ttest_must_be_empty output\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: feature done means terminating \"done\" is mandatory">)} 
      {
        (SQ <"\n"> <"\techo feature done | test_must_fail git fast-import &&\n"> 
          <"\ttest_must_fail git fast-import --done </dev/null\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: terminating \"done\" with trailing gibberish is ok">)} 
      {
        (SQ <"\n"> <"\tgit fast-import <<-\\EOF &&\n"> <"\tfeature done\n"> <"\tdone\n"> 
          <"\ttrailing gibberish\n"> <"\tEOF\n"> <"\tgit fast-import <<-\\EOF\n"> <"\tdone\n"> <"\tmore trailing gibberish\n"> <"\tEOF\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: terminating \"done\" within commit">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-\\EOF &&\n"> <"\tOBJID\n"> 
          <"\t:000000 100644 OBJID OBJID A\thello.c\n"> <"\t:000000 100644 OBJID OBJID A\thello2.c\n"> <"\tEOF\n"> <"\tgit fast-import <<-EOF &&\n"> 
          <"\tcommit refs/heads/done-ends\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<EOT\n"> 
          <"\tCommit terminated by \"done\" command\n"> <"\tEOT\n"> <"\tM 100644 inline hello.c\n"> <"\tdata <<EOT\n"> <"\tHello, world.\n"> <"\tEOT\n"> 
          <"\tC hello.c hello2.c\n"> <"\tdone\n"> <"\tEOF\n"> <"\tgit rev-list done-ends |\n"> 
          <"\tgit diff-tree -r --stdin --root --always |\n"> <"\tsed -e \"s/$_x40/OBJID/g\" >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: die on unknown option">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\toption git non-existing-option\n"> <"\tEOF\n"> <"\n"> 
          <"\ttest_must_fail git fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: unknown commandline options are rejected">)} 
      {(SQ <"\\\n"> <"\ttest_must_fail git fast-import --non-existing-option < /dev/null\n">)}
    )
    (C {(test_expect_success)} {(SQ <"R: die on invalid option argument">)} 
      {
        (SQ <"\n"> <"\techo \"option git active-branches=-5\" |\n"> 
          <"\ttest_must_fail git fast-import &&\n"> <"\techo \"option git depth=\" |\n"> <"\ttest_must_fail git fast-import &&\n"> 
          <"\ttest_must_fail git fast-import --depth=\"5 elephants\" </dev/null\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: ignore non-git options">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-EOF &&\n"> <"\toption non-existing-vcs non-existing-option\n"> 
          <"\tEOF\n"> <"\n"> <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: corrupt lines do not mess marks file">)} 
      {
        (SQ <"\n"> <"\trm -f io.marks &&\n"> <"\tblob=$(echo hi | git hash-object --stdin) &&\n"> 
          <"\tcat >expect <<-EOF &&\n"> <"\t:3 0000000000000000000000000000000000000000\n"> <"\t:1 $blob\n"> <"\t:2 $blob\n"> <"\tEOF\n"> 
          <"\tcp expect io.marks &&\n"> <"\ttest_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\\EOF &&\n"> 
          <"\n"> <"\tEOF\n"> <"\ttest_cmp expect io.marks\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: blob bigger than threshold">)} 
      {
        (SQ <"\n"> <"\tblobsize=$((2*1024*1024 + 53)) &&\n"> 
          <"\ttest-genrandom bar $blobsize >expect &&\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/big-file\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tR - big file\n"> <"\tCOMMIT\n"> <"\n"> <"\tM 644 inline big1\n"> 
          <"\tdata $blobsize\n"> <"\tINPUT_END\n"> <"\tcat expect >>input &&\n"> <"\tcat >>input <<-INPUT_END &&\n"> 
          <"\tM 644 inline big2\n"> <"\tdata $blobsize\n"> <"\tINPUT_END\n"> <"\tcat expect >>input &&\n"> <"\techo >>input &&\n"> <"\n"> 
          <"\ttest_create_repo R &&\n"> <"\tgit --git-dir=R/.git config fastimport.unpackLimit 0 &&\n"> 
          <"\tgit --git-dir=R/.git fast-import --big-file-threshold=1 <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: verify created pack">)} 
      {(SQ <"\n"> <"\t(\n"> <"\t\tcd R &&\n"> <"\t\tverify_packs -v > ../verify\n"> <"\t)\n">)}
    )
    (C {(test_expect_success)} {(SQ <"R: verify written objects">)} 
      {
        (SQ <"\n"> <"\tgit --git-dir=R/.git cat-file blob big-file:big1 >actual &&\n"> 
          <"\ttest_cmp_bin expect actual &&\n"> <"\ta=$(git --git-dir=R/.git rev-parse big-file:big1) &&\n"> 
          <"\tb=$(git --git-dir=R/.git rev-parse big-file:big2) &&\n"> <"\ttest $a = $b\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"R: blob appears only once">)} 
      {(SQ <"\n"> <"\tn=$(grep $a verify | wc -l) &&\n"> <"\ttest 1 = $n\n">)}
    )
    (C {(test_expect_success)} {(SQ <"S: initialize for S tests">)} 
      {
        (SQ <"\n"> <"\ttest_tick &&\n"> <"\n"> <"\tcat >input <<-INPUT_END &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tmark :301\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tcommit 1\n"> <"\tCOMMIT\n"> <"\tM 100644 inline hello.c\n"> <"\tdata <<BLOB\n"> <"\tblob 1\n"> 
          <"\tBLOB\n"> <"\n"> <"\tcommit refs/heads/S\n"> <"\tmark :302\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcommit 2\n"> <"\tCOMMIT\n"> <"\tfrom :301\n"> <"\tM 100644 inline hello.c\n"> 
          <"\tdata <<BLOB\n"> <"\tblob 2\n"> <"\tBLOB\n"> <"\n"> <"\tblob\n"> <"\tmark :403\n"> <"\tdata <<BLOB\n"> <"\tblob 3\n"> 
          <"\tBLOB\n"> <"\n"> <"\tblob\n"> <"\tmark :202\n"> <"\tdata <<BLOB\n"> <"\tnote 2\n"> <"\tBLOB\n"> <"\tINPUT_END\n"> 
          <"\n"> <"\tgit fast-import --export-marks=marks <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: filemodify with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcommit N\n"> <"\tCOMMIT\n"> <"\tM 100644 :403x hello.c\n"> <"\tEOF\n"> <"\tcat err &&\n"> 
          <"\ttest_i18ngrep \"space after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: filemodify with garbage after inline must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcommit N\n"> <"\tCOMMIT\n"> <"\tM 100644 inlineX hello.c\n"> <"\tdata <<BLOB\n"> <"\tinline\n"> <"\tBLOB\n"> 
          <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"nvalid dataref\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: filemodify with garbage after sha1 must fail">)} 
      {
        (SQ <"\n"> <"\tsha1=$(grep :403 marks | cut -d\\  -f2) &&\n"> 
          <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> <"\tcommit refs/heads/S\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcommit N\n"> <"\tCOMMIT\n"> <"\tM 100644 ${sha1}x hello.c\n"> <"\tEOF\n"> 
          <"\tcat err &&\n"> <"\ttest_i18ngrep \"space after SHA1\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: notemodify with garabge after mark dataref must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcommit S note dataref markref\n"> <"\tCOMMIT\n"> <"\tN :202x :302\n"> <"\tEOF\n"> <"\tcat err &&\n"> 
          <"\ttest_i18ngrep \"space after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: notemodify with garbage after inline dataref must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcommit S note dataref inline\n"> <"\tCOMMIT\n"> <"\tN inlineX :302\n"> <"\tdata <<BLOB\n"> <"\tnote blob\n"> <"\tBLOB\n"> <"\tEOF\n"> 
          <"\tcat err &&\n"> <"\ttest_i18ngrep \"nvalid dataref\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: notemodify with garbage after sha1 dataref must fail">)} 
      {
        (SQ <"\n"> <"\tsha1=$(grep :202 marks | cut -d\\  -f2) &&\n"> 
          <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> <"\tcommit refs/heads/S\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcommit S note dataref sha1\n"> <"\tCOMMIT\n"> <"\tN ${sha1}x :302\n"> 
          <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"space after SHA1\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: notemodify with garbage after mark commit-ish must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/Snotes\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> 
          <"\tcommit S note commit-ish\n"> <"\tCOMMIT\n"> <"\tN :202 :302x\n"> <"\tEOF\n"> <"\tcat err &&\n"> 
          <"\ttest_i18ngrep \"after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: from with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail \\\n"> 
          <"\tgit fast-import --import-marks=marks --export-marks=marks <<-EOF 2>err &&\n"> <"\tcommit refs/heads/S2\n"> <"\tmark :303\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcommit 3\n"> <"\tCOMMIT\n"> <"\tfrom :301x\n"> <"\tM 100644 :403 hello.c\n"> 
          <"\tEOF\n"> <"\n"> <"\n"> <"\t# go create the commit, need it for merge test\n"> 
          <"\tgit fast-import --import-marks=marks --export-marks=marks <<-EOF &&\n"> <"\tcommit refs/heads/S2\n"> <"\tmark :303\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tcommit 3\n"> <"\tCOMMIT\n"> <"\tfrom :301\n"> <"\tM 100644 :403 hello.c\n"> 
          <"\tEOF\n"> <"\n"> <"\t# now evaluate the error\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: merge with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcommit refs/heads/S\n"> <"\tmark :304\n"> <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<COMMIT\n"> <"\tmerge 4\n"> <"\tCOMMIT\n"> <"\tfrom :302\n"> <"\tmerge :303x\n"> <"\tM 100644 :403 hello.c\n"> 
          <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: tag with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\ttag refs/tags/Stag\n"> <"\tfrom :302x\n"> <"\ttagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> 
          <"\tdata <<TAG\n"> <"\ttag S\n"> <"\tTAG\n"> <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: cat-blob with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tcat-blob :403x\n"> <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: ls with garbage after mark must fail">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> 
          <"\tls :302x hello.c\n"> <"\tEOF\n"> <"\tcat err &&\n"> <"\ttest_i18ngrep \"space after mark\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"S: ls with garbage after sha1 must fail">)} 
      {
        (SQ <"\n"> <"\tsha1=$(grep :302 marks | cut -d\\  -f2) &&\n"> 
          <"\ttest_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&\n"> <"\tls ${sha1}x hello.c\n"> <"\tEOF\n"> <"\tcat err &&\n"> 
          <"\ttest_i18ngrep \"space after tree-ish\" err\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"T: ls root tree">)} 
      {
        (SQ <"\n"> <"\tsed -e \"s/Z\\$//\" >expect <<-EOF &&\n"> 
          <"\t040000 tree $(git rev-parse S^{tree})\tZ\n"> <"\tEOF\n"> <"\tsha1=$(git rev-parse --verify S) &&\n"> 
          <"\tgit fast-import --import-marks=marks <<-EOF >actual &&\n"> <"\tls $sha1 \"\"\n"> <"\tEOF\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"T: delete branch">)} 
      {
        (SQ <"\n"> <"\tgit branch to-delete &&\n"> <"\tgit fast-import <<-EOF &&\n"> 
          <"\treset refs/heads/to-delete\n"> <"\tfrom 0000000000000000000000000000000000000000\n"> <"\tEOF\n"> 
          <"\ttest_must_fail git rev-parse --verify refs/heads/to-delete\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"T: empty reset doesnt delete branch">)} 
      {
        (SQ <"\n"> <"\tgit branch not-to-delete &&\n"> <"\tgit fast-import <<-EOF &&\n"> 
          <"\treset refs/heads/not-to-delete\n"> <"\tEOF\n"> <"\tgit show-ref &&\n"> <"\tgit rev-parse --verify refs/heads/not-to-delete\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: initialize for U tests">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/U\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\ttest setup\n"> <"\tCOMMIT\n"> <"\tM 100644 inline hello.c\n"> 
          <"\tdata <<BLOB\n"> <"\tblob 1\n"> <"\tBLOB\n"> <"\tM 100644 inline good/night.txt\n"> <"\tdata <<BLOB\n"> <"\tsleep well\n"> 
          <"\tBLOB\n"> <"\tM 100644 inline good/bye.txt\n"> <"\tdata <<BLOB\n"> <"\tau revoir\n"> <"\tBLOB\n"> <"\n"> 
          <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: filedelete file succeeds">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/U\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tdelete good/night.txt\n"> <"\tCOMMIT\n"> <"\tfrom refs/heads/U^0\n"> 
          <"\tD good/night.txt\n"> <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: validate file delete result">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100644 000000 2907ebb4bf85d91bf0716bb3bd8a68ef48d6da76 0000000000000000000000000000000000000000 D\tgood/night.txt\n"
          > <"\tEOF\n"> <"\n"> <"\tgit diff-tree -M -r U^1 U >actual &&\n"> <"\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: filedelete directory succeeds">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/U\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tdelete good dir\n"> <"\tCOMMIT\n"> <"\tfrom refs/heads/U^0\n"> <"\tD good\n"> 
          <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: validate directory delete result">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100644 000000 69cb75792f55123d8389c156b0b41c2ff00ed507 0000000000000000000000000000000000000000 D\tgood/bye.txt\n"
          > <"\tEOF\n"> <"\n"> <"\tgit diff-tree -M -r U^1 U >actual &&\n"> <"\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: filedelete root succeeds">)} 
      {
        (SQ <"\n"> <"\tcat >input <<-INPUT_END &&\n"> <"\tcommit refs/heads/U\n"> 
          <"\tcommitter $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"\tdata <<COMMIT\n"> <"\tmust succeed\n"> <"\tCOMMIT\n"> <"\tfrom refs/heads/U^0\n"> <"\tD \"\"\n"> 
          <"\n"> <"\tINPUT_END\n"> <"\n"> <"\tgit fast-import <input\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"U: validate root delete result">)} 
      {
        (SQ <"\n"> <"\tcat >expect <<-EOF &&\n"> 
          <
"\t:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D\thello.c\n"
          > <"\tEOF\n"> <"\n"> <"\tgit diff-tree -M -r U^1 U >actual &&\n"> <"\n"> 
          <"\tcompare_diff_raw expect actual\n">
        )
      }
    )
    (C {(test_done)})
  ]
)