(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <"test cherry-pick and revert with conflicts\n"> <"\n"> <"  -\n"> 
                <"  + picked: rewrites foo to c\n"> <"  + base: rewrites foo to b\n"> <"  + initial: writes foo as a, unrelated as unrelated\n"> <"\n">
              )
            }
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: pristine_detach
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (C {(git)} {(checkout)} {(-f)} {(DQ ($ VSub_Number "$1") ("^0"))})
                (AndOr
                  children: [
                    (C {(git)} {(read-tree)} {(-u)} {(--reset)} {(HEAD)})
                    (C {(git)} {(clean)} {(-d)} {(-f)} {(-f)} {(-q)} {(-x)})
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [26]
        )
      spids: [21 25]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <"\n"> <"\n"> <"\techo unrelated >unrelated &&\n"> <"\tgit add unrelated &&\n"> 
          <"\ttest_commit initial foo a &&\n"> <"\ttest_commit base foo b &&\n"> <"\ttest_commit picked foo c &&\n"> 
          <"\ttest_commit --signoff picked-signed foo d &&\n"> <"\tgit config advice.detachedhead false\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick does not advance HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> <"\thead=$(git rev-parse HEAD) &&\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tnewhead=$(git rev-parse HEAD) &&\n"> <"\n"> <"\ttest \"$head\" = \"$newhead\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"advice from failed cherry-pick">)} 
      {
        (DQ ("\n") ("\tpristine_detach initial &&\n") ("\n") ("\tpicked=") 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\$">) ("(git rev-parse --short picked) &&\n") ("\tcat <<-EOF >expected &&\n") ("\terror: could not apply ") 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\$">) ("picked... picked\n") ("\thint: after resolving the conflicts, mark the corrected paths\n") 
          ("\thint: with 'git add <paths>' or 'git rm <paths>'\n") ("\thint: and commit the result with 'git commit'\n") ("\tEOF\n") 
          ("\ttest_must_fail git cherry-pick picked 2>actual &&\n") ("\n") ("\ttest_i18ncmp expected actual\n")
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"advice from failed cherry-pick --no-commit">)} 
      {
        (DQ ("\n") ("\tpristine_detach initial &&\n") ("\n") ("\tpicked=") 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\$">) ("(git rev-parse --short picked) &&\n") ("\tcat <<-EOF >expected &&\n") ("\terror: could not apply ") 
          (EscapedLiteralPart token:<Lit_EscapedChar "\\$">) ("picked... picked\n") ("\thint: after resolving the conflicts, mark the corrected paths\n") 
          ("\thint: with 'git add <paths>' or 'git rm <paths>'\n") ("\tEOF\n") ("\ttest_must_fail git cherry-pick --no-commit picked 2>actual &&\n") ("\n") 
          ("\ttest_i18ncmp expected actual\n")
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick sets CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> 
          <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"successful cherry-pick does not set CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit cherry-pick base &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"cherry-pick --no-commit does not set CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit cherry-pick --no-commit base &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\techo foo > foo &&\n"> 
          <"\ttest_must_fail git cherry-pick base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"cherry-pick --strategy=resolve w/dirty tree does not set CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\techo foo > foo &&\n"> 
          <"\ttest_must_fail git cherry-pick --strategy=resolve base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"GIT_CHERRY_PICK_HELP suppresses CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t(\n"> 
          <"\t\tGIT_CHERRY_PICK_HELP=\"and then do something else\" &&\n"> <"\t\texport GIT_CHERRY_PICK_HELP &&\n"> <"\t\ttest_must_fail git cherry-pick picked\n"> <"\t) &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"git reset clears CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tgit reset &&\n"> <"\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed commit does not clear CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\ttest_must_fail git commit &&\n"> <"\n"> <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"cancelled commit does not clear CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\techo resolved >foo &&\n"> <"\tgit add foo &&\n"> <"\tgit update-index --refresh -q &&\n"> 
          <"\ttest_must_fail git diff-index --exit-code HEAD &&\n"> <"\t(\n"> <"\t\tGIT_EDITOR=false &&\n"> <"\t\texport GIT_EDITOR &&\n"> 
          <"\t\ttest_must_fail git commit\n"> <"\t) &&\n"> <"\n"> <"\ttest_cmp_rev picked CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"successful commit clears CHERRY_PICK_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\techo resolved >foo &&\n"> <"\tgit add foo &&\n"> <"\tgit commit &&\n"> <"\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick produces dirty index">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\ttest_must_fail git update-index --refresh -q &&\n"> 
          <"\ttest_must_fail git diff-index --exit-code HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick registers participants in index">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t{\n"> <"\t\tgit checkout base -- foo &&\n"> 
          <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout initial -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> 
          <"\t\tgit checkout picked -- foo &&\n"> <"\t\tgit ls-files --stage foo\n"> <"\t} > stages &&\n"> <"\tsed \"\n"> <"\t\t1 s/ 0\t/ 1\t/\n"> 
          <"\t\t2 s/ 0\t/ 2\t/\n"> <"\t\t3 s/ 0\t/ 3\t/\n"> <"\t\" < stages > expected &&\n"> <"\tgit read-tree -u --reset HEAD &&\n"> 
          <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\tgit ls-files --stage --unmerged > actual &&\n"> 
          <"\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick describes conflict in work tree">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tcat <<-EOF > expected &&\n"> 
          <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t=======\n"> <"\tc\n"> <"\t>>>>>>> objid picked\n"> <"\tEOF\n"> <"\n"> 
          <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"diff3 -m style">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit config merge.conflictstyle diff3 &&\n"> 
          <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t||||||| parent of objid picked\n"> <"\tb\n"> <"\t=======\n"> <"\tc\n"> 
          <"\t>>>>>>> objid picked\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> <"\n"> 
          <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"revert also handles conflicts sanely">)} 
      {
        (SQ <"\n"> <"\tgit config --unset merge.conflictstyle &&\n"> <"\tpristine_detach initial &&\n"> 
          <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t=======\n"> <"\tb\n"> <"\t>>>>>>> parent of objid picked\n"> 
          <"\tEOF\n"> <"\t{\n"> <"\t\tgit checkout picked -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> 
          <"\t\tgit checkout initial -- foo &&\n"> <"\t\tgit ls-files --stage foo &&\n"> <"\t\tgit checkout base -- foo &&\n"> 
          <"\t\tgit ls-files --stage foo\n"> <"\t} > stages &&\n"> <"\tsed \"\n"> <"\t\t1 s/ 0\t/ 1\t/\n"> <"\t\t2 s/ 0\t/ 2\t/\n"> 
          <"\t\t3 s/ 0\t/ 3\t/\n"> <"\t\" < stages > expected-stages &&\n"> <"\tgit read-tree -u --reset HEAD &&\n"> <"\n"> 
          <"\thead=$(git rev-parse HEAD) &&\n"> <"\ttest_must_fail git revert picked &&\n"> <"\tnewhead=$(git rev-parse HEAD) &&\n"> 
          <"\tgit ls-files --stage --unmerged > actual-stages &&\n"> <"\n"> <"\ttest \"$head\" = \"$newhead\" &&\n"> <"\ttest_must_fail git update-index --refresh -q &&\n"> 
          <"\ttest_must_fail git diff-index --exit-code HEAD &&\n"> <"\ttest_cmp expected-stages actual-stages &&\n"> 
          <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed revert sets REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> 
          <"\ttest_cmp_rev picked REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"successful revert does not set REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\tgit revert base &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"revert --no-commit sets REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\tgit revert --no-commit base &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_cmp_rev base REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"revert w/dirty tree does not set REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach base &&\n"> <"\techo foo > foo &&\n"> 
          <"\ttest_must_fail git revert base &&\n"> <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> 
          <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"GIT_CHERRY_PICK_HELP does not suppress REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\t(\n"> 
          <"\t\tGIT_CHERRY_PICK_HELP=\"and then do something else\" &&\n"> <"\t\tGIT_REVERT_HELP=\"and then do something else, again\" &&\n"> 
          <"\t\texport GIT_CHERRY_PICK_HELP GIT_REVERT_HELP &&\n"> <"\t\ttest_must_fail git revert picked\n"> <"\t) &&\n"> 
          <"\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n"> <"\ttest_cmp_rev picked REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"git reset clears REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> 
          <"\tgit reset &&\n"> <"\ttest_must_fail git rev-parse --verify REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed commit does not clear REVERT_HEAD">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git revert picked &&\n"> 
          <"\ttest_must_fail git commit &&\n"> <"\ttest_cmp_rev picked REVERT_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"revert conflict, diff3 -m style">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\tgit config merge.conflictstyle diff3 &&\n"> 
          <"\tcat <<-EOF > expected &&\n"> <"\t<<<<<<< HEAD\n"> <"\ta\n"> <"\t||||||| objid picked\n"> <"\tc\n"> <"\t=======\n"> <"\tb\n"> 
          <"\t>>>>>>> parent of objid picked\n"> <"\tEOF\n"> <"\n"> <"\ttest_must_fail git revert picked &&\n"> <"\n"> 
          <"\tsed \"s/[a-f0-9]*\\.\\.\\./objid/\" foo > actual &&\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"failed cherry-pick does not forget -s">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> 
          <"\ttest_must_fail git cherry-pick -s picked &&\n"> <"\ttest_i18ngrep -e \"Signed-off-by\" .git/MERGE_MSG\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commit after failed cherry-pick does not add duplicated -s">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> 
          <"\ttest_must_fail git cherry-pick -s picked-signed &&\n"> <"\tgit commit -a -s &&\n"> <"\ttest $(git show -s |grep -c \"Signed-off-by\") = 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commit after failed cherry-pick adds -s at the right place">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> 
          <"\n"> <"\tgit commit -a -s &&\n"> <"\n"> <"\t# Do S-o-b and Conflicts appear in the right order?\n"> 
          <"\tcat <<-\\EOF >expect &&\n"> <"\tSigned-off-by: C O Mitter <committer@example.com>\n"> <"\t# Conflicts:\n"> <"\tEOF\n"> 
          <"\tgrep -e \"^# Conflicts:\" -e ">
        ) (Lit_Other "^") (Signed-off-by) 
        (SQ <" <.git/COMMIT_EDITMSG >actual &&\n"> <"\ttest_cmp expect actual &&\n"> <"\n"> 
          <"\tcat <<-\\EOF >expected &&\n"> <"\tpicked\n"> <"\n"> <"\tSigned-off-by: C O Mitter <committer@example.com>\n"> <"\tEOF\n"> <"\n"> 
          <"\tgit show -s --pretty=format:%B >actual &&\n"> <"\ttest_cmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commit --amend -s places the sign-off at the right place">)} 
      {
        (SQ <"\n"> <"\tpristine_detach initial &&\n"> <"\ttest_must_fail git cherry-pick picked &&\n"> 
          <"\n"> <"\t# emulate old-style conflicts block\n"> <"\tmv .git/MERGE_MSG .git/MERGE_MSG+ &&\n"> 
          <"\tsed -e \"/^# Conflicts:/,\\$s/^# *//\" <.git/MERGE_MSG+ >.git/MERGE_MSG &&\n"> <"\n"> <"\tgit commit -a &&\n"> <"\tgit commit --amend -s &&\n"> <"\n"> 
          <"\t# Do S-o-b and Conflicts appear in the right order?\n"> <"\tcat <<-\\EOF >expect &&\n"> <"\tSigned-off-by: C O Mitter <committer@example.com>\n"> 
          <"\tConflicts:\n"> <"\tEOF\n"> <"\tgrep -e \"^Conflicts:\" -e ">
        ) (Lit_Other "^") (Signed-off-by) 
        (SQ <" <.git/COMMIT_EDITMSG >actual &&\n"> <"\ttest_cmp expect actual\n">)
      }
    )
    (C {(test_done)})
  ]
)