(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 commit porcelain-ish' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: commit_msg_is
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expect)
                  op: assign_op.Equal
                  rhs: {(commit_msg_is.expect)}
                  spids: [23]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:actual)
                  op: assign_op.Equal
                  rhs: {(commit_msg_is.actual)}
                  spids: [27]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(printf)}
                    {(DQ ('%s'))}
                    {
                      (DQ 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:39)
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {(git)} {(log)} 
                                  {(--pretty) (Id.Lit_Equals '=') (format) (Id.Lit_Other ':') 
                                    (Id.Lit_Other '%') (s) (Id.Lit_Other '%') (b)
                                  } {(-1)}
                                )
                              ]
                            )
                        )
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:57)
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$actual')}
                    )
                  ]
                )
                (command.Simple
                  words: [{(printf)} {(DQ ('%s'))} {(DQ ($ Id.VSub_Number '$1'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:73)
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$expect')}
                    )
                  ]
                )
                (C {(test_i18ncmp)} {($ Id.VSub_DollarName '$expect')} 
                  {($ Id.VSub_DollarName '$actual')}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_summary_oneline
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(test_tick)})
                (command.Pipeline
                  children: [
                    (C {(git)} {(commit)} 
                      {
                        (braced_var_sub
                          token: (Token id:Id.VSub_Number val:3 span_id:108)
                          suffix_op: 
                            (suffix_op.Unary
                              op_id: Id.VTest_Plus
                              arg_word: {(DQ ($ Id.VSub_Number '$3'))}
                            )
                        )
                      } {(-m)} {(DQ ($ Id.VSub_Number '$2'))}
                    )
                    (command.Simple
                      words: [{(head)} {(-1)}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:127)
                          fd: -1
                          arg_word: {(act)}
                        )
                      ]
                    )
                  ]
                  negated: F
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:SUMMARY_PREFIX)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:141)
                              command_list: 
                                (command.CommandList
                                  children: [(C {(git)} {(name-rev)} {(--name-only)} {(HEAD)})]
                                )
                            )
                          )
                        }
                      spids: [139]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [(C {(test)} {(-n)} {(DQ ($ Id.VSub_Number '$1'))})]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:SUMMARY_PREFIX)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ ($ Id.VSub_DollarName '$SUMMARY_PREFIX') (' (') 
                                    ($ Id.VSub_Number '$1') (')')
                                  )
                                }
                              spids: [174]
                            )
                          ]
                        )
                      ]
                      spids: [160 171]
                    )
                  ]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:SUMMARY_POSTFIX)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:193)
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {(git)} {(log)} {(-1)} 
                                  {(--pretty) (Id.Lit_Equals '=') 
                                    (SQ (Token id:Id.Lit_Chars val:'format:%h' span_id:203))
                                  }
                                )
                              ]
                            )
                        )
                      )
                    }
                  spids: [191]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(echo)}
                    {
                      (DQ ('[') ($ Id.VSub_DollarName '$SUMMARY_PREFIX') (' ') 
                        ($ Id.VSub_DollarName '$SUMMARY_POSTFIX') ('] ') ($ Id.VSub_Number '$2')
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:220)
                      fd: -1
                      arg_word: {(exp)}
                    )
                  ]
                )
                (C {(test_i18ncmp)} {(exp)} {(act)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'output summary format' span_id:239))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:243) (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\techo new >file1 &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\tgit add file1 &&\n' span_id:246) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_summary_oneline "root-commit" "initial" &&\n'
            span_id: 247
          ) (Token id:Id.Lit_Chars val:'\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\techo change >>file1 &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\tgit add file1\n' span_id:250)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'output summary format: root-commit' span_id:257))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\tcheck_summary_oneline "" "a change"\n' span_id:262)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'output summary format for commit with an empty diff'
            span_id: 269
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:273) (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck_summary_oneline "" "empty" "--allow-empty"\n'
            span_id: 275
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'output summary format for merges' span_id:282))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:286) (Token id:Id.Lit_Chars val:'\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b recursive-base &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\ttest_commit base file1 &&\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'\n' span_id:290) (Token id:Id.Lit_Chars val:'\tgit checkout -b recursive-a recursive-base &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\ttest_commit commit-a file1 &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\n' span_id:293) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b recursive-b recursive-base &&\n'
            span_id: 294
          ) (Token id:Id.Lit_Chars val:'\ttest_commit commit-b file1 &&\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\n' span_id:296) (Token id:Id.Lit_Chars val:'\t# conflict\n' span_id:297) 
          (Token id:Id.Lit_Chars val:'\tgit checkout recursive-a &&\n' span_id:298) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge recursive-b &&\n' span_id:299) 
          (Token id:Id.Lit_Chars val:'\t# resolve the conflict\n' span_id:300) (Token id:Id.Lit_Chars val:'\techo commit-a > file1 &&\n' span_id:301) 
          (Token id:Id.Lit_Chars val:'\tgit add file1 &&\n' span_id:302) (Token id:Id.Lit_Chars val:'\tcheck_summary_oneline "" "Merge"\n' span_id:303)
        )
      }
    )
    (command.ShFunction
      name: output_tests_cleanup
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(git)} {(checkout)} {(master)})
                (C {(git)} {(rm)} {(file1)})
                (C {(git)} {(commit)} {(-m)} {(DQ (cleanup))})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'the basics' span_id:357))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:361) (Token id:Id.Lit_Chars val:'\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'\toutput_tests_cleanup &&\n' span_id:363) (Token id:Id.Lit_Chars val:'\n' span_id:364) 
          (Token id:Id.Lit_Chars val:'\techo doing partial >"commit is" &&\n' span_id:365) (Token id:Id.Lit_Chars val:'\tmkdir not &&\n' span_id:366) 
          (Token
            id: Id.Lit_Chars
            val: '\techo very much encouraged but we should >not/forbid &&\n'
            span_id: 367
          ) (Token id:Id.Lit_Chars val:'\tgit add "commit is" not &&\n' span_id:368) 
          (Token
            id: Id.Lit_Chars
            val: '\techo update added "commit is" file >"commit is" &&\n'
            span_id: 369
          ) (Token id:Id.Lit_Chars val:'\techo also update another >not/forbid &&\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "initial with -a" &&\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\n' span_id:373) (Token id:Id.Lit_Chars val:'\tgit cat-file blob HEAD:"commit is" >current.1 &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file blob HEAD:not/forbid >current.2 &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\tcmp current.1 "commit is" &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\tcmp current.2 not/forbid\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\n' span_id:379)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:partial span_id:386))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:390) (Token id:Id.Lit_Chars val:'\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\techo another >"commit is" &&\n' span_id:392) (Token id:Id.Lit_Chars val:'\techo another >not/forbid &&\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:394) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "partial commit to handle a file" "commit is" &&\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\tchanged=$(git diff-tree --name-only HEAD^ HEAD) &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\ttest "$changed" = "commit is"\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\n' span_id:399)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'partial modification in a subdirectory' span_id:406))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:410) (Token id:Id.Lit_Chars val:'\n' span_id:411) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:412) (Token id:Id.Lit_Chars val:'\tgit commit -m "partial commit to subdirectory" not &&\n' span_id:413) 
          (Token id:Id.Lit_Chars val:'\n' span_id:414) (Token id:Id.Lit_Chars val:'\tchanged=$(git diff-tree -r --name-only HEAD^ HEAD) &&\n' span_id:415) 
          (Token id:Id.Lit_Chars val:'\ttest "$changed" = "not/forbid"\n' span_id:416) (Token id:Id.Lit_Chars val:'\n' span_id:417)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'partial removal' span_id:424))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:428) (Token id:Id.Lit_Chars val:'\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\tgit rm not/forbid &&\n' span_id:430) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "partial commit to remove not/forbid" not &&\n'
            span_id: 431
          ) (Token id:Id.Lit_Chars val:'\n' span_id:432) 
          (Token
            id: Id.Lit_Chars
            val: '\tchanged=$(git diff-tree -r --name-only HEAD^ HEAD) &&\n'
            span_id: 433
          ) (Token id:Id.Lit_Chars val:'\ttest "$changed" = "not/forbid" &&\n' span_id:434) 
          (Token
            id: Id.Lit_Chars
            val: '\tremain=$(git ls-tree -r --name-only HEAD) &&\n'
            span_id: 435
          ) (Token id:Id.Lit_Chars val:'\ttest "$remain" = "commit is"\n' span_id:436) 
          (Token id:Id.Lit_Chars val:'\n' span_id:437)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'sign off' span_id:444))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:448) (Token id:Id.Lit_Chars val:'\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\t>positive &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\tgit add positive &&\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\tgit commit -s -m "thank you" &&\n' span_id:452) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git cat-file commit HEAD | sed -ne "s/Signed-off-by: //p") &&\n'
            span_id: 453
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\texpected=$(git var GIT_COMMITTER_IDENT | sed -e "s/>.*/>/") &&\n'
            span_id: 454
          ) (Token id:Id.Lit_Chars val:'\ttest "z$actual" = "z$expected"\n' span_id:455) 
          (Token id:Id.Lit_Chars val:'\n' span_id:456)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'multiple -m' span_id:463))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:467) (Token id:Id.Lit_Chars val:'\n' span_id:468) 
          (Token id:Id.Lit_Chars val:'\t>negative &&\n' span_id:469) (Token id:Id.Lit_Chars val:'\tgit add negative &&\n' span_id:470) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "one" -m "two" -m "three" &&\n'
            span_id: 471
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git cat-file commit HEAD | sed -e "1,/^\\$/d") &&\n'
            span_id: 472
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\texpected=$(echo one; echo; echo two; echo; echo three) &&\n'
            span_id: 473
          ) (Token id:Id.Lit_Chars val:'\ttest "z$actual" = "z$expected"\n' span_id:474) 
          (Token id:Id.Lit_Chars val:'\n' span_id:475)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:verbose span_id:482))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:486) (Token id:Id.Lit_Chars val:'\n' span_id:487) 
          (Token id:Id.Lit_Chars val:'\techo minus >negative &&\n' span_id:488) (Token id:Id.Lit_Chars val:'\tgit add negative &&\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -v | sed -ne "/^diff --git /p" >actual &&\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\techo "diff --git a/negative b/negative" >expect &&\n' span_id:491) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:492) (Token id:Id.Lit_Chars val:'\n' span_id:493)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verbose respects diff config' span_id:500))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:504) (Token id:Id.Lit_Chars val:'\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\ttest_config color.diff always &&\n' span_id:506) (Token id:Id.Lit_Chars val:'\tgit status -v >actual &&\n' span_id:507) 
          (Token id:Id.Lit_Chars val:'\tgrep "\\[1mdiff --git" actual\n' span_id:508)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:mesg_with_comment_and_newlines)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'\n' span_id:514) 
                (Token id:Id.Lit_Chars val:'# text\n' span_id:515) (Token id:Id.Lit_Chars val:'\n' span_id:516)
              )
            }
          spids: [512]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'prepare file with comment line and trailing newlines'
            span_id: 523
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:527) 
          (Token
            id: Id.Lit_Chars
            val: '\tprintf "%s" "$mesg_with_comment_and_newlines" >expect\n'
            span_id: 528
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (verbatim option,-t)' span_id:535))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:539) (Token id:Id.Lit_Chars val:'\n' span_id:540) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:541) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --cleanup=verbatim --no-status -t expect -a &&\n'
            span_id: 542
          ) (Token id:Id.Lit_Chars val:'\tgit cat-file -p HEAD |sed -e "1,/^\\$/d" >actual &&\n' span_id:543) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:544) (Token id:Id.Lit_Chars val:'\n' span_id:545)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (verbatim option,-F)' span_id:552))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:556) (Token id:Id.Lit_Chars val:'\n' span_id:557) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:558) (Token id:Id.Lit_Chars val:'\tgit commit --cleanup=verbatim -F expect -a &&\n' span_id:559) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n'
            span_id: 560
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\n' span_id:562)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (verbatim option,-m)' span_id:569))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:573) (Token id:Id.Lit_Chars val:'\n' span_id:574) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:575) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --cleanup=verbatim -m "$mesg_with_comment_and_newlines" -a &&\n'
            span_id: 576
          ) (Token id:Id.Lit_Chars val:'\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n' span_id:577) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:578) (Token id:Id.Lit_Chars val:'\n' span_id:579)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (whitespace option,-F)' span_id:586))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:590) (Token id:Id.Lit_Chars val:'\n' span_id:591) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:592) (Token id:Id.Lit_Chars val:'\t{ echo;echo "# text";echo; } >text &&\n' span_id:593) 
          (Token id:Id.Lit_Chars val:'\techo "# text" >expect &&\n' span_id:594) (Token id:Id.Lit_Chars val:'\tgit commit --cleanup=whitespace -F text -a &&\n' span_id:595) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n'
            span_id: 596
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:597) 
          (Token id:Id.Lit_Chars val:'\n' span_id:598)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (scissors option,-F,-e)' span_id:605))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:609) (Token id:Id.Lit_Chars val:'\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\tcat >text <<EOF &&\n' span_id:612) 
          (Token id:Id.Lit_Chars val:'\n' span_id:613) (Token id:Id.Lit_Chars val:'# to be kept\n' span_id:614) (Token id:Id.Lit_Chars val:'\n' span_id:615) 
          (Token
            id: Id.Lit_Chars
            val: '  # ------------------------ >8 ------------------------\n'
            span_id: 616
          ) (Token id:Id.Lit_Chars val:'# to be kept, too\n' span_id:617) 
          (Token
            id: Id.Lit_Chars
            val: '# ------------------------ >8 ------------------------\n'
            span_id: 618
          ) (Token id:Id.Lit_Chars val:'to be removed\n' span_id:619) 
          (Token
            id: Id.Lit_Chars
            val: '# ------------------------ >8 ------------------------\n'
            span_id: 620
          ) (Token id:Id.Lit_Chars val:'to be removed, too\n' span_id:621) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:622) (Token id:Id.Lit_Chars val:'\n' span_id:623) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<EOF &&\n' span_id:624) (Token id:Id.Lit_Chars val:'# to be kept\n' span_id:625) (Token id:Id.Lit_Chars val:'\n' span_id:626) 
          (Token
            id: Id.Lit_Chars
            val: '  # ------------------------ >8 ------------------------\n'
            span_id: 627
          ) (Token id:Id.Lit_Chars val:'# to be kept, too\n' span_id:628) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:629) (Token id:Id.Lit_Chars val:'\tgit commit --cleanup=scissors -e -F text -a &&\n' span_id:630) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n'
            span_id: 631
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:632)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit messages (scissors option,-F,-e, scissors on first line)'
            span_id: 639
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:643) (Token id:Id.Lit_Chars val:'\n' span_id:644) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:645) (Token id:Id.Lit_Chars val:'\tcat >text <<EOF &&\n' span_id:646) 
          (Token
            id: Id.Lit_Chars
            val: '# ------------------------ >8 ------------------------\n'
            span_id: 647
          ) (Token id:Id.Lit_Chars val:'to be removed\n' span_id:648) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:649) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --cleanup=scissors -e -F text -a --allow-empty-message &&\n'
            span_id: 650
          ) (Token id:Id.Lit_Chars val:'\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n' span_id:651) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual\n' span_id:652)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (strip option,-F)' span_id:659))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:663) (Token id:Id.Lit_Chars val:'\n' span_id:664) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:665) (Token id:Id.Lit_Chars val:'\t{ echo;echo "# text";echo sample;echo; } >text &&\n' span_id:666) 
          (Token id:Id.Lit_Chars val:'\techo sample >expect &&\n' span_id:667) (Token id:Id.Lit_Chars val:'\tgit commit --cleanup=strip -F text -a &&\n' span_id:668) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p HEAD |sed -e "1,/^\\$/d">actual &&\n'
            span_id: 669
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:670) 
          (Token id:Id.Lit_Chars val:'\n' span_id:671)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit messages (strip option,-F,-e)' span_id:678))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:682) (Token id:Id.Lit_Chars val:'\n' span_id:683) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:684) (Token id:Id.Lit_Chars val:'\t{ echo;echo sample;echo; } >text &&\n' span_id:685) 
          (Token id:Id.Lit_Chars val:'\tgit commit -e -F text -a &&\n' span_id:686) (Token id:Id.Lit_Chars val:'\thead -n 4 .git/COMMIT_EDITMSG >actual\n' span_id:687)
        )
      }
    )
    (command.Simple
      words: [
        {(echo)}
        {
          (DQ ('sample\n') ('\n') 
            ('# Please enter the commit message for your changes. Lines starting\n') ("# with '#' will be ignored, and an empty message aborts the commit.")
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:700)
          fd: -1
          arg_word: {(expect)}
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit messages (strip option,-F,-e): output'
            span_id: 707
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:711) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:712)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (fail on invalid cleanup mode option)'
            span_id: 719
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:723) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --cleanup=non-existent\n'
            span_id: 724
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (fail on invalid cleanup mode configuration)'
            span_id: 731
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:735) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c commit.cleanup=non-existent commit\n'
            span_id: 736
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (no config and no option uses default)'
            span_id: 743
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:747) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:748) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:749) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:750) 
          (Token
            id: Id.Lit_Chars
            val: '\t  test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&\n'
            span_id: 751
          ) (Token id:Id.Lit_Chars val:'\t  git commit --no-status\n' span_id:752) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:753) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "commit message"\n' span_id:754)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (option overrides default)'
            span_id: 761
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:765) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:766) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:767) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:768) 
          (Token
            id: Id.Lit_Chars
            val: '\t  test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&\n'
            span_id: 769
          ) (Token id:Id.Lit_Chars val:'\t  git commit --cleanup=whitespace --no-status\n' span_id:770) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:771) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "commit message # comment"\n' span_id:772)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (config overrides default)'
            span_id: 779
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:783) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:784) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:785) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:786) 
          (Token
            id: Id.Lit_Chars
            val: '\t  test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&\n'
            span_id: 787
          ) (Token id:Id.Lit_Chars val:'\t  git -c commit.cleanup=whitespace commit --no-status\n' span_id:788) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:789) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "commit message # comment"\n' span_id:790)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cleanup commit message (option overrides config)'
            span_id: 797
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:801) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:802) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:803) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:804) 
          (Token
            id: Id.Lit_Chars
            val: '\t  test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&\n'
            span_id: 805
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t  git -c commit.cleanup=whitespace commit --cleanup=default\n'
            span_id: 806
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:807) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "commit message"\n' span_id:808)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit message (default, -m)' span_id:815))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:819) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:820) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:821) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "message #comment " &&\n'
            span_id: 822
          ) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "message #comment"\n' span_id:823)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit message (whitespace option, -m)' span_id:830))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:834) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:835) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:836) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --cleanup=whitespace --no-status -m "message #comment " &&\n'
            span_id: 837
          ) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "message #comment"\n' span_id:838)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cleanup commit message (whitespace config, -m)' span_id:845))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:849) 
          (Token id:Id.Lit_Chars val:'\techo content >>file &&\n' span_id:850) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:851) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c commit.cleanup=whitespace commit --no-status -m "message #comment " &&\n'
            span_id: 852
          ) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "message #comment"\n' span_id:853)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'message shows author when it is not equal to committer'
            span_id: 860
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:864) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:865) (Token id:Id.Lit_Chars val:'\tgit commit -e -m "sample" -a &&\n' span_id:866) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ngrep \\\n' span_id:867) (Token id:Id.Lit_Chars val:'\t  "^# Author: *A U Thor <author@example.com>\\$" \\\n' span_id:868) 
          (Token id:Id.Lit_Chars val:'\t  .git/COMMIT_EDITMSG\n' span_id:869)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'message shows date when it is explicitly set' span_id:876))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:880) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --allow-empty -e -m foo --date="2010-01-02T03:04:05" &&\n'
            span_id: 881
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep \\\n' span_id:882) 
          (Token
            id: Id.Lit_Chars
            val: '\t  "^# Date: *Sat Jan 2 03:04:05 2010 +0000" \\\n'
            span_id: 883
          ) (Token id:Id.Lit_Chars val:'\t  .git/COMMIT_EDITMSG\n' span_id:884)
        )
      }
    )
    (C {(test_expect_success)} {(AUTOIDENT)} 
      {(SQ (Token id:Id.Lit_Chars val:'message shows committer when it is automatic' span_id:893))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:897) (Token id:Id.Lit_Chars val:'\n' span_id:898) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:899) (Token id:Id.Lit_Chars val:'\t(\n' span_id:900) 
          (Token id:Id.Lit_Chars val:'\t\tsane_unset GIT_COMMITTER_EMAIL &&\n' span_id:901) (Token id:Id.Lit_Chars val:'\t\tsane_unset GIT_COMMITTER_NAME &&\n' span_id:902) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -e -m "sample" -a\n' span_id:903) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:904) 
          (Token
            id: Id.Lit_Chars
            val: '\t# the ident is calculated from the system, so we cannot\n'
            span_id: 905
          ) (Token id:Id.Lit_Chars val:'\t# check the actual value, only that it is there\n' span_id:906) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "^# Committer: " .git/COMMIT_EDITMSG\n'
            span_id: 907
          )
        )
      }
    )
    (command.Simple
      words: [{(write_script)} {(.git/FAKE_EDITOR)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:915)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 928
          stdin_parts: [
            ('echo editor started > ')
            (Id.Right_DoubleQuote '"')
            (command_sub
              left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:920)
              command_list: (command.CommandList children:[(C {(pwd)})])
            )
            (/.git/result)
            (Id.Right_DoubleQuote '"')
            ('\n')
            ('exit 0\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(Id.KW_Bang '!') (AUTOIDENT)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not fire editor when committer is bogus' span_id:936))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:940) 
          (Token id:Id.Lit_Chars val:'\t>.git/result &&\n' span_id:941) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:942) (Token id:Id.Lit_Chars val:'\n' span_id:943) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:944) (Token id:Id.Lit_Chars val:'\t(\n' span_id:945) 
          (Token id:Id.Lit_Chars val:'\t\tsane_unset GIT_COMMITTER_EMAIL &&\n' span_id:946) (Token id:Id.Lit_Chars val:'\t\tsane_unset GIT_COMMITTER_NAME &&\n' span_id:947) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_EDITOR="\\"$(pwd)/.git/FAKE_EDITOR\\"" &&\n'
            span_id: 948
          ) (Token id:Id.Lit_Chars val:'\t\texport GIT_EDITOR &&\n' span_id:949) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git commit -e -m sample -a\n'
            span_id: 950
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:951) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect .git/result\n' span_id:952)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not fire editor if -m <msg> was given' span_id:959))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:963) 
          (Token id:Id.Lit_Chars val:'\techo tick >file &&\n' span_id:964) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:965) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "editor not started" >.git/result &&\n'
            span_id: 966
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t(GIT_EDITOR="\\"$(pwd)/.git/FAKE_EDITOR\\"" git commit -m tick) &&\n'
            span_id: 967
          ) (Token id:Id.Lit_Chars val:'\ttest "$(cat .git/result)" = "editor not started"\n' span_id:968)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not fire editor if -m "" was given' span_id:975))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:979) 
          (Token id:Id.Lit_Chars val:'\techo tock >file &&\n' span_id:980) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:981) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "editor not started" >.git/result &&\n'
            span_id: 982
          ) (Token id:Id.Lit_Chars val:'\t(GIT_EDITOR="\\"$(pwd)/.git/FAKE_EDITOR\\"" \\\n' span_id:983) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -m "" --allow-empty-message) &&\n'
            span_id: 984
          ) (Token id:Id.Lit_Chars val:'\ttest "$(cat .git/result)" = "editor not started"\n' span_id:985)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not fire editor in the presence of conflicts' span_id:992))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:996) (Token id:Id.Lit_Chars val:'\n' span_id:997) 
          (Token id:Id.Lit_Chars val:'\tgit clean -f &&\n' span_id:998) (Token id:Id.Lit_Chars val:'\techo f >g &&\n' span_id:999) 
          (Token id:Id.Lit_Chars val:'\tgit add g &&\n' span_id:1000) (Token id:Id.Lit_Chars val:'\tgit commit -m "add g" &&\n' span_id:1001) 
          (Token id:Id.Lit_Chars val:'\tgit branch second &&\n' span_id:1002) (Token id:Id.Lit_Chars val:'\techo master >g &&\n' span_id:1003) 
          (Token id:Id.Lit_Chars val:'\techo g >h &&\n' span_id:1004) (Token id:Id.Lit_Chars val:'\tgit add g h &&\n' span_id:1005) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "modify g and add h" &&\n'
            span_id: 1006
          ) (Token id:Id.Lit_Chars val:'\tgit checkout second &&\n' span_id:1007) 
          (Token id:Id.Lit_Chars val:'\techo second >g &&\n' span_id:1008) (Token id:Id.Lit_Chars val:'\tgit add g &&\n' span_id:1009) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m second &&\n' span_id:1010) (Token id:Id.Lit_Chars val:'\t# Must fail due to conflict\n' span_id:1011) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick -n master &&\n'
            span_id: 1012
          ) (Token id:Id.Lit_Chars val:'\techo "editor not started" >.git/result &&\n' span_id:1013) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1014) (Token id:Id.Lit_Chars val:'\t\tGIT_EDITOR="\\"$(pwd)/.git/FAKE_EDITOR\\"" &&\n' span_id:1015) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_EDITOR &&\n' span_id:1016) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit\n' span_id:1017) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1018) (Token id:Id.Lit_Chars val:'\ttest "$(cat .git/result)" = "editor not started"\n' span_id:1019)
        )
      }
    )
    (command.Simple
      words: [{(write_script)} {(.git/FAKE_EDITOR)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1027)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1032
          stdin_parts: [('# kill -TERM command added below.\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(EXECKEEPSPID)} 
      {(SQ (Token id:Id.Lit_Chars val:'a SIGTERM should break locks' span_id:1039))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1043) 
          (Token id:Id.Lit_Chars val:'\techo >>negative &&\n' span_id:1044) (Token id:Id.Lit_Chars val:'\t! "$SHELL_PATH" -c ' span_id:1045)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:1047)) 
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1049) 
          (Token
            id: Id.Lit_Chars
            val: '\t  echo kill -TERM $$ >> .git/FAKE_EDITOR\n'
            span_id: 1050
          ) (Token id:Id.Lit_Chars val:'\t  GIT_EDITOR=.git/FAKE_EDITOR\n' span_id:1051) 
          (Token id:Id.Lit_Chars val:'\t  export GIT_EDITOR\n' span_id:1052) (Token id:Id.Lit_Chars val:'\t  exec git commit -a' span_id:1053)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:1055)) 
        (SQ (Token id:Id.Lit_Chars val:' &&\n' span_id:1057) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f .git/index.lock\n' span_id:1058)
        )
      }
    )
    (C {(rm)} {(-f)} {(.git/MERGE_MSG)} {(.git/COMMIT_EDITMSG)})
    (C {(git)} {(reset)} {(-q)} {(--hard)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Hand committing of a redundant merge removes dups'
            span_id: 1082
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1086) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1087) (Token id:Id.Lit_Chars val:'\tgit rev-parse second master >expect &&\n' span_id:1088) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge second master &&\n'
            span_id: 1089
          ) (Token id:Id.Lit_Chars val:'\tgit checkout master g &&\n' span_id:1090) 
          (Token id:Id.Lit_Chars val:'\tEDITOR=: git commit -a &&\n' span_id:1091) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file commit HEAD | sed -n -e "s/^parent //p" -e "/^$/q" >actual &&\n'
            span_id: 1092
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1093) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1094)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'A single-liner subject with a token plus colon is not a footer'
            span_id: 1101
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1105) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1106) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1107) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -s -m "hello: kitty" --allow-empty &&\n'
            span_id: 1108
          ) (Token id:Id.Lit_Chars val:'\tgit cat-file commit HEAD | sed -e "1,/^$/d" >actual &&\n' span_id:1109) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 3 actual\n' span_id:1110) (Token id:Id.Lit_Chars val:'\n' span_id:1111)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit -s places sob on third line after two empty lines'
            span_id: 1118
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1122) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -s --allow-empty --allow-empty-message &&\n'
            span_id: 1123
          ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:1124) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1125) (Token id:Id.Lit_Chars val:'\n' span_id:1126) 
          (Token
            id: Id.Lit_Chars
            val: '\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n'
            span_id: 1127
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1128) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1129) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "/^#/d" -e "s/^:.*//" .git/COMMIT_EDITMSG >actual &&\n'
            span_id: 1130
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1131)
        )
      }
    )
    (command.Simple
      words: [{(write_script)} {(.git/FAKE_EDITOR)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1139)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1140)) 
              (OF)
            }
          here_end_span_id: 1148
          stdin_parts: [
            ('mv "$1" "$1.orig"\n')
            ('(\n')
            ('\techo message\n')
            ('\tcat "$1.orig"\n')
            (') >"$1"\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(echo)} {(SQ (Token id:Id.Lit_Chars val:'## Custom template' span_id:1153))}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1156)
          fd: -1
          arg_word: {(template)}
        )
      ]
    )
    (command.ShFunction
      name: try_commit
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(git)} {(reset)} {(--hard)})
                (command.Simple
                  words: [{(echo)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:1179)
                      fd: -1
                      arg_word: {(negative)}
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(git)}
                    {(commit)}
                    {(-a)}
                    {($ Id.VSub_Star '$*')}
                    {($ Id.VSub_DollarName '$use_template')}
                  ]
                  more_env: [(env_pair name:GIT_EDITOR val:{(.git/FAKE_EDITOR)} spids:[1185])]
                )
                (command.Case
                  to_match: {(DQ ($ Id.VSub_DollarName '$use_template'))}
                  arms: [
                    (case_arm
                      pat_list: [{(SQ )}]
                      action: [
                        (C {(test_i18ngrep)} {(Id.KW_Bang '!')} {(DQ ('^## Custom template'))} 
                          {(.git/COMMIT_EDITMSG)}
                        )
                      ]
                      spids: [1210 1212 1225 -1]
                    )
                    (case_arm
                      pat_list: [{(Id.Lit_Star '*')}]
                      action: [
                        (C {(test_i18ngrep)} {(DQ ('^## Custom template'))} {(.git/COMMIT_EDITMSG)})
                      ]
                      spids: [1228 1229 1240 -1]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: try_commit_status_combo
      body: 
        (command.BraceGroup
          children: [
            (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:commit span_id:1260))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1264) 
                  (Token id:Id.Lit_Chars val:'\t\ttry_commit "" &&\n' span_id:1265) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1266
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1267)
                )
              }
            )
            (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'commit --status' span_id:1275))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1279) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttry_commit --status &&\n'
                    span_id: 1280
                  ) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1281
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1282)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'commit --no-status' span_id:1290))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1294) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttry_commit --no-status &&\n'
                    span_id: 1295
                  ) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1296
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1297)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'commit with commit.status = yes' span_id:1305))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1309) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status yes &&\n'
                    span_id: 1310
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit "" &&\n' span_id:1311) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1312
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1313)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'commit with commit.status = no' span_id:1321))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1325) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status no &&\n'
                    span_id: 1326
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit "" &&\n' span_id:1327) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1328
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1329)
                )
              }
            )
            (C {(test_expect_success)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'commit --status with commit.status = yes'
                    span_id: 1337
                  )
                )
              } 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1341) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status yes &&\n'
                    span_id: 1342
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit --status &&\n' span_id:1343) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1344
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1345)
                )
              }
            )
            (C {(test_expect_success)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'commit --no-status with commit.status = yes'
                    span_id: 1353
                  )
                )
              } 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1357) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status yes &&\n'
                    span_id: 1358
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit --no-status &&\n' span_id:1359) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1360
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1361)
                )
              }
            )
            (C {(test_expect_success)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'commit --status with commit.status = no'
                    span_id: 1369
                  )
                )
              } 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1373) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status no &&\n'
                    span_id: 1374
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit --status &&\n' span_id:1375) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1376
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1377)
                )
              }
            )
            (C {(test_expect_success)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'commit --no-status with commit.status = no'
                    span_id: 1385
                  )
                )
              } 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1389) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config commit.status no &&\n'
                    span_id: 1390
                  ) (Token id:Id.Lit_Chars val:'\t\ttry_commit --no-status &&\n' span_id:1391) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG\n'
                    span_id: 1392
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:1393)
                )
              }
            )
          ]
        )
    )
    (C {(try_commit_status_combo)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:use_template)
          op: assign_op.Equal
          rhs: {(DQ ('-t template'))}
          spids: [1403]
        )
      ]
    )
    (C {(try_commit_status_combo)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --status with custom comment character' span_id:1415))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1419) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config core.commentchar ";" &&\n'
            span_id: 1420
          ) (Token id:Id.Lit_Chars val:'\ttry_commit --status &&\n' span_id:1421) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG\n'
            span_id: 1422
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'switch core.commentchar' span_id:1429))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1433) 
          (Token id:Id.Lit_Chars val:'\ttest_commit "#foo" foo &&\n' span_id:1434) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_EDITOR=.git/FAKE_EDITOR git -c core.commentChar=auto commit --amend &&\n'
            span_id: 1435
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG\n'
            span_id: 1436
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'switch core.commentchar but out of options' span_id:1443))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1447) 
          (Token id:Id.Lit_Chars val:'\tcat >text <<\\EOF &&\n' span_id:1448) (Token id:Id.Lit_Chars val:'# 1\n' span_id:1449) (Token id:Id.Lit_Chars val:'; 2\n' span_id:1450) 
          (Token id:Id.Lit_Chars val:'@ 3\n' span_id:1451) (Token id:Id.Lit_Chars val:'! 4\n' span_id:1452) (Token id:Id.Lit_Chars val:'$ 5\n' span_id:1453) 
          (Token id:Id.Lit_Chars val:'% 6\n' span_id:1454) (Token id:Id.Lit_Chars val:'^ 7\n' span_id:1455) (Token id:Id.Lit_Chars val:'& 8\n' span_id:1456) 
          (Token id:Id.Lit_Chars val:'| 9\n' span_id:1457) (Token id:Id.Lit_Chars val:': 10\n' span_id:1458) (Token id:Id.Lit_Chars val:'EOF\n' span_id:1459) 
          (Token id:Id.Lit_Chars val:'\tgit commit --amend -F text &&\n' span_id:1460) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1461) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor .git/FAKE_EDITOR &&\n'
            span_id: 1462
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git -c core.commentChar=auto commit --amend\n'
            span_id: 1463
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1464)
        )
      }
    )
    (C {(test_done)})
  ]
)