(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 cherry-pick and revert with conflicts\n'
                  span_id: 6
                ) (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'  -\n' span_id:8) 
                (Token
                  id: Id.Lit_Chars
                  val: '  + picked: rewrites foo to c\n'
                  span_id: 9
                ) (Token id:Id.Lit_Chars val:'  + base: rewrites foo to b\n' span_id:10) 
                (Token
                  id: Id.Lit_Chars
                  val: '  + initial: writes foo as a, unrelated as unrelated\n'
                  span_id: 11
                ) (Token id:Id.Lit_Chars val:'\n' span_id:12)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: pristine_detach
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(git)} {(checkout)} {(-f)} {(DQ ($ Id.VSub_Number '$1') ('^0'))})
                (C {(git)} {(read-tree)} {(-u)} {(--reset)} {(HEAD)})
                (C {(git)} {(clean)} {(-d)} {(-f)} {(-f)} {(-q)} {(-x)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) (Token id:Id.Lit_Chars val:'\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\techo unrelated >unrelated &&\n' span_id:80) (Token id:Id.Lit_Chars val:'\tgit add unrelated &&\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\ttest_commit initial foo a &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\ttest_commit base foo b &&\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\ttest_commit picked foo c &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\ttest_commit --signoff picked-signed foo d &&\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\tgit config advice.detachedhead false\n' span_id:86) (Token id:Id.Lit_Chars val:'\n' span_id:87)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed cherry-pick does not advance HEAD' span_id:94))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:99) (Token id:Id.Lit_Chars val:'\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\thead=$(git rev-parse HEAD) &&\n' span_id:101) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick picked &&\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'\tnewhead=$(git rev-parse HEAD) &&\n' span_id:103) (Token id:Id.Lit_Chars val:'\n' span_id:104) 
          (Token id:Id.Lit_Chars val:'\ttest "$head" = "$newhead"\n' span_id:105)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'advice from failed cherry-pick' span_id:112))} 
      {
        (DQ ('\n') ('\tpristine_detach initial &&\n') ('\n') ('\tpicked=') 
          (word_part.EscapedLiteral
            token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:120)
          ) ('(git rev-parse --short picked) &&\n') ('\tcat <<-EOF >expected &&\n') ('\terror: could not apply ') 
          (word_part.EscapedLiteral
            token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:124)
          ) ('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 (Token id:Id.Lit_Chars val:'advice from failed cherry-pick --no-commit' span_id:139))} 
      {
        (DQ ('\n') ('\tpristine_detach initial &&\n') ('\n') ('\tpicked=') 
          (word_part.EscapedLiteral
            token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:147)
          ) ('(git rev-parse --short picked) &&\n') ('\tcat <<-EOF >expected &&\n') ('\terror: could not apply ') 
          (word_part.EscapedLiteral
            token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:151)
          ) ('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 (Token id:Id.Lit_Chars val:'failed cherry-pick sets CHERRY_PICK_HEAD' span_id:165))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:170) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick picked &&\n' span_id:171) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev picked CHERRY_PICK_HEAD\n'
            span_id: 172
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'successful cherry-pick does not set CHERRY_PICK_HEAD'
            span_id: 179
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:184) (Token id:Id.Lit_Chars val:'\tgit cherry-pick base &&\n' span_id:185) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n'
            span_id: 186
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cherry-pick --no-commit does not set CHERRY_PICK_HEAD'
            span_id: 193
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:198) (Token id:Id.Lit_Chars val:'\tgit cherry-pick --no-commit base &&\n' span_id:199) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n'
            span_id: 200
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cherry-pick w/dirty tree does not set CHERRY_PICK_HEAD'
            span_id: 207
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\techo foo > foo &&\n' span_id:213) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick base &&\n'
            span_id: 214
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n' span_id:215)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cherry-pick --strategy=resolve w/dirty tree does not set CHERRY_PICK_HEAD'
            span_id: 224
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:228) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:229) (Token id:Id.Lit_Chars val:'\techo foo > foo &&\n' span_id:230) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick --strategy=resolve base &&\n'
            span_id: 231
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n' span_id:232)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'GIT_CHERRY_PICK_HELP suppresses CHERRY_PICK_HEAD'
            span_id: 239
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\t(\n' span_id:245) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_CHERRY_PICK_HELP="and then do something else" &&\n'
            span_id: 246
          ) (Token id:Id.Lit_Chars val:'\t\texport GIT_CHERRY_PICK_HELP &&\n' span_id:247) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git cherry-pick picked\n'
            span_id: 248
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:249) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n'
            span_id: 250
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git reset clears CHERRY_PICK_HEAD' span_id:257))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\n' span_id:263) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 264
          ) (Token id:Id.Lit_Chars val:'\tgit reset &&\n' span_id:265) 
          (Token id:Id.Lit_Chars val:'\n' span_id:266) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n' span_id:267)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed commit does not clear CHERRY_PICK_HEAD' span_id:274))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:278) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:279) (Token id:Id.Lit_Chars val:'\n' span_id:280) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 281
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit &&\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\n' span_id:283) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev picked CHERRY_PICK_HEAD\n' span_id:284)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cancelled commit does not clear CHERRY_PICK_HEAD'
            span_id: 291
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 298
          ) (Token id:Id.Lit_Chars val:'\techo resolved >foo &&\n' span_id:299) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\tgit update-index --refresh -q &&\n' span_id:301) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git diff-index --exit-code HEAD &&\n'
            span_id: 302
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'\t\tGIT_EDITOR=false &&\n' span_id:304) (Token id:Id.Lit_Chars val:'\t\texport GIT_EDITOR &&\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit\n' span_id:306) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:307) (Token id:Id.Lit_Chars val:'\n' span_id:308) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev picked CHERRY_PICK_HEAD\n'
            span_id: 309
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'successful commit clears CHERRY_PICK_HEAD' span_id:316))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:321) (Token id:Id.Lit_Chars val:'\n' span_id:322) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 323
          ) (Token id:Id.Lit_Chars val:'\techo resolved >foo &&\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\tgit commit &&\n' span_id:326) 
          (Token id:Id.Lit_Chars val:'\n' span_id:327) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD\n' span_id:328)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed cherry-pick produces dirty index' span_id:335))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:339) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:340) (Token id:Id.Lit_Chars val:'\n' span_id:341) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 342
          ) (Token id:Id.Lit_Chars val:'\n' span_id:343) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git update-index --refresh -q &&\n'
            span_id: 344
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git diff-index --exit-code HEAD\n' span_id:345)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'failed cherry-pick registers participants in index'
            span_id: 352
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\t{\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout base -- foo &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo &&\n' span_id:360) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout initial -- foo &&\n' span_id:361) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo &&\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout picked -- foo &&\n' span_id:363) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo\n' span_id:364) 
          (Token id:Id.Lit_Chars val:'\t} > stages &&\n' span_id:365) (Token id:Id.Lit_Chars val:'\tsed "\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'\t\t1 s/ 0\t/ 1\t/\n' span_id:367) (Token id:Id.Lit_Chars val:'\t\t2 s/ 0\t/ 2\t/\n' span_id:368) 
          (Token id:Id.Lit_Chars val:'\t\t3 s/ 0\t/ 3\t/\n' span_id:369) (Token id:Id.Lit_Chars val:'\t" < stages > expected &&\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\tgit read-tree -u --reset HEAD &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\n' span_id:372) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 373
          ) (Token id:Id.Lit_Chars val:'\tgit ls-files --stage --unmerged > actual &&\n' span_id:374) 
          (Token id:Id.Lit_Chars val:'\n' span_id:375) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:376)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'failed cherry-pick describes conflict in work tree'
            span_id: 383
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:388) (Token id:Id.Lit_Chars val:'\tcat <<-EOF > expected &&\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\t<<<<<<< HEAD\n' span_id:390) (Token id:Id.Lit_Chars val:'\ta\n' span_id:391) (Token id:Id.Lit_Chars val:'\t=======\n' span_id:392) 
          (Token id:Id.Lit_Chars val:'\tc\n' span_id:393) (Token id:Id.Lit_Chars val:'\t>>>>>>> objid picked\n' span_id:394) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:395) (Token id:Id.Lit_Chars val:'\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\n' span_id:398) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed "s/[a-f0-9]*\\.\\.\\./objid/" foo > actual &&\n'
            span_id: 399
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:400)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff3 -m style' span_id:407))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:411) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:412) (Token id:Id.Lit_Chars val:'\tgit config merge.conflictstyle diff3 &&\n' span_id:413) 
          (Token id:Id.Lit_Chars val:'\tcat <<-EOF > expected &&\n' span_id:414) (Token id:Id.Lit_Chars val:'\t<<<<<<< HEAD\n' span_id:415) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:416) (Token id:Id.Lit_Chars val:'\t||||||| parent of objid picked\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\tb\n' span_id:418) (Token id:Id.Lit_Chars val:'\t=======\n' span_id:419) (Token id:Id.Lit_Chars val:'\tc\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\t>>>>>>> objid picked\n' span_id:421) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:422) (Token id:Id.Lit_Chars val:'\n' span_id:423) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cherry-pick picked &&\n'
            span_id: 424
          ) (Token id:Id.Lit_Chars val:'\n' span_id:425) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed "s/[a-f0-9]*\\.\\.\\./objid/" foo > actual &&\n'
            span_id: 426
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:427)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'revert also handles conflicts sanely' span_id:434))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:438) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset merge.conflictstyle &&\n'
            span_id: 439
          ) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:440) 
          (Token id:Id.Lit_Chars val:'\tcat <<-EOF > expected &&\n' span_id:441) (Token id:Id.Lit_Chars val:'\t<<<<<<< HEAD\n' span_id:442) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:443) (Token id:Id.Lit_Chars val:'\t=======\n' span_id:444) (Token id:Id.Lit_Chars val:'\tb\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\t>>>>>>> parent of objid picked\n' span_id:446) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:447) (Token id:Id.Lit_Chars val:'\t{\n' span_id:448) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout picked -- foo &&\n' span_id:449) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo &&\n' span_id:450) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout initial -- foo &&\n' span_id:451) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo &&\n' span_id:452) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout base -- foo &&\n' span_id:453) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --stage foo\n' span_id:454) 
          (Token id:Id.Lit_Chars val:'\t} > stages &&\n' span_id:455) (Token id:Id.Lit_Chars val:'\tsed "\n' span_id:456) 
          (Token id:Id.Lit_Chars val:'\t\t1 s/ 0\t/ 1\t/\n' span_id:457) (Token id:Id.Lit_Chars val:'\t\t2 s/ 0\t/ 2\t/\n' span_id:458) 
          (Token id:Id.Lit_Chars val:'\t\t3 s/ 0\t/ 3\t/\n' span_id:459) (Token id:Id.Lit_Chars val:'\t" < stages > expected-stages &&\n' span_id:460) 
          (Token id:Id.Lit_Chars val:'\tgit read-tree -u --reset HEAD &&\n' span_id:461) (Token id:Id.Lit_Chars val:'\n' span_id:462) 
          (Token id:Id.Lit_Chars val:'\thead=$(git rev-parse HEAD) &&\n' span_id:463) (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert picked &&\n' span_id:464) 
          (Token id:Id.Lit_Chars val:'\tnewhead=$(git rev-parse HEAD) &&\n' span_id:465) (Token id:Id.Lit_Chars val:'\tgit ls-files --stage --unmerged > actual-stages &&\n' span_id:466) 
          (Token id:Id.Lit_Chars val:'\n' span_id:467) (Token id:Id.Lit_Chars val:'\ttest "$head" = "$newhead" &&\n' span_id:468) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git update-index --refresh -q &&\n'
            span_id: 469
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git diff-index --exit-code HEAD &&\n' span_id:470) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected-stages actual-stages &&\n'
            span_id: 471
          ) (Token id:Id.Lit_Chars val:'\tsed "s/[a-f0-9]*\\.\\.\\./objid/" foo > actual &&\n' span_id:472) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:473)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed revert sets REVERT_HEAD' span_id:480))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:484) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:485) (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert picked &&\n' span_id:486) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp_rev picked REVERT_HEAD\n' span_id:487)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'successful revert does not set REVERT_HEAD' span_id:494))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:498) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach base &&\n' span_id:499) (Token id:Id.Lit_Chars val:'\tgit revert base &&\n' span_id:500) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n'
            span_id: 501
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify REVERT_HEAD\n' span_id:502)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'revert --no-commit sets REVERT_HEAD' span_id:509))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:513) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach base &&\n' span_id:514) (Token id:Id.Lit_Chars val:'\tgit revert --no-commit base &&\n' span_id:515) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n'
            span_id: 516
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev base REVERT_HEAD\n' span_id:517)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'revert w/dirty tree does not set REVERT_HEAD' span_id:524))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:528) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach base &&\n' span_id:529) (Token id:Id.Lit_Chars val:'\techo foo > foo &&\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert base &&\n' span_id:531) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n'
            span_id: 532
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify REVERT_HEAD\n' span_id:533)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'GIT_CHERRY_PICK_HELP does not suppress REVERT_HEAD'
            span_id: 540
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:544) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:545) (Token id:Id.Lit_Chars val:'\t(\n' span_id:546) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_CHERRY_PICK_HELP="and then do something else" &&\n'
            span_id: 547
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_REVERT_HELP="and then do something else, again" &&\n'
            span_id: 548
          ) (Token id:Id.Lit_Chars val:'\t\texport GIT_CHERRY_PICK_HELP GIT_REVERT_HELP &&\n' span_id:549) 
          (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git revert picked\n' span_id:550) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:551) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify CHERRY_PICK_HEAD &&\n'
            span_id: 552
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev picked REVERT_HEAD\n' span_id:553)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git reset clears REVERT_HEAD' span_id:560))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:564) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:565) (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert picked &&\n' span_id:566) 
          (Token id:Id.Lit_Chars val:'\tgit reset &&\n' span_id:567) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify REVERT_HEAD\n' span_id:568)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed commit does not clear REVERT_HEAD' span_id:575))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:579) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:580) (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert picked &&\n' span_id:581) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git commit &&\n' span_id:582) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev picked REVERT_HEAD\n' span_id:583)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'revert conflict, diff3 -m style' span_id:590))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:594) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:595) (Token id:Id.Lit_Chars val:'\tgit config merge.conflictstyle diff3 &&\n' span_id:596) 
          (Token id:Id.Lit_Chars val:'\tcat <<-EOF > expected &&\n' span_id:597) (Token id:Id.Lit_Chars val:'\t<<<<<<< HEAD\n' span_id:598) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:599) (Token id:Id.Lit_Chars val:'\t||||||| objid picked\n' span_id:600) 
          (Token id:Id.Lit_Chars val:'\tc\n' span_id:601) (Token id:Id.Lit_Chars val:'\t=======\n' span_id:602) (Token id:Id.Lit_Chars val:'\tb\n' span_id:603) 
          (Token id:Id.Lit_Chars val:'\t>>>>>>> parent of objid picked\n' span_id:604) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:605) (Token id:Id.Lit_Chars val:'\n' span_id:606) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git revert picked &&\n' span_id:607) (Token id:Id.Lit_Chars val:'\n' span_id:608) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed "s/[a-f0-9]*\\.\\.\\./objid/" foo > actual &&\n'
            span_id: 609
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:610)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed cherry-pick does not forget -s' span_id:617))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:621) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:622) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick -s picked &&\n' span_id:623) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep -e "Signed-off-by" .git/MERGE_MSG\n'
            span_id: 624
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit after failed cherry-pick does not add duplicated -s'
            span_id: 631
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:635) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:636) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick -s picked-signed &&\n' span_id:637) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -s &&\n' span_id:638) (Token id:Id.Lit_Chars val:'\ttest $(git show -s |grep -c "Signed-off-by") = 1\n' span_id:639)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit after failed cherry-pick adds -s at the right place'
            span_id: 646
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:650) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:651) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick picked &&\n' span_id:652) 
          (Token id:Id.Lit_Chars val:'\n' span_id:653) (Token id:Id.Lit_Chars val:'\tgit commit -a -s &&\n' span_id:654) 
          (Token id:Id.Lit_Chars val:'\n' span_id:655) (Token id:Id.Lit_Chars val:'\t# Do S-o-b and Conflicts appear in the right order?\n' span_id:656) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expect &&\n' span_id:657) (Token id:Id.Lit_Chars val:'\tSigned-off-by: C O Mitter <committer@example.com>\n' span_id:658) 
          (Token id:Id.Lit_Chars val:'\t# Conflicts:\n' span_id:659) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:660) 
          (Token id:Id.Lit_Chars val:'\tgrep -e "^# Conflicts:" -e ' span_id:661)
        ) (Id.Lit_Other '^') (Signed-off-by) 
        (SQ (Token id:Id.Lit_Chars val:' <.git/COMMIT_EDITMSG >actual &&\n' span_id:666) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:667) (Token id:Id.Lit_Chars val:'\n' span_id:668) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:669) (Token id:Id.Lit_Chars val:'\tpicked\n' span_id:670) (Token id:Id.Lit_Chars val:'\n' span_id:671) 
          (Token
            id: Id.Lit_Chars
            val: '\tSigned-off-by: C O Mitter <committer@example.com>\n'
            span_id: 672
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:673) (Token id:Id.Lit_Chars val:'\n' span_id:674) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show -s --pretty=format:%B >actual &&\n'
            span_id: 675
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:676)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit --amend -s places the sign-off at the right place'
            span_id: 683
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:687) 
          (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:688) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick picked &&\n' span_id:689) 
          (Token id:Id.Lit_Chars val:'\n' span_id:690) (Token id:Id.Lit_Chars val:'\t# emulate old-style conflicts block\n' span_id:691) 
          (Token
            id: Id.Lit_Chars
            val: '\tmv .git/MERGE_MSG .git/MERGE_MSG+ &&\n'
            span_id: 692
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "/^# Conflicts:/,\\$s/^# *//" <.git/MERGE_MSG+ >.git/MERGE_MSG &&\n'
            span_id: 693
          ) (Token id:Id.Lit_Chars val:'\n' span_id:694) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a &&\n' span_id:695) (Token id:Id.Lit_Chars val:'\tgit commit --amend -s &&\n' span_id:696) 
          (Token id:Id.Lit_Chars val:'\n' span_id:697) (Token id:Id.Lit_Chars val:'\t# Do S-o-b and Conflicts appear in the right order?\n' span_id:698) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expect &&\n' span_id:699) (Token id:Id.Lit_Chars val:'\tSigned-off-by: C O Mitter <committer@example.com>\n' span_id:700) 
          (Token id:Id.Lit_Chars val:'\tConflicts:\n' span_id:701) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:702) 
          (Token id:Id.Lit_Chars val:'\tgrep -e "^Conflicts:" -e ' span_id:703)
        ) (Id.Lit_Other '^') (Signed-off-by) 
        (SQ (Token id:Id.Lit_Chars val:' <.git/COMMIT_EDITMSG >actual &&\n' span_id:708) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:709)
        )
      }
    )
    (C {(test_done)})
  ]
)