(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:'GIT_EDITOR, core.editor, and stuff' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(unset)} {(EDITOR)} {(VISUAL)} {(GIT_EDITOR)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'determine default editor' span_id:27))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:31) (Token id:Id.Lit_Chars val:'\n' span_id:32) 
          (Token
            id: Id.Lit_Chars
            val: '\tvi=$(TERM=vt100 git var GIT_EDITOR) &&\n'
            span_id: 33
          ) (Token id:Id.Lit_Chars val:'\ttest -n "$vi"\n' span_id:34) (Token id:Id.Lit_Chars val:'\n' span_id:35)
        )
      }
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Pipeline
              children: [
                (command.Simple
                  words: [
                    {(expr)}
                    {(DQ ($ Id.VSub_DollarName '$vi'))}
                    {(Id.Lit_Other ':')}
                    {(SQ (Token id:Id.Lit_Chars val:'[a-z]*$' span_id:52))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:55)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
              ]
              negated: T
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:vi)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [61]
                )
              ]
            )
          ]
          spids: [39 58]
        )
      ]
    )
    (command.ForEach
      iter_name: i
      iter_words: [{(GIT_EDITOR)} {(core_editor)} {(EDITOR)} {(VISUAL)} {($ Id.VSub_DollarName '$vi')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:87)
                  fd: -1
                  arg_word: {(e-) ($ Id.VSub_DollarName '$i') (.sh)}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:92)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 110
                  stdin_parts: [
                    ('#!')
                    ($ Id.VSub_DollarName '$SHELL_PATH')
                    ('\n')
                    ('echo ')
                    (Id.Right_DoubleQuote '"')
                    ('Edited by ')
                    ($ Id.VSub_DollarName '$i')
                    (Id.Right_DoubleQuote '"')
                    (' >')
                    (Id.Right_DoubleQuote '"')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:105)
                    )
                    (1)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                  ]
                )
              ]
            )
            (C {(chmod)} {(Id.Lit_Other '+') (x)} {(e-) ($ Id.VSub_DollarName '$i') (.sh)})
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Pipeline
              children: [(C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$vi'))})]
              negated: T
            )
          ]
          action: [(C {(mv)} {(e-) ($ Id.VSub_DollarName '$vi') (.sh)} {($ Id.VSub_DollarName '$vi')})]
          spids: [124 136]
        )
      ]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:155) (Token id:Id.Lit_Chars val:'\n' span_id:156) 
          (Token id:Id.Lit_Chars val:'\tmsg="Hand-edited" &&\n' span_id:157) (Token id:Id.Lit_Chars val:'\ttest_commit "$msg" &&\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\techo "$msg" >expect &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit show -s --format=%s > actual &&\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp actual expect\n' span_id:161) (Token id:Id.Lit_Chars val:'\n' span_id:162)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TERM)
          op: assign_op.Equal
          rhs: {(dumb)}
          spids: [166]
        )
      ]
    )
    (C {(export)} {(TERM)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'dumb should error out when falling back on vi' span_id:176))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:180) (Token id:Id.Lit_Chars val:'\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\tif git commit --amend\n' span_id:182) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\t\techo "Oops?"\n' span_id:184) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\telse\n' span_id:186) (Token id:Id.Lit_Chars val:'\t\t: happy\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\tfi\n' span_id:188)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'dumb should prefer EDITOR to VISUAL' span_id:195))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) (Token id:Id.Lit_Chars val:'\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tEDITOR=./e-EDITOR.sh &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\tVISUAL=./e-VISUAL.sh &&\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\texport EDITOR VISUAL &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\tgit commit --amend &&\n' span_id:204) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git show -s --format=%s)" = "Edited by EDITOR"\n'
            span_id: 205
          ) (Token id:Id.Lit_Chars val:'\n' span_id:206)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TERM)
          op: assign_op.Equal
          rhs: {(vt100)}
          spids: [210]
        )
      ]
    )
    (C {(export)} {(TERM)})
    (command.ForEach
      iter_name: i
      iter_words: [{($ Id.VSub_DollarName '$vi')} {(EDITOR)} {(VISUAL)} {(core_editor)} {(GIT_EDITOR)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ('Edited by ') ($ Id.VSub_DollarName '$i'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:243)
                  fd: -1
                  arg_word: {(expect)}
                )
              ]
            )
            (C {(unset)} {(EDITOR)} {(VISUAL)} {(GIT_EDITOR)})
            (C {(git)} {(config)} {(--unset-all)} {(core.editor)})
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$i'))}
              arms: [
                (case_arm
                  pat_list: [{(core_editor)}]
                  action: [(C {(git)} {(config)} {(core.editor)} {(./e-core_editor.sh)})]
                  spids: [274 275 287 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_LBracket '[') (A-Z) (Id.Lit_RBracket ']') (Id.Lit_Star '*')}]
                  action: [
                    (C {(eval)} 
                      {(DQ ($ Id.VSub_DollarName '$i') ('=./e-') ($ Id.VSub_DollarName '$i') (.sh))}
                    )
                    (C {(export)} {($ Id.VSub_DollarName '$i')})
                  ]
                  spids: [290 294 312 -1]
                )
              ]
            )
            (C {(test_expect_success)} {(DQ ('Using ') ($ Id.VSub_DollarName '$i'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:326) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --exec-path=. commit --amend &&\n'
                    span_id: 327
                  ) (Token id:Id.Lit_Chars val:'\t\tgit show -s --pretty=oneline |\n' span_id:328) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tsed -e "s/^[0-9a-f]* //" >actual &&\n'
                    span_id: 329
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp actual expect\n' span_id:330) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:331)
                )
              }
            )
          ]
        )
    )
    (C {(unset)} {(EDITOR)} {(VISUAL)} {(GIT_EDITOR)})
    (C {(git)} {(config)} {(--unset-all)} {(core.editor)})
    (command.ForEach
      iter_name: i
      iter_words: [{($ Id.VSub_DollarName '$vi')} {(EDITOR)} {(VISUAL)} {(core_editor)} {(GIT_EDITOR)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ('Edited by ') ($ Id.VSub_DollarName '$i'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:379)
                  fd: -1
                  arg_word: {(expect)}
                )
              ]
            )
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$i'))}
              arms: [
                (case_arm
                  pat_list: [{(core_editor)}]
                  action: [(C {(git)} {(config)} {(core.editor)} {(./e-core_editor.sh)})]
                  spids: [392 393 405 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_LBracket '[') (A-Z) (Id.Lit_RBracket ']') (Id.Lit_Star '*')}]
                  action: [
                    (C {(eval)} 
                      {(DQ ($ Id.VSub_DollarName '$i') ('=./e-') ($ Id.VSub_DollarName '$i') (.sh))}
                    )
                    (C {(export)} {($ Id.VSub_DollarName '$i')})
                  ]
                  spids: [408 412 430 -1]
                )
              ]
            )
            (C {(test_expect_success)} {(DQ ('Using ') ($ Id.VSub_DollarName '$i') (' (override)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:445) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tgit --exec-path=. commit --amend &&\n'
                    span_id: 446
                  ) (Token id:Id.Lit_Chars val:'\t\tgit show -s --pretty=oneline |\n' span_id:447) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tsed -e "s/^[0-9a-f]* //" >actual &&\n'
                    span_id: 448
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp actual expect\n' span_id:449) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:450)
                )
              }
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Simple
              words: [{(echo)} {(SQ (Token id:Id.Lit_Chars val:'echo space > "$1"' span_id:461))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:464)
                  fd: -1
                  arg_word: {(DQ ('e space.sh'))}
                )
              ]
            )
          ]
          action: [(C {(test_set_prereq)} {(SPACES_IN_FILENAMES)})]
          spids: [456 470]
        )
      ]
    )
    (C {(test_expect_success)} {(SPACES_IN_FILENAMES)} 
      {(SQ (Token id:Id.Lit_Chars val:'editor with a space' span_id:489))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:493) (Token id:Id.Lit_Chars val:'\n' span_id:494) 
          (Token id:Id.Lit_Chars val:'\tchmod a+x "e space.sh" &&\n' span_id:495) (Token id:Id.Lit_Chars val:'\tGIT_EDITOR="./e\\ space.sh" git commit --amend &&\n' span_id:496) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest space = "$(git show -s --pretty=format:%s)"\n'
            span_id: 497
          ) (Token id:Id.Lit_Chars val:'\n' span_id:498)
        )
      }
    )
    (C {(unset)} {(GIT_EDITOR)})
    (C {(test_expect_success)} {(SPACES_IN_FILENAMES)} 
      {(SQ (Token id:Id.Lit_Chars val:'core.editor with a space' span_id:511))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:515) (Token id:Id.Lit_Chars val:'\n' span_id:516) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.editor \\"./e\\ space.sh\\" &&\n'
            span_id: 517
          ) (Token id:Id.Lit_Chars val:'\tgit commit --amend &&\n' span_id:518) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest space = "$(git show -s --pretty=format:%s)"\n'
            span_id: 519
          ) (Token id:Id.Lit_Chars val:'\n' span_id:520)
        )
      }
    )
    (C {(test_done)})
  ]
)