(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 --reset-author' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: author_header
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(git)} {(cat-file)} {(commit)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(sed)} {(-n)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'/^$/q' span_id:52))} {(-e)} 
                  {(SQ (Token id:Id.Lit_Chars val:'/^author /p' span_id:58))}
                )
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: message_body
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(git)} {(cat-file)} {(commit)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'1,/^$/d' span_id:90))})
              ]
              negated: F
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'-C option copies authorship and message' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\techo "Initial" >foo &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:106) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "Initial Commit" --author Frigate\\ \\<flying@over.world\\> &&\n'
            span_id: 107
          ) (Token id:Id.Lit_Chars val:'\tgit tag Initial &&\n' span_id:108) 
          (Token id:Id.Lit_Chars val:'\techo "Test 1" >>foo &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -C Initial &&\n' span_id:111) (Token id:Id.Lit_Chars val:'\tauthor_header Initial >expect &&\n' span_id:112) 
          (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:113) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\n' span_id:115) (Token id:Id.Lit_Chars val:'\tmessage_body Initial >expect &&\n' span_id:116) 
          (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:117) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:118)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '-C option copies only the message with --reset-author'
            span_id: 125
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\techo "Test 2" >>foo &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:131) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -C Initial --reset-author &&\n'
            span_id: 132
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&\n'
            span_id: 133
          ) (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\tmessage_body Initial >expect &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:139)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'-c option copies authorship and message' span_id:146))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\techo "Test 3" >>foo &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:152) 
          (Token
            id: Id.Lit_Chars
            val: '\tEDITOR=: VISUAL=: git commit -a -c Initial &&\n'
            span_id: 153
          ) (Token id:Id.Lit_Chars val:'\tauthor_header Initial >expect &&\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:156)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '-c option copies only the message with --reset-author'
            span_id: 163
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\techo "Test 4" >>foo &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:169) 
          (Token
            id: Id.Lit_Chars
            val: '\tEDITOR=: VISUAL=: git commit -a -c Initial --reset-author &&\n'
            span_id: 170
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&\n'
            span_id: 171
          ) (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\tmessage_body Initial >expect &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:177)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--amend option copies authorship' span_id:184))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\tgit checkout Initial &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\techo "Test 5" >>foo &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\tgit commit -a --amend -m "amend test" &&\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\tauthor_header Initial >expect &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\n' span_id:196) 
          (Token id:Id.Lit_Chars val:'\techo "amend test" >expect &&\n' span_id:197) (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:199)
        )
      }
    )
    (command.ShFunction
      name: sha1_file
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(echo)} {(DQ ($ Id.VSub_Star '$*'))})
                (C {(sed)} {(DQ ('s#..#.git/objects/&/#'))})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: remove_object
      body: 
        (command.BraceGroup
          children: [
            (C {(rm)} {(-f)} 
              {
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:237)
                  command_list: 
                    (command.CommandList
                      children: [(C {(sha1_file)} {(DQ ($ Id.VSub_Star '$*'))})]
                    )
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--amend option with empty author' span_id:251))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file commit Initial >tmp &&\n' span_id:256) (Token id:Id.Lit_Chars val:'\tsed "s/author [^<]* </author  </" tmp >empty-author &&\n' span_id:257) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha=$(git hash-object -t commit -w empty-author) &&\n'
            span_id: 258
          ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "remove_object $sha" &&\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\tgit checkout $sha &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\ttest_when_finished "git checkout Initial" &&\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\techo "Empty author test" >>foo &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:263) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit -a -m "empty author" --amend 2>err &&\n'
            span_id: 264
          ) (Token id:Id.Lit_Chars val:'\tgrep "empty ident" err\n' span_id:265)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--amend option with missing author' span_id:272))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file commit Initial >tmp &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\tsed "s/author [^<]* </author </" tmp >malformed &&\n' span_id:278) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha=$(git hash-object -t commit -w malformed) &&\n'
            span_id: 279
          ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "remove_object $sha" &&\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\tgit checkout $sha &&\n' span_id:281) (Token id:Id.Lit_Chars val:'\ttest_when_finished "git checkout Initial" &&\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\techo "Missing author test" >>foo &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:284) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit -a -m "malformed author" --amend 2>err &&\n'
            span_id: 285
          ) (Token id:Id.Lit_Chars val:'\tgrep "empty ident" err\n' span_id:286)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--reset-author makes the commit ours even with --amend option'
            span_id: 293
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:297) 
          (Token id:Id.Lit_Chars val:'\tgit checkout Initial &&\n' span_id:298) (Token id:Id.Lit_Chars val:'\techo "Test 6" >>foo &&\n' span_id:299) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:300) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a --reset-author -m "Changed again" --amend &&\n'
            span_id: 301
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&\n'
            span_id: 302
          ) (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:304) (Token id:Id.Lit_Chars val:'\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\techo "Changed again" >expect &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:308)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--reset-author and --author are mutually exclusive'
            span_id: 315
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\tgit checkout Initial &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\techo "Test 7" >>foo &&\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:322) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_must_fail git commit -a --reset-author --author="Xyzzy <frotz@nitfol.xz>"\n'
            span_id: 323
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--reset-author should be rejected without -c/-C/--amend'
            span_id: 330
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:334) 
          (Token id:Id.Lit_Chars val:'\tgit checkout Initial &&\n' span_id:335) (Token id:Id.Lit_Chars val:'\techo "Test 7" >>foo &&\n' span_id:336) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:337) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit -a --reset-author -m done\n' span_id:338)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit respects CHERRY_PICK_HEAD and MERGE_MSG' span_id:345))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\techo "cherry-pick 1a" >>foo &&\n' span_id:350) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:351) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -am "cherry-pick 1" --author="Cherry <cherry@pick.er>" &&\n'
            span_id: 352
          ) (Token id:Id.Lit_Chars val:'\tgit tag cherry-pick-head &&\n' span_id:353) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse cherry-pick-head >.git/CHERRY_PICK_HEAD &&\n'
            span_id: 354
          ) (Token id:Id.Lit_Chars val:'\techo "This is a MERGE_MSG" >.git/MERGE_MSG &&\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\techo "cherry-pick 1b" >>foo &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\tauthor_header cherry-pick-head >expect &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:361) 
          (Token id:Id.Lit_Chars val:'\n' span_id:362) (Token id:Id.Lit_Chars val:'\techo "This is a MERGE_MSG" >expect &&\n' span_id:363) 
          (Token id:Id.Lit_Chars val:'\tmessage_body HEAD >actual &&\n' span_id:364) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:365)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--reset-author with CHERRY_PICK_HEAD' span_id:372))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:376) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse cherry-pick-head >.git/CHERRY_PICK_HEAD &&\n'
            span_id: 377
          ) (Token id:Id.Lit_Chars val:'\techo "cherry-pick 2" >>foo &&\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:379) (Token id:Id.Lit_Chars val:'\tgit commit -am "cherry-pick 2" --reset-author &&\n' span_id:380) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&\n'
            span_id: 381
          ) (Token id:Id.Lit_Chars val:'\tauthor_header HEAD >actual &&\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:383)
        )
      }
    )
    (C {(test_done)})
  ]
)