(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'undoing resolution'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: check_resolve_undo
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:msg)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [23]
                )
              ]
              spids: [23]
            )
            (C {(shift)})
            (AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (While
                  cond: [
                    (Case
                      to_match: {($ VSub_Pound '$#')}
                      arms: [
                        (case_arm
                          pat_list: [{(0)}]
                          action: [(ControlFlow token:<ControlFlow_Break break>)]
                          spids: [39 40 44 16777215]
                        )
                        (case_arm
                          pat_list: [{(1)} {(2)} {(3)}]
                          action: [(C {(die)} {(DQ ('Bug in check-resolve-undo test'))})]
                          spids: [47 52 60 16777215]
                        )
                      ]
                      spids: [32 36 63]
                    )
                  ]
                  body: 
                    (DoGroup
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:path)
                              op: Equal
                              rhs: {($ VSub_Number '$1')}
                              spids: [69]
                            )
                          ]
                          spids: [69]
                        )
                        (C {(shift)})
                        (ForEach
                          iter_name: stage
                          iter_words: [{(1)} {(2)} {(3)}]
                          do_arg_iter: F
                          body: 
                            (DoGroup
                              children: [
                                (Assignment
                                  keyword: Assign_None
                                  pairs: [
                                    (assign_pair
                                      lhs: (LhsName name:sha1)
                                      op: Equal
                                      rhs: {($ VSub_Number '$1')}
                                      spids: [92]
                                    )
                                  ]
                                  spids: [92]
                                )
                                (C {(shift)})
                                (Case
                                  to_match: {(DQ ($ VSub_Name '$sha1'))}
                                  arms: [
                                    (case_arm
                                      pat_list: [{(SQ )}]
                                      action: [(ControlFlow token:<ControlFlow_Continue continue>)]
                                      spids: [16777215 110 114 16777215]
                                    )
                                  ]
                                  spids: [99 105 117]
                                )
                                (Assignment
                                  keyword: Assign_None
                                  pairs: [
                                    (assign_pair
                                      lhs: (LhsName name:sha1)
                                      op: Equal
                                      rhs: 
                                        {
                                          (CommandSubPart
                                            command_list: 
                                              (CommandList
                                                children: [
                                                  (C {(git)} {(rev-parse)} {(--verify)} 
                                                    {(DQ ($ VSub_Name '$sha1'))}
                                                  )
                                                ]
                                              )
                                            left_token: <Left_CommandSub '$('>
                                            spids: [121 131]
                                          )
                                        }
                                      spids: [120]
                                    )
                                  ]
                                  spids: [120]
                                )
                                (C {(printf)} 
                                  {
                                    (DQ ('100644 %s %s') (Lit_Other '\\') ('t%s') (Lit_Other '\\') (n))
                                  } {($ VSub_Name '$sha1')} {($ VSub_Name '$stage')} {($ VSub_Name '$path')}
                                )
                              ]
                              spids: [89 151]
                            )
                          spids: [81 16777215]
                        )
                      ]
                      spids: [66 154]
                    )
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_Name '$msg') (.expect))}
                      spids: [156]
                    )
                  ]
                )
                (SimpleCommand
                  words: [{(git)} {(ls-files)} {(--resolve-undo)}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_Name '$msg') (.actual))}
                      spids: [171]
                    )
                  ]
                )
                (C {(test_cmp)} {(DQ ($ VSub_Name '$msg') (.expect))} 
                  {(DQ ($ VSub_Name '$msg') (.actual))}
                )
              ]
            )
          ]
          spids: [20]
        )
      spids: [15 19]
    )
    (FuncDef
      name: prime_resolve_undo
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp]
              children: [
                (C {(git)} {(reset)} {(--hard)})
                (C {(git)} {(checkout)} {(second) (Lit_Other '^') (0)})
                (C {(test_tick)})
                (C {(test_must_fail)} {(git)} {(merge)} {(third) (Lit_Other '^') (0)})
                (C {(echo)} {(merge)} {(does)} {(not)} {(leave)} {(anything)})
                (C {(check_resolve_undo)} {(empty)})
                (SimpleCommand
                  words: [{(echo)} {(different)}]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(fi/le)} spids:[267])]
                )
                (C {(git)} {(add)} {(fi/le)})
                (C {(echo)} {(resolving)} {(records)})
                (C {(check_resolve_undo)} {(recorded)} {(fi/le)} {(initial) (Lit_Other ':') (fi/le)} 
                  {(second) (Lit_Other ':') (fi/le)} {(third) (Lit_Other ':') (fi/le)}
                )
              ]
            )
          ]
          spids: [200]
        )
      spids: [195 199]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\tmkdir fi &&\n'> <'\tprintf "a\\0a" >binary &&\n'> <'\tgit add binary &&\n'> 
          <'\ttest_commit initial fi/le first &&\n'> <'\tgit branch side &&\n'> <'\tgit branch another &&\n'> <'\tprintf "a\\0b" >binary &&\n'> 
          <'\tgit add binary &&\n'> <'\ttest_commit second fi/le second &&\n'> <'\tgit checkout side &&\n'> 
          <'\ttest_commit third fi/le third &&\n'> <'\tgit branch add-add &&\n'> <'\tgit checkout another &&\n'> 
          <'\ttest_commit fourth fi/le fourth &&\n'> <'\tgit checkout add-add &&\n'> <'\ttest_commit fifth add-differently &&\n'> 
          <'\tgit checkout master\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'add records switch clears'>)} 
      {
        (SQ <'\n'> <'\tprime_resolve_undo &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m merged &&\n'> 
          <'\techo committing keeps &&\n'> <'\tcheck_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&\n'> 
          <'\tgit checkout second^0 &&\n'> <'\techo switching clears &&\n'> <'\tcheck_resolve_undo cleared\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rm records reset clears'>)} 
      {
        (SQ <'\n'> <'\tprime_resolve_undo &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m merged &&\n'> 
          <'\techo committing keeps &&\n'> <'\tcheck_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&\n'> <'\n'> 
          <'\techo merge clears upfront &&\n'> <'\ttest_must_fail git merge fourth^0 &&\n'> <'\tcheck_resolve_undo nuked &&\n'> <'\n'> 
          <'\tgit rm -f fi/le &&\n'> <'\techo resolving records &&\n'> 
          <'\tcheck_resolve_undo recorded fi/le initial:fi/le HEAD:fi/le fourth:fi/le &&\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\techo resetting discards &&\n'> 
          <'\tcheck_resolve_undo discarded\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'plumbing clears'>)} 
      {
        (SQ <'\n'> <'\tprime_resolve_undo &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m merged &&\n'> 
          <'\techo committing keeps &&\n'> <'\tcheck_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&\n'> <'\n'> 
          <'\techo plumbing clear &&\n'> <'\tgit update-index --clear-resolve-undo &&\n'> <'\tcheck_resolve_undo cleared\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'add records checkout -m undoes'>)} 
      {
        (SQ <'\n'> <'\tprime_resolve_undo &&\n'> <'\tgit diff HEAD &&\n'> 
          <'\tgit checkout --conflict=merge fi/le &&\n'> <'\techo checkout used the record and removed it &&\n'> <'\tcheck_resolve_undo removed &&\n'> 
          <'\techo the index and the work tree is unmerged again &&\n'> <'\tgit diff >actual &&\n'> <'\tgrep "^++<<<<<<<" actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'unmerge with plumbing'>)} 
      {
        (SQ <'\n'> <'\tprime_resolve_undo &&\n'> <'\tgit update-index --unresolve fi/le &&\n'> 
          <'\tgit ls-files -u >actual &&\n'> <'\ttest_line_count = 3 actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rerere and rerere forget'>)} 
      {
        (SQ <'\n'> <'\tmkdir .git/rr-cache &&\n'> <'\tprime_resolve_undo &&\n'> 
          <'\techo record the resolution &&\n'> <'\tgit rerere &&\n'> <'\trerere_id=$(cd .git/rr-cache && echo */postimage) &&\n'> 
          <'\trerere_id=${rerere_id%/postimage} &&\n'> <'\ttest -f .git/rr-cache/$rerere_id/postimage &&\n'> <'\tgit checkout -m fi/le &&\n'> 
          <'\techo resurrect the conflict &&\n'> <'\tgrep "^=======" fi/le &&\n'> <'\techo reresolve the conflict &&\n'> <'\tgit rerere &&\n'> 
          <'\ttest "z$(cat fi/le)" = zdifferent &&\n'> <'\techo register the resolution again &&\n'> <'\tgit add fi/le &&\n'> 
          <'\tcheck_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&\n'> <'\ttest -z "$(git ls-files -u)" &&\n'> <'\tgit rerere forget fi/le &&\n'> 
          <'\t! test -f .git/rr-cache/$rerere_id/postimage &&\n'> <'\ttr "\\0" "\\n" <.git/MERGE_RR >actual &&\n'> <'\techo "$rerere_id\tfi/le" >expect &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rerere and rerere forget (subdirectory)'>)} 
      {
        (SQ <'\n'> <'\trm -fr .git/rr-cache &&\n'> <'\tmkdir .git/rr-cache &&\n'> 
          <'\tprime_resolve_undo &&\n'> <'\techo record the resolution &&\n'> <'\t(cd fi && git rerere) &&\n'> 
          <'\trerere_id=$(cd .git/rr-cache && echo */postimage) &&\n'> <'\trerere_id=${rerere_id%/postimage} &&\n'> <'\ttest -f .git/rr-cache/$rerere_id/postimage &&\n'> 
          <'\t(cd fi && git checkout -m le) &&\n'> <'\techo resurrect the conflict &&\n'> <'\tgrep "^=======" fi/le &&\n'> 
          <'\techo reresolve the conflict &&\n'> <'\t(cd fi && git rerere) &&\n'> <'\ttest "z$(cat fi/le)" = zdifferent &&\n'> 
          <'\techo register the resolution again &&\n'> <'\t(cd fi && git add le) &&\n'> 
          <'\tcheck_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&\n'> <'\ttest -z "$(git ls-files -u)" &&\n'> <'\t(cd fi && git rerere forget le) &&\n'> 
          <'\t! test -f .git/rr-cache/$rerere_id/postimage &&\n'> <'\ttr "\\0" "\\n" <.git/MERGE_RR >actual &&\n'> <'\techo "$rerere_id\tfi/le" >expect &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rerere forget (binary)'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -f side &&\n'> <'\tprintf "a\\0c" >binary &&\n'> 
          <'\tgit commit -a -m binary &&\n'> <'\ttest_must_fail git merge second &&\n'> <'\tgit rerere forget binary\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'rerere forget (add-add conflict)'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -f master &&\n'> <'\techo master >add-differently &&\n'> 
          <'\tgit add add-differently &&\n'> <'\tgit commit -m "add differently" &&\n'> <'\ttest_must_fail git merge fifth &&\n'> 
          <'\tgit rerere forget add-differently 2>actual &&\n'> <'\ttest_i18ngrep "no remembered" actual\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)