(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:'Test the post-rewrite hook.' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:26))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\ttest_commit A foo A &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\ttest_commit B foo B &&\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'\ttest_commit C foo C &&\n' span_id:33) (Token id:Id.Lit_Chars val:'\ttest_commit D foo D &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\tgit checkout A^0 &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\ttest_commit E bar E &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\ttest_commit F foo F &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:38)
        )
      }
    )
    (C {(mkdir)} {(.git/hooks)})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:49)
          fd: -1
          arg_word: {(.git/hooks/post-rewrite)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:52)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 69
          stdin_parts: [
            ('#!/bin/sh\n')
            ('echo ')
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:57)
            )
            ('@ > ')
            (Id.Right_DoubleQuote '"')
            ($ Id.VSub_DollarName '$TRASH_DIRECTORY')
            (Id.Right_DoubleQuote '"')
            ('/post-rewrite.args\n')
            ('cat > ')
            (Id.Right_DoubleQuote '"')
            ($ Id.VSub_DollarName '$TRASH_DIRECTORY')
            (Id.Right_DoubleQuote '"')
            ('/post-rewrite.data\n')
          ]
        )
      ]
    )
    (C {(chmod)} {(u) (Id.Lit_Other '+') (x)} {(.git/hooks/post-rewrite)})
    (command.ShFunction
      name: clear_hook_input
      body: 
        (command.BraceGroup
          children: [(C {(rm)} {(-f)} {(post-rewrite.args)} {(post-rewrite.data)})]
        )
    )
    (command.ShFunction
      name: verify_hook_input
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test_cmp)} {(expected.args)} 
                  {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY')) (/post-rewrite.args)}
                )
                (C {(test_cmp)} {(expected.data)} 
                  {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY')) (/post-rewrite.data)}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git commit --amend' span_id:133))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\techo "D new message" > newmsg &&\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\toldsha=$(git rev-parse HEAD^0) &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\tgit commit -Fnewmsg --amend &&\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\techo amend > expected.args &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\techo $oldsha $(git rev-parse HEAD^0) > expected.data &&\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:144)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git commit --amend --no-post-rewrite' span_id:151))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\techo "D new message again" > newmsg &&\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --no-post-rewrite -Fnewmsg --amend &&\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\ttest ! -f post-rewrite.args &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f post-rewrite.data\n' span_id:160)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase' span_id:167))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:173) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase --onto A B &&\n'
            span_id: 174
          ) (Token id:Id.Lit_Chars val:'\techo C > foo &&\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:179) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse C) $(git rev-parse HEAD^)\n'
            span_id: 180
          ) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:182) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:183)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase --skip' span_id:190))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:196) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase --onto A B &&\n'
            span_id: 197
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rebase --skip &&\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\techo D > foo &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:205) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git rebase --skip the last one' span_id:213))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard F &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:219) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase --onto D A &&\n'
            span_id: 220
          ) (Token id:Id.Lit_Chars val:'\tgit rebase --skip &&\n' span_id:221) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:223) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse E) $(git rev-parse HEAD)\n'
            span_id: 224
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:226)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase -m' span_id:233))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:238) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:239) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase -m --onto A B &&\n'
            span_id: 240
          ) (Token id:Id.Lit_Chars val:'\techo C > foo &&\n' span_id:241) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:245) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse C) $(git rev-parse HEAD^)\n'
            span_id: 246
          ) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:248) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:249)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase -m --skip' span_id:256))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:262) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase --onto A B &&\n'
            span_id: 263
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rebase --skip &&\n' span_id:264) 
          (Token id:Id.Lit_Chars val:'\techo D > foo &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:267) (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:268) 
          (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:269) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:270) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:271) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:272)
        )
      }
    )
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-rebase.sh)})
    (C {(set_fake_editor)})
    (command.ShFunction
      name: test_fail_interactive_rebase
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FAKE_LINES)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_Number '$1'))}
                              spids: [304]
                            )
                          ]
                        )
                        (C {(shift)})
                        (C {(export)} {(FAKE_LINES)})
                        (C {(test_must_fail)} {(git)} {(rebase)} {(-i)} {(DQ ($ Id.VSub_At '$@'))})
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (unchanged)' span_id:345))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:350) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:351) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_fail_interactive_rebase "1 2" --onto A B &&\n'
            span_id: 352
          ) (Token id:Id.Lit_Chars val:'\techo C > foo &&\n' span_id:353) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:354) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:357) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse C) $(git rev-parse HEAD^)\n'
            span_id: 358
          ) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:360) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:361)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (skip)' span_id:368))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_fail_interactive_rebase "2" --onto A B &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\techo D > foo &&\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:379) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:380) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse D) $(git rev-parse HEAD)\n'
            span_id: 381
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:383)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (squash)' span_id:390))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:394) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:395) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_fail_interactive_rebase "1 squash 2" --onto A B &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\techo C > foo &&\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:400) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:401) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:402) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse C) $(git rev-parse HEAD)\n'
            span_id: 403
          ) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:404) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:405) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:406)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (fixup without conflict)' span_id:413))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:419) 
          (Token
            id: Id.Lit_Chars
            val: '\tFAKE_LINES="1 fixup 2" git rebase -i B &&\n'
            span_id: 420
          ) (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:421) 
          (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\t$(git rev-parse C) $(git rev-parse HEAD)\n' span_id:423) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse D) $(git rev-parse HEAD)\n'
            span_id: 424
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:426)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (double edit)' span_id:433))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:437) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:438) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:439) 
          (Token
            id: Id.Lit_Chars
            val: '\tFAKE_LINES="edit 1 edit 2" git rebase -i B &&\n'
            span_id: 440
          ) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:441) 
          (Token id:Id.Lit_Chars val:'\techo something > foo &&\n' span_id:442) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:443) 
          (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:444) (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:446) (Token id:Id.Lit_Chars val:'\t$(git rev-parse C) $(git rev-parse HEAD^)\n' span_id:447) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse D) $(git rev-parse HEAD)\n'
            span_id: 448
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:450)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git rebase -i (exec)' span_id:457))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:461) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard D &&\n' span_id:462) (Token id:Id.Lit_Chars val:'\tclear_hook_input &&\n' span_id:463) 
          (Token
            id: Id.Lit_Chars
            val: '\tFAKE_LINES="edit 1 exec_false 2" git rebase -i B &&\n'
            span_id: 464
          ) (Token id:Id.Lit_Chars val:'\techo something >bar &&\n' span_id:465) 
          (Token id:Id.Lit_Chars val:'\tgit add bar &&\n' span_id:466) (Token id:Id.Lit_Chars val:'\t# Fails because of exec false\n' span_id:467) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rebase --continue &&\n'
            span_id: 468
          ) (Token id:Id.Lit_Chars val:'\tgit rebase --continue &&\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\techo rebase >expected.args &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\tcat >expected.data <<-EOF &&\n' span_id:471) 
          (Token
            id: Id.Lit_Chars
            val: '\t$(git rev-parse C) $(git rev-parse HEAD^)\n'
            span_id: 472
          ) (Token id:Id.Lit_Chars val:'\t$(git rev-parse D) $(git rev-parse HEAD)\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:474) (Token id:Id.Lit_Chars val:'\tverify_hook_input\n' span_id:475)
        )
      }
    )
    (C {(test_done)})
  ]
)