(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ 
                (Token
                  id: Id.Lit_Chars
                  val: 'per path merge controlled by merge attribute'
                  span_id: 15
                )
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:29) (Token id:Id.Lit_Chars val:'\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:31) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:32) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Initial >$f && git add $f || return 1\n'
            span_id: 33
          ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tgit commit -m Initial &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit branch side &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:39) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:40) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Master >>$f && git add $f || return 1\n'
            span_id: 41
          ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tgit commit -m Master &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\n' span_id:45) (Token id:Id.Lit_Chars val:'\tgit checkout side &&\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:47) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:48) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Side >>$f && git add $f || return 1\n'
            span_id: 49
          ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:51) (Token id:Id.Lit_Chars val:'\tgit commit -m Side &&\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\n' span_id:53) (Token id:Id.Lit_Chars val:'\tgit tag anchor\n' span_id:54)
        )
      }
    )
    (C {(test_expect_success)} {(merge)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:63) (Token id:Id.Lit_Chars val:'\n' span_id:64) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:65) (Token id:Id.Lit_Chars val:'\t\techo "binary -merge"\n' span_id:66) 
          (Token id:Id.Lit_Chars val:'\t\techo "union merge=union"\n' span_id:67) (Token id:Id.Lit_Chars val:'\t} >.gitattributes &&\n' span_id:68) 
          (Token id:Id.Lit_Chars val:'\n' span_id:69) (Token id:Id.Lit_Chars val:'\tif git merge master\n' span_id:70) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:71) (Token id:Id.Lit_Chars val:'\t\techo Gaah, should have conflicted\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:73) (Token id:Id.Lit_Chars val:'\telse\n' span_id:74) 
          (Token id:Id.Lit_Chars val:'\t\techo Ok, conflicted.\n' span_id:75) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:76)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check merge result in index' span_id:83))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) (Token id:Id.Lit_Chars val:'\n' span_id:88) 
          (Token id:Id.Lit_Chars val:'\tgit ls-files -u | grep binary &&\n' span_id:89) (Token id:Id.Lit_Chars val:'\tgit ls-files -u | grep text &&\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\t! (git ls-files -u | grep union)\n' span_id:91) (Token id:Id.Lit_Chars val:'\n' span_id:92)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check merge result in working tree' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\n' span_id:104) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD:binary >binary-orig &&\n'
            span_id: 105
          ) (Token id:Id.Lit_Chars val:'\tgrep "<<<<<<<" text &&\n' span_id:106) 
          (Token id:Id.Lit_Chars val:'\tcmp binary-orig binary &&\n' span_id:107) (Token id:Id.Lit_Chars val:'\t! grep "<<<<<<<" union &&\n' span_id:108) 
          (Token id:Id.Lit_Chars val:'\tgrep Master union &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\tgrep Side union\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\n' span_id:111)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'retry the merge with longer context' span_id:118))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) 
          (Token
            id: Id.Lit_Chars
            val: '\techo text conflict-marker-size=32 >>.gitattributes &&\n'
            span_id: 123
          ) (Token id:Id.Lit_Chars val:'\tgit checkout -m text &&\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\tsed -ne "/^\\([<=>]\\)\\1\\1\\1*/{\n' span_id:125) (Token id:Id.Lit_Chars val:'\t\ts/ .*$//\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\t\tp\n' span_id:127) (Token id:Id.Lit_Chars val:'\t}" >actual text &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\tgrep "================================" actual &&\n' span_id:130) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual\n'
            span_id: 131
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:137)
          fd: -1
          arg_word: {(./custom-merge)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:140)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:141)) 
              (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 (Token id:Id.Lit_Chars val:'custom merge backend' span_id:174))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* merge=union" >.gitattributes &&\n'
            span_id: 180
          ) (Token id:Id.Lit_Chars val:'\techo "text merge=custom" >>.gitattributes &&\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\n' span_id:182) (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:184) (Token id:Id.Lit_Chars val:'\tmerge.custom.driver "./custom-merge %O %A %B 0 %P" &&\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:186) (Token id:Id.Lit_Chars val:'\tmerge.custom.name "custom merge driver for testing" &&\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\n' span_id:188) (Token id:Id.Lit_Chars val:'\tgit merge master &&\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\n' span_id:190) (Token id:Id.Lit_Chars val:'\tcmp binary union &&\n' span_id:191) 
          (Token id:Id.Lit_Chars val:'\tsed -e 1,3d text >check-1 &&\n' span_id:192) (Token id:Id.Lit_Chars val:'\to=$(git unpack-file master^:text) &&\n' span_id:193) 
          (Token id:Id.Lit_Chars val:'\ta=$(git unpack-file side^:text) &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\tb=$(git unpack-file master:text) &&\n' span_id:195) 
          (Token id:Id.Lit_Chars val:'\tsh -c "./custom-merge $o $a $b 0 ' span_id:196)
        ) (text) 
        (SQ (Token id:Id.Lit_Chars val:'" &&\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tsed -e 1,3d $a >check-2 &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\tcmp check-1 check-2 &&\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\trm -f $o $a $b\n' span_id:203)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'custom merge backend' span_id:210))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:214) (Token id:Id.Lit_Chars val:'\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:217) 
          (Token
            id: Id.Lit_Chars
            val: '\tmerge.custom.driver "./custom-merge %O %A %B 1 %P" &&\n'
            span_id: 218
          ) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:219) 
          (Token
            id: Id.Lit_Chars
            val: '\tmerge.custom.name "custom merge driver for testing" &&\n'
            span_id: 220
          ) (Token id:Id.Lit_Chars val:'\n' span_id:221) 
          (Token id:Id.Lit_Chars val:'\tif git merge master\n' span_id:222) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\t\techo "Eh? should have conflicted"\n' span_id:224) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\telse\n' span_id:226) (Token id:Id.Lit_Chars val:'\t\techo "Ok, conflicted"\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\tcmp binary union &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d text >check-1 &&\n' span_id:231) 
          (Token
            id: Id.Lit_Chars
            val: '\to=$(git unpack-file master^:text) &&\n'
            span_id: 232
          ) (Token id:Id.Lit_Chars val:'\ta=$(git unpack-file anchor:text) &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\tb=$(git unpack-file master:text) &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\tsh -c "./custom-merge $o $a $b 0 ' span_id:235)
        ) (text) 
        (SQ (Token id:Id.Lit_Chars val:'" &&\n' span_id:239) 
          (Token id:Id.Lit_Chars val:'\tsed -e 1,3d $a >check-2 &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\tcmp check-1 check-2 &&\n' span_id:241) 
          (Token id:Id.Lit_Chars val:'\tsed -e 1,3d -e 4q $a >check-3 &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\techo "path is text" >expect &&\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\tcmp expect check-3 &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\trm -f $o $a $b\n' span_id:245)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'up-to-date merge without common ancestor' span_id:252))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo repo1 &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\ttest_create_repo repo2 &&\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\t(\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\t\tcd repo1 &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\t\t>a &&\n' span_id:262) 
          (Token id:Id.Lit_Chars val:'\t\tgit add a &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\t\tgit commit -m initial\n' span_id:264) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:267) (Token id:Id.Lit_Chars val:'\t\tcd repo2 &&\n' span_id:268) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit --allow-empty -m initial\n'
            span_id: 269
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:270) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\t(\n' span_id:272) 
          (Token id:Id.Lit_Chars val:'\t\tcd repo1 &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\t\tgit fetch ../repo2 master &&\n' span_id:274) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit merge --allow-unrelated-histories FETCH_HEAD\n'
            span_id: 275
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:276)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'custom merge does not lock index' span_id:283))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\twrite_script sleep-one-second.sh <<-\\EOF &&\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'\t\tsleep 1 &\n' span_id:290) (Token id:Id.Lit_Chars val:'\t\techo $! >sleep.pid\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:292) (Token id:Id.Lit_Chars val:'\ttest_when_finished "kill \\$(cat sleep.pid)" &&\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\n' span_id:294) (Token id:Id.Lit_Chars val:'\ttest_write_lines >.gitattributes \\\n' span_id:295) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t"* merge=ours" "text merge=sleep-one-second" &&\n'
            span_id: 296
          ) (Token id:Id.Lit_Chars val:'\ttest_config merge.ours.driver true &&\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config merge.sleep-one-second.driver ./sleep-one-second.sh &&\n'
            span_id: 298
          ) (Token id:Id.Lit_Chars val:'\tgit merge master\n' span_id:299)
        )
      }
    )
    (C {(test_done)})
  ]
)