(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test cherry-picking with --ff option'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\techo first > file1 &&\n'> <'\tgit add file1 &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m "first" &&\n'> <'\tgit tag first &&\n'> <'\n'> <'\tgit checkout -b other &&\n'> <'\techo second >> file1 &&\n'> 
          <'\tgit add file1 &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "second" &&\n'> <'\tgit tag second\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry-pick using --ff fast forwards'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tgit reset --hard first &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit cherry-pick --ff second &&\n'> <'\ttest "$(git rev-parse --verify HEAD)" = "$(git rev-parse --verify second)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry-pick not using --ff does not fast forwards'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tgit reset --hard first &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit cherry-pick second &&\n'> <'\ttest "$(git rev-parse --verify HEAD)" != "$(git rev-parse --verify second)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'merge setup'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tgit reset --hard first &&\n'> 
          <'\techo new line >A &&\n'> <'\tgit add A &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "add line to A" A &&\n'> 
          <'\tgit tag A &&\n'> <'\tgit checkout -b side first &&\n'> <'\techo new line >B &&\n'> <'\tgit add B &&\n'> 
          <'\ttest_tick &&\n'> <'\tgit commit -m "add line to B" B &&\n'> <'\tgit tag B &&\n'> <'\tgit checkout master &&\n'> 
          <'\tgit merge side &&\n'> <'\tgit tag C &&\n'> <'\tgit checkout -b new A\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry-pick a non-merge with --ff and -m should fail'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard A -- &&\n'> 
          <'\ttest_must_fail git cherry-pick --ff -m 1 B &&\n'> <'\tgit diff --exit-code A --\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry pick a merge with --ff but without -m should fail'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard A -- &&\n'> <'\ttest_must_fail git cherry-pick --ff C &&\n'> 
          <'\tgit diff --exit-code A --\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry pick with --ff a merge (1)'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard A -- &&\n'> <'\tgit cherry-pick --ff -m 1 C &&\n'> 
          <'\tgit diff --exit-code C &&\n'> <'\ttest "$(git rev-parse --verify HEAD)" = "$(git rev-parse --verify C)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry pick with --ff a merge (2)'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard B -- &&\n'> <'\tgit cherry-pick --ff -m 2 C &&\n'> 
          <'\tgit diff --exit-code C &&\n'> <'\ttest "$(git rev-parse --verify HEAD)" = "$(git rev-parse --verify C)"\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'cherry pick a merge relative to nonexistent parent with --ff should fail'>)} {(SQ <'\n'> <'\tgit reset --hard B -- &&\n'> <'\ttest_must_fail git cherry-pick --ff -m 3 C\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'cherry pick a root commit with --ff'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard first -- &&\n'> <'\tgit rm file1 &&\n'> 
          <'\techo first >file2 &&\n'> <'\tgit add file2 &&\n'> <'\tgit commit --amend -m "file2" &&\n'> <'\tgit cherry-pick --ff first &&\n'> 
          <'\ttest "$(git rev-parse --verify HEAD)" = "1df192cd8bc58a2b275d842cede4d221ad9000d1"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cherry-pick --ff on unborn branch'>)} 
      {
        (SQ <'\n'> <'\tgit checkout --orphan unborn &&\n'> <'\tgit rm --cached -r . &&\n'> 
          <'\trm -rf * &&\n'> <'\tgit cherry-pick --ff first &&\n'> <'\ttest_cmp_rev first HEAD\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)