(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git checkout tests.\n'> <'\n'> 
                <'Creates master, forks renamer and side branches from it.\n'> <'Test switching across them.\n'> <'\n'> <'  ! [master] Initial A one, A two\n'> 
                <'   * [renamer] Renamer R one->uno, M two\n'> <'    ! [side] Side M one, D two, A three\n'> <'     ! [simple] Simple D one, M two\n'> <'  ----\n'> 
                <'     + [simple] Simple D one, M two\n'> <'    +  [side] Side M one, D two, A three\n'> <'   *   [renamer] Renamer R one->uno, M two\n'> 
                <'  +*++ [master] Initial A one, A two\n'> <'\n'>
              )
            }
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_tick>})
    (command.ShFunction
      name: fill
      body: 
        (BraceGroup
          children: [
            (command.ForEach
              iter_name: i
              do_arg_iter: T
              body: (command.DoGroup children:[(C {<echo>} {(DQ ($ Id.VSub_DollarName '$i'))})])
            )
          ]
        )
    )
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\n'> <'\tfill x y z > same &&\n'> <'\tfill 1 2 3 4 5 6 7 8 >one &&\n'> 
          <'\tfill a b c d e >two &&\n'> <'\tgit add same one two &&\n'> <'\tgit commit -m "Initial A one, A two" &&\n'> <'\n'> 
          <'\tgit checkout -b renamer &&\n'> <'\trm -f one &&\n'> <'\tfill 1 3 4 5 6 7 8 >uno &&\n'> <'\tgit add uno &&\n'> 
          <'\tfill a b c d e f >two &&\n'> <'\tgit commit -a -m "Renamer R one->uno, M two" &&\n'> <'\n'> <'\tgit checkout -b side master &&\n'> 
          <'\tfill 1 2 3 4 5 6 7 >one &&\n'> <'\tfill A B C D E >three &&\n'> <'\trm -f two &&\n'> 
          <'\tgit update-index --add --remove one two three &&\n'> <'\tgit commit -m "Side M one, D two, A three" &&\n'> <'\n'> <'\tgit checkout -b simple master &&\n'> 
          <'\trm -f one &&\n'> <'\tfill a c e > two &&\n'> <'\tgit commit -a -m "Simple D one, M two" &&\n'> <'\n'> 
          <'\tgit checkout master\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'checkout from non-existing branch'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -b delete-me master &&\n'> 
          <'\trm .git/refs/heads/delete-me &&\n'> <'\ttest refs/heads/delete-me = "$(git symbolic-ref HEAD)" &&\n'> <'\tgit checkout master &&\n'> 
          <'\ttest refs/heads/master = "$(git symbolic-ref HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'checkout with dirty tree without -m'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tfill 0 1 2 3 4 5 6 7 8 >one &&\n'> <'\tif git checkout side\n'> 
          <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\techo "happy - failed correctly"\n'> 
          <'\tfi\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'checkout with unrelated dirty tree without -m'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master &&\n'> <'\tfill 0 1 2 3 4 5 6 7 8 >same &&\n'> 
          <'\tcp same kept &&\n'> <'\tgit checkout side >messages &&\n'> <'\ttest_cmp same kept &&\n'> 
          <'\tprintf "M\\t%s\\n" same >messages.expect &&\n'> <'\ttest_cmp messages.expect messages\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'checkout -m with dirty tree'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master &&\n'> <'\tgit clean -f &&\n'> <'\n'> 
          <'\tfill 0 1 2 3 4 5 6 7 8 >one &&\n'> <'\tgit checkout -m side > messages &&\n'> <'\n'> 
          <'\ttest "$(git symbolic-ref HEAD)" = "refs/heads/side" &&\n'> <'\n'> <'\tprintf "M\\t%s\\n" one >expect.messages &&\n'> <'\ttest_cmp expect.messages messages &&\n'> 
          <'\n'> <'\tfill "M\tone" "A\tthree" "D\ttwo" >expect.master &&\n'> 
          <'\tgit diff --name-status master >current.master &&\n'> <'\ttest_cmp expect.master current.master &&\n'> <'\n'> <'\tfill "M\tone" >expect.side &&\n'> 
          <'\tgit diff --name-status side >current.side &&\n'> <'\ttest_cmp expect.side current.side &&\n'> <'\n'> <'\t: >expect.index &&\n'> 
          <'\tgit diff --cached >current.index &&\n'> <'\ttest_cmp expect.index current.index\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'checkout -m with dirty tree, renamed'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> 
          <'\tfill 1 2 3 4 5 7 8 >one &&\n'> <'\tif git checkout renamer\n'> <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> 
          <'\t\techo "happy - failed correctly"\n'> <'\tfi &&\n'> <'\n'> <'\tgit checkout -m renamer &&\n'> <'\tfill 1 3 4 5 7 8 >expect &&\n'> 
          <'\ttest_cmp expect uno &&\n'> <'\t! test -f one &&\n'> <'\tgit diff --cached >current &&\n'> <'\t! test -s current\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout -m with merge conflict'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> 
          <'\tfill 1 T 3 4 5 6 S 8 >one &&\n'> <'\tif git checkout renamer\n'> <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> 
          <'\t\techo "happy - failed correctly"\n'> <'\tfi &&\n'> <'\n'> <'\tgit checkout -m renamer &&\n'> <'\n'> <'\tgit diff master:one :3:uno |\n'> 
          <'\tsed -e "1,/^@@/d" -e "/^ /d" -e "s/^-/d/" -e "s/^+/a/" >current &&\n'> <'\tfill d2 aT d7 aS >expect &&\n'> <'\ttest_cmp current expect &&\n'> 
          <'\tgit diff --cached two >current &&\n'> <'\t! test -s current\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'format of merge conflict from checkout -m'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> 
          <'\tfill b d > two &&\n'> <'\tgit checkout -m simple &&\n'> <'\n'> <'\tgit ls-files >current &&\n'> 
          <'\tfill same two two two >expect &&\n'> <'\ttest_cmp current expect &&\n'> <'\n'> <'\tcat <<-EOF >expect &&\n'> <'\t<<<<<<< simple\n'> <'\ta\n'> 
          <'\tc\n'> <'\te\n'> <'\t=======\n'> <'\tb\n'> <'\td\n'> <'\t>>>>>>> local\n'> <'\tEOF\n'> <'\ttest_cmp two expect\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout --merge --conflict=diff3 <branch>'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git reset --hard && git clean -f &&\n'> <'\n'> 
          <'\tfill b d > two &&\n'> <'\tgit checkout --merge --conflict=diff3 simple &&\n'> <'\n'> <'\tcat <<-EOF >expect &&\n'> 
          <'\t<<<<<<< simple\n'> <'\ta\n'> <'\tc\n'> <'\te\n'> <'\t||||||| master\n'> <'\ta\n'> <'\tb\n'> <'\tc\n'> <'\td\n'> <'\te\n'> 
          <'\t=======\n'> <'\tb\n'> <'\td\n'> <'\t>>>>>>> local\n'> <'\tEOF\n'> <'\ttest_cmp two expect\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'switch to another branch while carrying a deletion'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git reset --hard && git clean -f &&\n'> 
          <'\tgit rm two &&\n'> <'\n'> <'\ttest_must_fail git checkout simple 2>errs &&\n'> <'\ttest_i18ngrep overwritten errs &&\n'> 
          <'\n'> <'\tgit checkout --merge simple 2>errs &&\n'> <'\ttest_i18ngrep ! overwritten errs &&\n'> 
          <'\tgit ls-files -u &&\n'> <'\ttest_must_fail git cat-file -t :0:two &&\n'> <'\ttest "$(git cat-file -t :1:two)" = blob &&\n'> 
          <'\ttest "$(git cat-file -t :2:two)" = blob &&\n'> <'\ttest_must_fail git cat-file -t :3:two\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout to detach HEAD (with advice declined)'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit config advice.detachedHead false &&\n'> 
          <'\tgit checkout -f renamer && git clean -f &&\n'> <'\tgit checkout renamer^ 2>messages &&\n'> <'\ttest_i18ngrep "HEAD is now at 7329388" messages &&\n'> 
          <'\ttest_line_count = 1 messages &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> 
          <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> 
          <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout to detach HEAD'>)} 
      {
        (SQ <'\n'> <'\tgit config advice.detachedHead true &&\n'> 
          <'\tgit checkout -f renamer && git clean -f &&\n'> <'\tgit checkout renamer^ 2>messages &&\n'> <'\ttest_i18ngrep "HEAD is now at 7329388" messages &&\n'> 
          <'\t(test_line_count -gt 1 messages || test -n "$GETTEXT_POISON") &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> 
          <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> 
          <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with branchname^'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> 
          <'\tgit checkout renamer^ &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> 
          <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> 
          <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with :/message'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> 
          <'\tgit checkout ":/Initial" &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> 
          <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> 
          <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with HEAD^0'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> 
          <'\tgit checkout HEAD^0 &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> 
          <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> 
          <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with ambiguous tag/branch names'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit tag both side &&\n'> <'\tgit branch both master &&\n'> 
          <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> <'\tgit checkout both &&\n'> 
          <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> 
          <'\tname=$(git symbolic-ref HEAD 2>/dev/null) &&\n'> <'\ttest "z$name" = zrefs/heads/both\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with ambiguous tag/branch names'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> 
          <'\tgit tag frotz side &&\n'> <'\tgit branch frotz master &&\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> 
          <'\tgit checkout tags/frotz &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tS=$(git show-ref -s --verify refs/heads/side) &&\n'> 
          <'\ttest "z$H" = "z$S" &&\n'> <'\tif name=$(git symbolic-ref HEAD 2>/dev/null)\n'> <'\tthen\n'> 
          <'\t\techo "Bad -- should have detached"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'switch branches while in subdirectory'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> 
          <'\tmkdir subs &&\n'> <'\t(\n'> <'\t\tcd subs &&\n'> <'\t\tgit checkout side\n'> <'\t) &&\n'> <'\t! test -f subs/one &&\n'> 
          <'\trm -fr subs\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout specific path while in subdirectory'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout side &&\n'> <'\tmkdir subs &&\n'> 
          <'\t>subs/bero &&\n'> <'\tgit add subs/bero &&\n'> <'\tgit commit -m "add subs/bero" &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\tmkdir -p subs &&\n'> <'\t(\n'> <'\t\tcd subs &&\n'> <'\t\tgit checkout side -- bero\n'> <'\t) &&\n'> 
          <'\ttest -f subs/bero\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout w/--track sets up tracking'>)} 
      {
        (SQ <'\n'> <'    git config branch.autosetupmerge false &&\n'> <'    git checkout master &&\n'> 
          <'    git checkout --track -b track1 &&\n'> <'    test "$(git config branch.track1.remote)" &&\n'> 
          <'    test "$(git config branch.track1.merge)"'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout w/autosetupmerge=always sets up tracking'>)} 
      {
        (SQ <'\n'> <'    test_when_finished git config branch.autosetupmerge false &&\n'> 
          <'    git config branch.autosetupmerge always &&\n'> <'    git checkout master &&\n'> <'    git checkout -b track2 &&\n'> 
          <'    test "$(git config branch.track2.remote)" &&\n'> <'    test "$(git config branch.track2.merge)"'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout w/--track from non-branch HEAD fails'>)} 
      {
        (SQ <'\n'> <'    git checkout master^0 &&\n'> <'    test_must_fail git symbolic-ref HEAD &&\n'> 
          <'    test_must_fail git checkout --track -b track &&\n'> <'    test_must_fail git rev-parse --verify track &&\n'> 
          <'    test_must_fail git symbolic-ref HEAD &&\n'> <'    test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout w/--track from tag fails'>)} 
      {
        (SQ <'\n'> <'    git checkout master^0 &&\n'> <'    test_must_fail git symbolic-ref HEAD &&\n'> 
          <'    test_must_fail git checkout --track -b track frotz &&\n'> <'    test_must_fail git rev-parse --verify track &&\n'> 
          <'    test_must_fail git symbolic-ref HEAD &&\n'> <'    test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'detach a symbolic link HEAD'>)} 
      {
        (SQ <'\n'> <'    git checkout master &&\n'> 
          <'    git config --bool core.prefersymlinkrefs yes &&\n'> <'    git checkout side &&\n'> <'    git checkout master &&\n'> 
          <'    it=$(git symbolic-ref HEAD) &&\n'> <'    test "z$it" = zrefs/heads/master &&\n'> 
          <'    here=$(git rev-parse --verify refs/heads/master) &&\n'> <'    git checkout side^ &&\n'> 
          <'    test "z$(git rev-parse --verify refs/heads/master)" = "z$here"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with --track fakes a sensible -b <name>'>)} 
      {
        (SQ <'\n'> <'    git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" &&\n'> 
          <'    git update-ref refs/remotes/origin/koala/bear renamer &&\n'> <'\n'> <'    git checkout --track origin/koala/bear &&\n'> 
          <'    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&\n'> <'\n'> 
          <'    git checkout master && git branch -D koala/bear &&\n'> <'\n'> <'    git checkout --track refs/remotes/origin/koala/bear &&\n'> 
          <'    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&\n'> <'\n'> 
          <'    git checkout master && git branch -D koala/bear &&\n'> <'\n'> <'    git checkout --track remotes/origin/koala/bear &&\n'> 
          <'    test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <'    test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)"\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'checkout with --track, but without -b, fails with too short tracked name'>)} {(SQ <'\n'> <'    test_must_fail git checkout --track renamer'>)}
    )
    (command.ShFunction
      name: setup_conflicting_index
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<rm>} {<-f>} {<'.git/index'>})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:O)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {<original>})
                                  (C {<git>} {<hash-object>} {<-w>} {<--stdin>})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [733]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:A)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {<ourside>})
                                  (C {<git>} {<hash-object>} {<-w>} {<--stdin>})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [753]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:B)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {<theirside>})
                                  (C {<git>} {<hash-object>} {<-w>} {<--stdin>})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [773]
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (command.Subshell
                      child: 
                        (command.AndOr
                          ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                          children: [
                            (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 0\tfild'>)})
                            (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$O') <' 1\tfile'>)})
                            (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 2\tfile'>)})
                            (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$B') <' 3\tfile'>)})
                            (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 0\tfilf'>)})
                          ]
                        )
                    )
                    (C {<git>} {<update-index>} {<--index-info>})
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'checkout an unmerged path should fail'>)} 
      {
        (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> 
          <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> 
          <'\ttest_must_fail git checkout fild file filf &&\n'> <'\ttest_cmp sample fild &&\n'> <'\ttest_cmp sample filf &&\n'> <'\ttest_cmp sample file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with an unmerged path can be ignored'>)} 
      {
        (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> 
          <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> 
          <'\tgit checkout -f fild file filf &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp sample file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout unmerged stage'>)} 
      {
        (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> 
          <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> 
          <'\tgit checkout --ours . &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp expect file &&\n'> 
          <'\tgit checkout --theirs file &&\n'> <'\ttest ztheirside = "z$(cat file)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with --merge'>)} 
      {
        (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> 
          <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> 
          <'\tgit checkout -m -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> <'\t\techo ourside\n'> <'\t\techo "======="\n'> 
          <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> 
          <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with --merge, in diff3 -m style'>)} 
      {
        (SQ <'\n'> <'\tgit config merge.conflictstyle diff3 &&\n'> <'\tsetup_conflicting_index &&\n'> 
          <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> 
          <'\tcat sample >filf &&\n'> <'\tgit checkout -m -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> 
          <'\t\techo ourside\n'> <'\t\techo "||||||| base"\n'> <'\t\techo original\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> 
          <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> 
          <'\ttest_cmp merged file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout --conflict=merge, overriding config'>)} 
      {
        (SQ <'\n'> <'\tgit config merge.conflictstyle diff3 &&\n'> <'\tsetup_conflicting_index &&\n'> 
          <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> 
          <'\tcat sample >filf &&\n'> <'\tgit checkout --conflict=merge -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> 
          <'\t\techo ourside\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> 
          <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout --conflict=diff3'>)} 
      {
        (SQ <'\n'> <'\ttest_unconfig merge.conflictstyle &&\n'> <'\tsetup_conflicting_index &&\n'> 
          <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> 
          <'\tcat sample >filf &&\n'> <'\tgit checkout --conflict=diff3 -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> 
          <'\t\techo ourside\n'> <'\t\techo "||||||| base"\n'> <'\t\techo original\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> 
          <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> 
          <'\ttest_cmp merged file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'failing checkout -b should not break working tree'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard master &&\n'> 
          <'\tgit symbolic-ref HEAD refs/heads/master &&\n'> <'\ttest_must_fail git checkout -b renamer side^ &&\n'> 
          <'\ttest $(git symbolic-ref HEAD) = refs/heads/master &&\n'> <'\tgit diff --exit-code &&\n'> <'\tgit diff --cached --exit-code\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'switch out of non-branch'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard master &&\n'> <'\tgit checkout master^0 &&\n'> 
          <'\techo modified >one &&\n'> <'\ttest_must_fail git checkout renamer 2>error.log &&\n'> <'\t! grep "^Previous HEAD" error.log\n'>
        )
      }
    )
    (command.Subshell
      child: 
        (command.CommandList
          children: [
            (C {<echo>} {(DQ <'#!'> ($ Id.VSub_DollarName '$SHELL_PATH'))})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                      here_end_span_id: 1108
                      stdin_parts: [
                        <'O=$1 A=$2 B=$3\n'>
                        <'cat "$A" >.tmp\n'>
                        <'exec >"$A"\n'>
                        <'echo \'<<<<<<< filfre-theirs\'\n'>
                        <'cat "$B"\n'>
                        <'echo \'||||||| filfre-common\'\n'>
                        <'cat "$O"\n'>
                        <'echo \'=======\'\n'>
                        <'cat ".tmp"\n'>
                        <'echo \'>>>>>>> filfre-ours\'\n'>
                        <'rm -f .tmp\n'>
                        <'exit 1\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<filfre.sh>})]
    )
    (C {<chmod>} {<Id.Lit_Other '+'> <x>} {<filfre.sh>})
    (C {<test_expect_success>} {(SQ <'custom merge driver with checkout -m'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\n'> 
          <'\tgit config merge.filfre.driver "./filfre.sh %O %A %B" &&\n'> <'\tgit config merge.filfre.name "Feel-free merge driver" &&\n'> 
          <'\tgit config merge.filfre.recursive binary &&\n'> <'\techo "arm merge=filfre" >.gitattributes &&\n'> <'\n'> <'\tgit checkout -b left &&\n'> 
          <'\techo neutral >arm &&\n'> <'\tgit add arm .gitattributes &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m neutral &&\n'> 
          <'\tgit branch right &&\n'> <'\n'> <'\techo left >arm &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -a -m left &&\n'> 
          <'\tgit checkout right &&\n'> <'\n'> <'\techo right >arm &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -a -m right &&\n'> <'\n'> 
          <'\ttest_must_fail git merge left &&\n'> <'\t(\n'> <'\t\tfor t in filfre-common left right\n'> <'\t\tdo\n'> <'\t\t\tgrep $t arm || exit 1\n'> 
          <'\t\tdone\n'> <'\t\texit 0\n'> <'\t) &&\n'> <'\n'> <'\tmv arm expect &&\n'> <'\tgit checkout -m arm &&\n'> 
          <'\ttest_cmp expect arm\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)