(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\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16) (Token id:Id.Lit_Chars val:'Tests for selected commit options.' span_id:17)
              )
            }
          spids: [13]
        )
      ]
    )
    (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: [34]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:actual)
                  op: assign_op.Equal
                  rhs: {(commit_msg_is.actual)}
                  spids: [38]
                )
              ]
            )
            (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:50)
                          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:68)
                      fd: -1
                      arg_word: {(DQ ($ 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:86)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$expect'))}
                    )
                  ]
                )
                (C {(test_i18ncmp)} {(DQ ($ Id.VSub_DollarName '$expect'))} 
                  {(DQ ($ Id.VSub_DollarName '$actual'))}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'a basic commit in an empty tree should succeed' span_id:113))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:117) 
          (Token id:Id.Lit_Chars val:'\techo content > foo &&\n' span_id:118) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "initial commit"\n' span_id:120)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'nonexistent template file should return error' span_id:127))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\techo changes >> foo &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:134) (Token id:Id.Lit_Chars val:'\t\tGIT_EDITOR="echo hello >\\"\\$1\\"" &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_EDITOR &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit --template "$PWD"/notexist\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:138)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'nonexistent template file in config should return error'
            span_id: 145
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config commit.template "$PWD"/notexist &&\n'
            span_id: 150
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_EDITOR="echo hello >\\"\\$1\\"" &&\n'
            span_id: 152
          ) (Token id:Id.Lit_Chars val:'\t\texport GIT_EDITOR &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit\n' span_id:154) (Token id:Id.Lit_Chars val:'\t)\n' span_id:155)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEMPLATE)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PWD')) (/template)}
          spids: [162]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'unedited template should not commit' span_id:172))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:176) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "template line" > "$TEMPLATE" &&\n'
            span_id: 177
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit --template "$TEMPLATE"\n' span_id:178)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'unedited template with comments should not commit'
            span_id: 185
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:189) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "# comment in template" >> "$TEMPLATE" &&\n'
            span_id: 190
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit --template "$TEMPLATE"\n' span_id:191)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'a Signed-off-by line by itself should not commit'
            span_id: 198
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:203) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-signed-off &&\n'
            span_id: 204
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit --template "$TEMPLATE"\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'adding comments to a template should not commit' span_id:213))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:218) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-comments &&\n'
            span_id: 219
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit --template "$TEMPLATE"\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:221)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'adding real content to a template should commit' span_id:228))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:233) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-content &&\n'
            span_id: 234
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit --template "$TEMPLATE"\n' span_id:235) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:236) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "template linecommit message"\n' span_id:237)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'-t option should be short for --template' span_id:244))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:248) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "short template" > "$TEMPLATE" &&\n'
            span_id: 249
          ) (Token id:Id.Lit_Chars val:'\techo "new content" >> foo &&\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\t(\n' span_id:252) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-content &&\n'
            span_id: 253
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit -t "$TEMPLATE"\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "short templatecommit message"\n' span_id:256)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'config-specified template should commit' span_id:263))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:267) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "new template" > "$TEMPLATE" &&\n'
            span_id: 268
          ) (Token id:Id.Lit_Chars val:'\ttest_config commit.template "$TEMPLATE" &&\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >> foo &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:272) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-content &&\n'
            span_id: 273
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:275) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "new templatecommit message"\n' span_id:276)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'explicit commit message should override template'
            span_id: 283
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\techo "still more content" >> foo &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tGIT_EDITOR="$TEST_DIRECTORY"/t7500/add-content git commit --template "$TEMPLATE" \\\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\t\t-m "command line msg" &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "command line msg"\n' span_id:292)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit message from file should override template'
            span_id: 299
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'\techo "content galore" >> foo &&\n' span_id:304) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\techo "standard input msg" |\n' span_id:306) (Token id:Id.Lit_Chars val:'\t(\n' span_id:307) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-content &&\n'
            span_id: 308
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit --template "$TEMPLATE" --file -\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "standard input msg"\n' span_id:311)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:317)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$TEMPLATE'))}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:322)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:323)) 
              (OF)
            }
          here_end_span_id: 330
          stdin_parts: [('\n') ('\n') ('### template\n') ('\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit message from template with whitespace issue'
            span_id: 334
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:338) 
          (Token id:Id.Lit_Chars val:'\techo "content galore" >>foo &&\n' span_id:339) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:340) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_EDITOR="$TEST_DIRECTORY"/t7500/add-whitespaced-content git commit \\\n'
            span_id: 341
          ) (Token id:Id.Lit_Chars val:'\t\t--template "$TEMPLATE" &&\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "commit message"\n' span_id:343)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'using alternate GIT_INDEX_FILE (1)' span_id:350))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:354) (Token id:Id.Lit_Chars val:'\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\tcp .git/index saved-index &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\t(\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\t\techo some new content >file &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t        GIT_INDEX_FILE=.git/another_index &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_INDEX_FILE &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\tgit add file &&\n' span_id:361) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "commit using another index" &&\n'
            span_id: 362
          ) (Token id:Id.Lit_Chars val:'\t\tgit diff-index --exit-code HEAD &&\n' span_id:363) 
          (Token id:Id.Lit_Chars val:'\t\tgit diff-files --exit-code\n' span_id:364) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:365) 
          (Token
            id: Id.Lit_Chars
            val: '\tcmp .git/index saved-index >/dev/null\n'
            span_id: 366
          ) (Token id:Id.Lit_Chars val:'\n' span_id:367)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'using alternate GIT_INDEX_FILE (2)' span_id:374))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:378) (Token id:Id.Lit_Chars val:'\n' span_id:379) 
          (Token id:Id.Lit_Chars val:'\tcp .git/index saved-index &&\n' span_id:380) (Token id:Id.Lit_Chars val:'\t(\n' span_id:381) 
          (Token id:Id.Lit_Chars val:'\t\trm -f .git/no-such-index &&\n' span_id:382) (Token id:Id.Lit_Chars val:'\t\tGIT_INDEX_FILE=.git/no-such-index &&\n' span_id:383) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_INDEX_FILE &&\n' span_id:384) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "commit using nonexistent index" &&\n' span_id:385) 
          (Token id:Id.Lit_Chars val:'\t\ttest -z "$(git ls-files)" &&\n' span_id:386) (Token id:Id.Lit_Chars val:'\t\ttest -z "$(git ls-tree HEAD)"\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\n' span_id:388) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:389) 
          (Token
            id: Id.Lit_Chars
            val: '\tcmp .git/index saved-index >/dev/null\n'
            span_id: 390
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:396)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:400)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 408
          stdin_parts: [('zort\n') ('\n') ('Signed-off-by: C O Mitter <committer@example.com>\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:--signoff span_id:413))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "yet another content *narf*" >> foo &&\n'
            span_id: 418
          ) (Token id:Id.Lit_Chars val:'\techo "zort" | git commit -s -F - foo &&\n' span_id:419) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file commit HEAD | sed "1,/^\\$/d" > output &&\n'
            span_id: 420
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect output\n' span_id:421)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit message from file (1)' span_id:428))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:432) 
          (Token id:Id.Lit_Chars val:'\tmkdir subdir &&\n' span_id:433) (Token id:Id.Lit_Chars val:'\techo "Log in top directory" >log &&\n' span_id:434) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "Log in sub directory" >subdir/log &&\n'
            span_id: 435
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:436) 
          (Token id:Id.Lit_Chars val:'\t\tcd subdir &&\n' span_id:437) (Token id:Id.Lit_Chars val:'\t\tgit commit --allow-empty -F log\n' span_id:438) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:439) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "Log in sub directory"\n' span_id:440)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit message from file (2)' span_id:447))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\trm -f log &&\n' span_id:452) (Token id:Id.Lit_Chars val:'\techo "Log in sub directory" >subdir/log &&\n' span_id:453) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:454) (Token id:Id.Lit_Chars val:'\t\tcd subdir &&\n' span_id:455) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit --allow-empty -F log\n' span_id:456) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:457) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "Log in sub directory"\n'
            span_id: 458
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit message from stdin' span_id:465))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:470) (Token id:Id.Lit_Chars val:'\t\tcd subdir &&\n' span_id:471) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "Log with foo word" | git commit --allow-empty -F -\n'
            span_id: 472
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "Log with foo word"\n' span_id:474)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'commit -F overrides -t' span_id:481))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:485) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:486) (Token id:Id.Lit_Chars val:'\t\tcd subdir &&\n' span_id:487) 
          (Token id:Id.Lit_Chars val:'\t\techo "-F log" > f.log &&\n' span_id:488) (Token id:Id.Lit_Chars val:'\t\techo "-t template" > t.template &&\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit --allow-empty -F f.log -t t.template\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:491) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "-F log"\n' span_id:492)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Commit without message is allowed with --allow-empty-message'
            span_id: 499
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >>foo &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:506) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty-message <empty &&\n' span_id:507) 
          (Token id:Id.Lit_Chars val:'\tcommit_msg_is "" &&\n' span_id:508) (Token id:Id.Lit_Chars val:'\tgit tag empty-message-commit\n' span_id:509)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Commit without message is no-no without --allow-empty-message'
            span_id: 516
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:520) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >>foo &&\n' span_id:521) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:522) 
          (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:523) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit <empty\n' span_id:524)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Commit a message with --allow-empty-message' span_id:531))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:535) 
          (Token id:Id.Lit_Chars val:'\techo "even more content" >>foo &&\n' span_id:536) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:537) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --allow-empty-message -m"hello there" &&\n'
            span_id: 538
          ) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "hello there"\n' span_id:539)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit -C empty respects --allow-empty-message' span_id:546))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\techo more >>foo &&\n' span_id:551) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:552) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit -C empty-message-commit &&\n'
            span_id: 553
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -C empty-message-commit --allow-empty-message &&\n'
            span_id: 554
          ) (Token id:Id.Lit_Chars val:'\tcommit_msg_is ""\n' span_id:555)
        )
      }
    )
    (command.ShFunction
      name: commit_for_rebase_autosquash_setup
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(echo)} {(DQ ('first content line'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:573)
                      fd: -1
                      arg_word: {(foo)}
                    )
                  ]
                )
                (C {(git)} {(add)} {(foo)})
                (command.Simple
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:590)
                      fd: -1
                      arg_word: {(log)}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLess val:'<<' span_id:593)
                      fd: -1
                      here_begin: {(EOF)}
                      here_end_span_id: 603
                      stdin_parts: [
                        ('target message subject line\n')
                        ('\n')
                        ('target message body line 1\n')
                        ('target message body line 2\n')
                      ]
                    )
                  ]
                )
                (C {(git)} {(commit)} {(-F)} {(log)})
                (command.Simple
                  words: [{(echo)} {(DQ ('second content line'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:622)
                      fd: -1
                      arg_word: {(foo)}
                    )
                  ]
                )
                (C {(git)} {(add)} {(foo)})
                (C {(git)} {(commit)} {(-m)} {(DQ ('intermediate commit'))})
                (command.Simple
                  words: [{(echo)} {(DQ ('third content line'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:656)
                      fd: -1
                      arg_word: {(foo)}
                    )
                  ]
                )
                (C {(git)} {(add)} {(foo)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit --fixup provides correct one-line commit message'
            span_id: 674
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:678) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 679
          ) (Token id:Id.Lit_Chars val:'\tgit commit --fixup HEAD~1 &&\n' span_id:680) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "fixup! target message subject line"\n'
            span_id: 681
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -F' span_id:688))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:692) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 693
          ) (Token id:Id.Lit_Chars val:'\techo "log message from file" >msgfile &&\n' span_id:694) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --squash HEAD~1 -F msgfile  &&\n'
            span_id: 695
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! target message subject linelog message from file"\n'
            span_id: 696
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -m' span_id:703))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:707) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 708
          ) (Token id:Id.Lit_Chars val:'\tgit commit --squash HEAD~1 -m "foo bar\\nbaz" &&\n' span_id:709) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! target message subject linefoo bar\\nbaz"\n'
            span_id: 710
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -C' span_id:717))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:721) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 722
          ) (Token id:Id.Lit_Chars val:'\tgit commit --squash HEAD~1 -C HEAD &&\n' span_id:723) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! target message subject lineintermediate commit"\n'
            span_id: 724
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -c' span_id:731))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:735) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 736
          ) (Token id:Id.Lit_Chars val:'\ttest_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&\n' span_id:737) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --squash HEAD~1 -c HEAD &&\n'
            span_id: 738
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! target message subject lineedited commit"\n'
            span_id: 739
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -C for same commit' span_id:746))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:750) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 751
          ) (Token id:Id.Lit_Chars val:'\tgit commit --squash HEAD -C HEAD &&\n' span_id:752) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! intermediate commit"\n'
            span_id: 753
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with -c for same commit' span_id:760))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:764) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 765
          ) (Token id:Id.Lit_Chars val:'\ttest_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&\n' span_id:766) 
          (Token id:Id.Lit_Chars val:'\tgit commit --squash HEAD -c HEAD &&\n' span_id:767) (Token id:Id.Lit_Chars val:'\tcommit_msg_is "squash! edited commit"\n' span_id:768)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --squash works with editor' span_id:775))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:779) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_for_rebase_autosquash_setup &&\n'
            span_id: 780
          ) (Token id:Id.Lit_Chars val:'\ttest_set_editor "$TEST_DIRECTORY"/t7500/add-content &&\n' span_id:781) 
          (Token id:Id.Lit_Chars val:'\tgit commit --squash HEAD~1 &&\n' span_id:782) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit_msg_is "squash! target message subject linecommit message"\n'
            span_id: 783
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'invalid message options when using --fixup' span_id:790))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:794) 
          (Token id:Id.Lit_Chars val:'\techo changes >>foo &&\n' span_id:795) (Token id:Id.Lit_Chars val:'\techo "message" >log &&\n' span_id:796) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:797) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --fixup HEAD~1 --squash HEAD~2 &&\n'
            span_id: 798
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit --fixup HEAD~1 -C HEAD~2 &&\n' span_id:799) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --fixup HEAD~1 -c HEAD~2 &&\n'
            span_id: 800
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --fixup HEAD~1 -m "cmdline message" &&\n'
            span_id: 801
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit --fixup HEAD~1 -F log\n' span_id:802)
        )
      }
    )
    (C {(test_done)})
  ]
)