(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git rebase assorted tests\n'> <'\n'> 
                <'This test runs git rebase and checks that the author information is not lost\n'> <'among other things.\n'>
              )
            }
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_AUTHOR_NAME)
          op: assign_op.Equal
          rhs: {<author> <Id.Lit_Splice '@name'>}
          spids: [26]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_AUTHOR_EMAIL)
          op: assign_op.Equal
          rhs: {<bogus> <Id.Lit_Splice '@email'> <Id.Lit_Splice '@address'>}
          spids: [30]
        )
      ]
    )
    (C {<export>} {<GIT_AUTHOR_NAME>} {<GIT_AUTHOR_EMAIL>})
    (C {<test_expect_success>} {(SQ <'prepare repository with topic branches'>)} 
      {
        (SQ <'\n'> <'\tgit config core.logAllRefUpdates true &&\n'> <'\techo First >A &&\n'> 
          <'\tgit update-index --add A &&\n'> <'\tgit commit -m "Add A." &&\n'> <'\tgit checkout -b force-3way &&\n'> <'\techo Dummy >Y &&\n'> 
          <'\tgit update-index --add Y &&\n'> <'\tgit commit -m "Add Y." &&\n'> <'\tgit checkout -b filemove &&\n'> 
          <'\tgit reset --soft master &&\n'> <'\tmkdir D &&\n'> <'\tgit mv A D/A &&\n'> <'\tgit commit -m "Move A." &&\n'> 
          <'\tgit checkout -b my-topic-branch master &&\n'> <'\techo Second >B &&\n'> <'\tgit update-index --add B &&\n'> <'\tgit commit -m "Add B." &&\n'> 
          <'\tgit checkout -f master &&\n'> <'\techo Third >>A &&\n'> <'\tgit update-index A &&\n'> <'\tgit commit -m "Modify A." &&\n'> 
          <'\tgit checkout -b side my-topic-branch &&\n'> <'\techo Side >>C &&\n'> <'\tgit add C &&\n'> <'\tgit commit -m "Add C" &&\n'> 
          <'\tgit checkout -f my-topic-branch &&\n'> <'\tgit tag topic\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase on dirty worktree'>)} 
      {(SQ <'\n'> <'\techo dirty >>A &&\n'> <'\ttest_must_fail git rebase master\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase on dirty cache'>)} 
      {(SQ <'\n'> <'\tgit add A &&\n'> <'\ttest_must_fail git rebase master\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase against master'>)} 
      {(SQ <'\n'> <'\tgit reset --hard HEAD &&\n'> <'\tgit rebase master\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase, with <onto> and <upstream> specified as :/quuxery'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git branch -D torebase" &&\n'> 
          <'\tgit checkout -b torebase my-topic-branch^ &&\n'> <'\tupstream=$(git rev-parse ":/Add B") &&\n'> <'\tonto=$(git rev-parse ":/Add A") &&\n'> 
          <'\tgit rebase --onto $onto $upstream &&\n'> <'\tgit reset --hard my-topic-branch^ &&\n'> <'\tgit rebase --onto ":/Add A" ":/Add B" &&\n'> 
          <'\tgit checkout my-topic-branch\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'the rebase operation should not have destroyed author information'>)} {(SQ <'\n'> <'\t! (git log | grep "Author:" | grep "<>")\n'>)}
    )
    (C {<test_expect_success>} 
      {(SQ <'the rebase operation should not have destroyed author information (2)'>)} 
      {
        (DQ <'\n'> <'\tgit log -1 |\n'> <'\tgrep \'Author: '> ($ Id.VSub_DollarName '$GIT_AUTHOR_NAME') 
          <' <'> ($ Id.VSub_DollarName '$GIT_AUTHOR_EMAIL') <'>\'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'HEAD was detached during rebase'>)} 
      {(SQ <'\n'> <'\ttest $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase from ambiguous branch name'>)} 
      {(SQ <'\n'> <'\tgit checkout -b topic side &&\n'> <'\tgit rebase master\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'rebase off of the previous branch using "-"'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tgit checkout HEAD^ &&\n'> 
          <'\tgit rebase @{-1} >expect.messages &&\n'> <'\tgit merge-base master HEAD >expect.forkpoint &&\n'> <'\n'> <'\tgit checkout master &&\n'> 
          <'\tgit checkout HEAD^ &&\n'> <'\tgit rebase - >actual.messages &&\n'> <'\tgit merge-base master HEAD >actual.forkpoint &&\n'> <'\n'> 
          <'\ttest_cmp expect.forkpoint actual.forkpoint &&\n'> <'\t# the next one is dubious---we may want to say "-",\n'> <'\t# instead of @{-1}, in the message\n'> 
          <'\ttest_i18ncmp expect.messages actual.messages\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase a single mode change'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tgit branch -D topic &&\n'> <'\techo 1 >X &&\n'> 
          <'\tgit add X &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m prepare &&\n'> <'\tgit checkout -b modechange HEAD^ &&\n'> 
          <'\techo 1 >X &&\n'> <'\tgit add X &&\n'> <'\ttest_chmod +x A &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m modechange &&\n'> 
          <'\tGIT_TRACE=1 git rebase master\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase is not broken by diff.renames'>)} 
      {
        (SQ <'\n'> <'\ttest_config diff.renames copies &&\n'> <'\tgit checkout filemove &&\n'> 
          <'\tGIT_TRACE=1 git rebase force-3way\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup: recover'>)} 
      {
        (SQ <'\n'> <'\ttest_might_fail git rebase --abort &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout modechange\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'Show verbose error when HEAD could not be detached'>)} 
      {
        (SQ <'\n'> <'\t>B &&\n'> <'\ttest_must_fail git rebase topic 2>output.err >output.out &&\n'> 
          <
'\ttest_i18ngrep "The following untracked working tree files would be overwritten by checkout:" output.err &&\n'
          > <'\ttest_i18ngrep B output.err\n'>
        )
      }
    )
    (C {<rm>} {<-f>} {<B>})
    (C {<test_expect_success>} {(SQ <'fail when upstream arg is missing and not on branch'>)} 
      {(SQ <'\n'> <'\tgit checkout topic &&\n'> <'\ttest_must_fail git rebase\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'fail when upstream arg is missing and not configured'>)} 
      {(SQ <'\n'> <'\tgit checkout -b no-config topic &&\n'> <'\ttest_must_fail git rebase\n'>)}
    )
    (C {<test_expect_success>} 
      {(SQ <'default to common base in @{upstream}s reflog if no upstream arg'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b default-base master &&\n'> 
          <'\tgit checkout -b default topic &&\n'> <'\tgit config branch.default.remote . &&\n'> 
          <'\tgit config branch.default.merge refs/heads/default-base &&\n'> <'\tgit rebase &&\n'> <'\tgit rev-parse --verify default-base >expect &&\n'> 
          <'\tgit rev-parse default~1 >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit checkout default-base &&\n'> 
          <'\tgit reset --hard HEAD^ &&\n'> <'\tgit checkout default &&\n'> <'\tgit rebase &&\n'> 
          <'\tgit rev-parse --verify default-base >expect &&\n'> <'\tgit rev-parse default~1 >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry-picked commits and fork-point work together'>)} 
      {
        (SQ <'\n'> <'\tgit checkout default-base &&\n'> <'\techo Amended >A &&\n'> 
          <'\tgit commit -a --no-edit --amend &&\n'> <'\ttest_commit B B &&\n'> <'\ttest_commit new_B B "New B" &&\n'> <'\ttest_commit C C &&\n'> 
          <'\tgit checkout default &&\n'> <'\tgit reset --hard default-base@{4} &&\n'> <'\ttest_commit D D &&\n'> 
          <'\tgit cherry-pick -2 default-base^ &&\n'> <'\ttest_commit final_B B "Final B" &&\n'> <'\tgit rebase &&\n'> <'\techo Amended >expect &&\n'> 
          <'\ttest_cmp A expect &&\n'> <'\techo "Final B" >expect &&\n'> <'\ttest_cmp B expect &&\n'> <'\techo C >expect &&\n'> 
          <'\ttest_cmp C expect &&\n'> <'\techo D >expect &&\n'> <'\ttest_cmp D expect\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase -q is quiet'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b quiet topic &&\n'> 
          <'\tgit rebase -q master >output.out 2>&1 &&\n'> <'\ttest_must_be_empty output.out\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'Rebase a commit that sprinkles CRs in'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\techo "One"\n'> <'\t\techo "TwoQ"\n'> <'\t\techo "Three"\n'> 
          <'\t\techo "FQur"\n'> <'\t\techo "Five"\n'> <'\t) | q_to_cr >CR &&\n'> <'\tgit add CR &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -a -m "A file with a line with CR" &&\n'> <'\tgit tag file-with-cr &&\n'> <'\tgit checkout HEAD^0 &&\n'> 
          <'\tgit rebase --onto HEAD^^ HEAD^ &&\n'> <'\tgit diff --exit-code file-with-cr:CR HEAD:CR\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase can copy notes'>)} 
      {
        (SQ <'\n'> <'\tgit config notes.rewrite.rebase true &&\n'> 
          <'\tgit config notes.rewriteRef "refs/notes/*" &&\n'> <'\ttest_commit n1 &&\n'> <'\ttest_commit n2 &&\n'> <'\ttest_commit n3 &&\n'> 
          <'\tgit notes add -m"a note" n3 &&\n'> <'\tgit rebase --onto n1 n2 &&\n'> <'\ttest "a note" = "$(git notes show HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase -m can copy notes'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard n3 &&\n'> <'\tgit rebase -m --onto n1 n2 &&\n'> 
          <'\ttest "a note" = "$(git notes show HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rebase commit with an ancient timestamp'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\n'> 
          <'\t>old.one && git add old.one && test_tick &&\n'> <'\tgit commit --date="@12345 +0400" -m "Old one" &&\n'> 
          <'\t>old.two && git add old.two && test_tick &&\n'> <'\tgit commit --date="@23456 +0500" -m "Old two" &&\n'> 
          <'\t>old.three && git add old.three && test_tick &&\n'> <'\tgit commit --date="@34567 +0600" -m "Old three" &&\n'> <'\n'> 
          <'\tgit cat-file commit HEAD^^ >actual &&\n'> <'\tgrep "author .* 12345 +0400$" actual &&\n'> <'\tgit cat-file commit HEAD^ >actual &&\n'> 
          <'\tgrep "author .* 23456 +0500$" actual &&\n'> <'\tgit cat-file commit HEAD >actual &&\n'> <'\tgrep "author .* 34567 +0600$" actual &&\n'> <'\n'> 
          <'\tgit rebase --onto HEAD^^ HEAD^ &&\n'> <'\n'> <'\tgit cat-file commit HEAD >actual &&\n'> <'\tgrep "author .* 34567 +0600$" actual\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)