(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'per path merge controlled by merge attribute'>)}
          spids: [13]
        )
      ]
    )
    (C {<.>} {<./test-lib.sh>})
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\n'> <'\tfor f in text binary union\n'> <'\tdo\n'> 
          <'\t\techo Initial >$f && git add $f || return 1\n'> <'\tdone &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m Initial &&\n'> <'\n'> <'\tgit branch side &&\n'> 
          <'\tfor f in text binary union\n'> <'\tdo\n'> <'\t\techo Master >>$f && git add $f || return 1\n'> <'\tdone &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m Master &&\n'> <'\n'> <'\tgit checkout side &&\n'> <'\tfor f in text binary union\n'> <'\tdo\n'> 
          <'\t\techo Side >>$f && git add $f || return 1\n'> <'\tdone &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m Side &&\n'> <'\n'> <'\tgit tag anchor\n'>
        )
      }
    )
    (C {<test_expect_success>} {<merge>} 
      {
        (SQ <'\n'> <'\n'> <'\t{\n'> <'\t\techo "binary -merge"\n'> <'\t\techo "union merge=union"\n'> 
          <'\t} >.gitattributes &&\n'> <'\n'> <'\tif git merge master\n'> <'\tthen\n'> <'\t\techo Gaah, should have conflicted\n'> 
          <'\t\tfalse\n'> <'\telse\n'> <'\t\techo Ok, conflicted.\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'check merge result in index'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit ls-files -u | grep binary &&\n'> 
          <'\tgit ls-files -u | grep text &&\n'> <'\t! (git ls-files -u | grep union)\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'check merge result in working tree'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit cat-file -p HEAD:binary >binary-orig &&\n'> 
          <'\tgrep "<<<<<<<" text &&\n'> <'\tcmp binary-orig binary &&\n'> <'\t! grep "<<<<<<<" union &&\n'> <'\tgrep Master union &&\n'> 
          <'\tgrep Side union\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'retry the merge with longer context'>)} 
      {
        (SQ <'\n'> <'\techo text conflict-marker-size=32 >>.gitattributes &&\n'> 
          <'\tgit checkout -m text &&\n'> <'\tsed -ne "/^\\([<=>]\\)\\1\\1\\1*/{\n'> <'\t\ts/ .*$//\n'> <'\t\tp\n'> <'\t}" >actual text &&\n'> 
          <'\tgrep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&\n'> <'\tgrep "================================" actual &&\n'> 
          <'\tgrep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual\n'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir.Redir op:<Id.Redir_Great '>'> fd:-1 arg_word:{<./custom-merge>})
        (redir.HereDoc
          op: <Id.Redir_DLess '<<'>
          fd: -1
          here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
          here_end_span_id: 162
          stdin_parts: [
            <'#!/bin/sh\n'>
            <'\n'>
            <'orig="$1" ours="$2" theirs="$3" exit="$4" path=$5\n'>
            <'(\n'>
            <'\techo "orig is $orig"\n'>
            <'\techo "ours is $ours"\n'>
            <'\techo "theirs is $theirs"\n'>
            <'\techo "path is $path"\n'>
            <'\techo "=== orig ==="\n'>
            <'\tcat "$orig"\n'>
            <'\techo "=== ours ==="\n'>
            <'\tcat "$ours"\n'>
            <'\techo "=== theirs ==="\n'>
            <'\tcat "$theirs"\n'>
            <') >"$ours+"\n'>
            <'cat "$ours+" >"$ours"\n'>
            <'rm -f "$ours+"\n'>
            <'exit "$exit"\n'>
          ]
        )
      ]
    )
    (C {<chmod>} {<Id.Lit_Other '+'> <x>} {<./custom-merge>})
    (C {<test_expect_success>} {(SQ <'custom merge backend'>)} 
      {
        (SQ <'\n'> <'\n'> <'\techo "* merge=union" >.gitattributes &&\n'> 
          <'\techo "text merge=custom" >>.gitattributes &&\n'> <'\n'> <'\tgit reset --hard anchor &&\n'> <'\tgit config --replace-all \\\n'> 
          <'\tmerge.custom.driver "./custom-merge %O %A %B 0 %P" &&\n'> <'\tgit config --replace-all \\\n'> <'\tmerge.custom.name "custom merge driver for testing" &&\n'> 
          <'\n'> <'\tgit merge master &&\n'> <'\n'> <'\tcmp binary union &&\n'> <'\tsed -e 1,3d text >check-1 &&\n'> 
          <'\to=$(git unpack-file master^:text) &&\n'> <'\ta=$(git unpack-file side^:text) &&\n'> <'\tb=$(git unpack-file master:text) &&\n'> 
          <'\tsh -c "./custom-merge $o $a $b 0 '>
        ) <text> 
        (SQ <'" &&\n'> <'\tsed -e 1,3d $a >check-2 &&\n'> <'\tcmp check-1 check-2 &&\n'> 
          <'\trm -f $o $a $b\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'custom merge backend'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit reset --hard anchor &&\n'> <'\tgit config --replace-all \\\n'> 
          <'\tmerge.custom.driver "./custom-merge %O %A %B 1 %P" &&\n'> <'\tgit config --replace-all \\\n'> <'\tmerge.custom.name "custom merge driver for testing" &&\n'> 
          <'\n'> <'\tif git merge master\n'> <'\tthen\n'> <'\t\techo "Eh? should have conflicted"\n'> <'\t\tfalse\n'> 
          <'\telse\n'> <'\t\techo "Ok, conflicted"\n'> <'\tfi &&\n'> <'\n'> <'\tcmp binary union &&\n'> 
          <'\tsed -e 1,3d text >check-1 &&\n'> <'\to=$(git unpack-file master^:text) &&\n'> <'\ta=$(git unpack-file anchor:text) &&\n'> 
          <'\tb=$(git unpack-file master:text) &&\n'> <'\tsh -c "./custom-merge $o $a $b 0 '>
        ) <text> 
        (SQ <'" &&\n'> <'\tsed -e 1,3d $a >check-2 &&\n'> <'\tcmp check-1 check-2 &&\n'> 
          <'\tsed -e 1,3d -e 4q $a >check-3 &&\n'> <'\techo "path is text" >expect &&\n'> <'\tcmp expect check-3 &&\n'> <'\trm -f $o $a $b\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'up-to-date merge without common ancestor'>)} 
      {
        (SQ <'\n'> <'\ttest_create_repo repo1 &&\n'> <'\ttest_create_repo repo2 &&\n'> 
          <'\ttest_tick &&\n'> <'\t(\n'> <'\t\tcd repo1 &&\n'> <'\t\t>a &&\n'> <'\t\tgit add a &&\n'> <'\t\tgit commit -m initial\n'> 
          <'\t) &&\n'> <'\ttest_tick &&\n'> <'\t(\n'> <'\t\tcd repo2 &&\n'> <'\t\tgit commit --allow-empty -m initial\n'> 
          <'\t) &&\n'> <'\ttest_tick &&\n'> <'\t(\n'> <'\t\tcd repo1 &&\n'> <'\t\tgit fetch ../repo2 master &&\n'> 
          <'\t\tgit merge --allow-unrelated-histories FETCH_HEAD\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'custom merge does not lock index'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard anchor &&\n'> 
          <'\twrite_script sleep-one-second.sh <<-\\EOF &&\n'> <'\t\tsleep 1 &\n'> <'\t\techo $! >sleep.pid\n'> <'\tEOF\n'> 
          <'\ttest_when_finished "kill \\$(cat sleep.pid)" &&\n'> <'\n'> <'\ttest_write_lines >.gitattributes \\\n'> 
          <'\t\t"* merge=ours" "text merge=sleep-one-second" &&\n'> <'\ttest_config merge.ours.driver true &&\n'> 
          <'\ttest_config merge.sleep-one-second.driver ./sleep-one-second.sh &&\n'> <'\tgit merge master\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)