(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git rerere\n'> <'\n'> <'! [fifth] version1\n'> <' ! [first] first\n'> 
                <'  ! [fourth] version1\n'> <'   ! [master] initial\n'> <'    ! [second] prefer first over second\n'> <'     ! [third] version2\n'> 
                <'------\n'> <'     + [third] version2\n'> <'+      [fifth] version1\n'> <'  +    [fourth] version1\n'> 
                <'+ +  + [third^] third\n'> <'    -  [second] prefer first over second\n'> <' +  +  [first] first\n'> <'    +  [second^] second\n'> 
                <'++++++ [master] initial\n'>
              )
            }
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {(SQ <setup>)} 
      {(SQ <'\n'> <'\tcat >a1 <<-\\EOF &&\n'> <'\tSome title\n'> <'\t==========\n'> <'\tWhether '>) 
        (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'tis nobler in the mind to suffer\n'> 
          <'\tThe slings and arrows of outrageous fortune,\n'> <'\tOr to take arms against a sea of troubles,\n'> <'\tAnd by opposing end them? To die: to sleep;\n'> 
          <'\tNo more; and by a sleep to say we end\n'> <'\tThe heart-ache and the thousand natural shocks\n'> <'\tThat flesh is heir to, '>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'tis a consummation\n'> <'\tDevoutly to be wish'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'d.\n'> <'\tEOF\n'> <'\n'> <'\tgit add a1 &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -q -a -m initial &&\n'> <'\n'> <'\tcat >>a1 <<-\\EOF &&\n'> <'\tSome title\n'> <'\t==========\n'> <'\tTo die, to sleep;\n'> 
          <'\tTo sleep: perchance to dream: ay, there'>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'s the rub;\n'> <'\tFor in that sleep of death what dreams may come\n'> 
          <'\tWhen we have shuffled off this mortal coil,\n'> <'\tMust give us pause: there'>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'s the respect\n'> <'\tThat makes calamity of so long life;\n'> <'\tEOF\n'> <'\n'> 
          <'\tgit checkout -b first &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -q -a -m first &&\n'> <'\n'> 
          <'\tgit checkout -b second master &&\n'> <'\tgit show first:a1 |\n'> 
          <'\tsed -e "s/To die, t/To die! T/" -e "s/Some title/Some Title/" >a1 &&\n'> <'\techo "* END *" >>a1 &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -q -a -m second\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'nothing recorded without rerere'>)} 
      {
        (SQ <'\n'> <'\trm -rf .git/rr-cache &&\n'> <'\tgit config rerere.enabled false &&\n'> 
          <'\ttest_must_fail git merge first &&\n'> <'\t! test -d .git/rr-cache\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'activate rerere, old style (conflicting merge)'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tmkdir .git/rr-cache &&\n'> 
          <'\ttest_might_fail git config --unset rerere.enabled &&\n'> <'\ttest_must_fail git merge first &&\n'> <'\n'> <'\tsha1=$(perl -pe "s/\t.*//" .git/MERGE_RR) &&\n'> 
          <'\trr=.git/rr-cache/$sha1 &&\n'> <'\tgrep "^=======\\$" $rr/preimage &&\n'> <'\t! test -f $rr/postimage &&\n'> 
          <'\t! test -f $rr/thisimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere.enabled works, too'>)} 
      {
        (SQ <'\n'> <'\trm -rf .git/rr-cache &&\n'> <'\tgit config rerere.enabled true &&\n'> 
          <'\tgit reset --hard &&\n'> <'\ttest_must_fail git merge first &&\n'> <'\n'> <'\tsha1=$(perl -pe "s/\t.*//" .git/MERGE_RR) &&\n'> 
          <'\trr=.git/rr-cache/$sha1 &&\n'> <'\tgrep ^=======$ $rr/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'set up rr-cache'>)} 
      {
        (SQ <'\n'> <'\trm -rf .git/rr-cache &&\n'> <'\tgit config rerere.enabled true &&\n'> 
          <'\tgit reset --hard &&\n'> <'\ttest_must_fail git merge first &&\n'> <'\tsha1=$(perl -pe "s/\t.*//" .git/MERGE_RR) &&\n'> 
          <'\trr=.git/rr-cache/$sha1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rr-cache looks sane'>)} 
      {
        (SQ <'\n'> <'\t# no postimage or thisimage yet\n'> <'\t! test -f $rr/postimage &&\n'> 
          <'\t! test -f $rr/thisimage &&\n'> <'\n'> <'\t# preimage has right number of lines\n'> 
          <'\tcnt=$(sed -ne "/^<<<<<<</,/^>>>>>>>/p" $rr/preimage | wc -l) &&\n'> <'\techo $cnt &&\n'> <'\ttest $cnt = 13\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere diff'>)} 
      {
        (SQ <'\n'> <'\tgit show first:a1 >a1 &&\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\t--- a/a1\n'> 
          <'\t+++ b/a1\n'> <'\t@@ -1,4 +1,4 @@\n'> <'\t-Some Title\n'> <'\t+Some title\n'> <'\t ==========\n'> <'\t Whether '>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'tis nobler in the mind to suffer\n'> 
          <'\t The slings and arrows of outrageous fortune,\n'> <'\t@@ -8,21 +8,11 @@\n'> <'\t The heart-ache and the thousand natural shocks\n'> 
          <'\t That flesh is heir to, '>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'tis a consummation\n'> <'\t Devoutly to be wish'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'d.\n'> <'\t-<<<<<<<\n'> <'\t-Some Title\n'> <'\t-==========\n'> <'\t-To die! To sleep;\n'> 
          <'\t-=======\n'> <'\t Some title\n'> <'\t ==========\n'> <'\t To die, to sleep;\n'> <'\t->>>>>>>\n'> 
          <'\t To sleep: perchance to dream: ay, there'>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'s the rub;\n'> <'\t For in that sleep of death what dreams may come\n'> 
          <'\t When we have shuffled off this mortal coil,\n'> <'\t Must give us pause: there'>
        ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
        (SQ <'s the respect\n'> <'\t That makes calamity of so long life;\n'> <'\t-<<<<<<<\n'> 
          <'\t-=======\n'> <'\t-* END *\n'> <'\t->>>>>>>\n'> <'\tEOF\n'> <'\tgit rerere diff >out &&\n'> <'\ttest_cmp expect out\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere status'>)} 
      {
        (SQ <'\n'> <'\techo a1 >expect &&\n'> <'\tgit rerere status >out &&\n'> 
          <'\ttest_cmp expect out\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'first postimage wins'>)} 
      {
        (SQ <'\n'> <'\tgit show first:a1 | sed "s/To die: t/To die! T/" >expect &&\n'> <'\n'> 
          <'\tgit commit -q -a -m "prefer first over second" &&\n'> <'\ttest -f $rr/postimage &&\n'> <'\n'> 
          <'\toldmtimepost=$(test-chmtime -v -60 $rr/postimage | cut -f 1) &&\n'> <'\n'> <'\tgit checkout -b third master &&\n'> 
          <'\tgit show second^:a1 | sed "s/To die: t/To die! T/" >a1 &&\n'> <'\tgit commit -q -a -m third &&\n'> <'\n'> <'\ttest_must_fail git merge first &&\n'> 
          <'\t# rerere kicked in\n'> <'\t! grep "^=======\\$" a1 &&\n'> <'\ttest_cmp expect a1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere updates postimage timestamp'>)} 
      {
        (SQ <'\n'> <'\tnewmtimepost=$(test-chmtime -v +0 $rr/postimage | cut -f 1) &&\n'> 
          <'\ttest $oldmtimepost -lt $newmtimepost\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere clear'>)} 
      {
        (SQ <'\n'> <'\tmv $rr/postimage .git/post-saved &&\n'> 
          <'\techo "$sha1\ta1" | perl -pe "y/\\012/\\000/" >.git/MERGE_RR &&\n'> <'\tgit rerere clear &&\n'> <'\t! test -d $rr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'leftover directory'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tmkdir -p $rr &&\n'> 
          <'\ttest_must_fail git merge first &&\n'> <'\ttest -f $rr/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'missing preimage'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tmkdir -p $rr &&\n'> 
          <'\tcp .git/post-saved $rr/postimage &&\n'> <'\ttest_must_fail git merge first &&\n'> <'\ttest -f $rr/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'set up for garbage collection tests'>)} 
      {
        (SQ <'\n'> <'\tmkdir -p $rr &&\n'> <'\techo Hello >$rr/preimage &&\n'> 
          <'\techo World >$rr/postimage &&\n'> <'\n'> <'\tsha2=4000000000000000000000000000000000000000 &&\n'> <'\trr2=.git/rr-cache/$sha2 &&\n'> 
          <'\tmkdir $rr2 &&\n'> <'\techo Hello >$rr2/preimage &&\n'> <'\n'> <'\talmost_15_days_ago=$((60-15*86400)) &&\n'> 
          <'\tjust_over_15_days_ago=$((-1-15*86400)) &&\n'> <'\talmost_60_days_ago=$((60-60*86400)) &&\n'> <'\tjust_over_60_days_ago=$((-1-60*86400)) &&\n'> <'\n'> 
          <'\ttest-chmtime =$just_over_60_days_ago $rr/preimage &&\n'> <'\ttest-chmtime =$almost_60_days_ago $rr/postimage &&\n'> 
          <'\ttest-chmtime =$almost_15_days_ago $rr2/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'gc preserves young or recently used records'>)} 
      {
        (SQ <'\n'> <'\tgit rerere gc &&\n'> <'\ttest -f $rr/preimage &&\n'> 
          <'\ttest -f $rr2/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'old records rest in peace'>)} 
      {
        (SQ <'\n'> <'\ttest-chmtime =$just_over_60_days_ago $rr/postimage &&\n'> 
          <'\ttest-chmtime =$just_over_15_days_ago $rr2/preimage &&\n'> <'\tgit rerere gc &&\n'> <'\t! test -f $rr/preimage &&\n'> <'\t! test -f $rr2/preimage\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup: file2 added differently in two branches'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\n'> <'\tgit checkout -b fourth &&\n'> 
          <'\techo Hallo >file2 &&\n'> <'\tgit add file2 &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m version1 &&\n'> <'\n'> 
          <'\tgit checkout third &&\n'> <'\techo Bello >file2 &&\n'> <'\tgit add file2 &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m version2 &&\n'> <'\n'> <'\ttest_must_fail git merge fourth &&\n'> <'\techo Cello >file2 &&\n'> <'\tgit add file2 &&\n'> 
          <'\tgit commit -m resolution\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'resolution was recorded properly'>)} 
      {
        (SQ <'\n'> <'\techo Cello >expected &&\n'> <'\n'> <'\tgit reset --hard HEAD~2 &&\n'> 
          <'\tgit checkout -b fifth &&\n'> <'\n'> <'\techo Hallo >file3 &&\n'> <'\tgit add file3 &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m version1 &&\n'> <'\n'> <'\tgit checkout third &&\n'> <'\techo Bello >file3 &&\n'> <'\tgit add file3 &&\n'> 
          <'\ttest_tick &&\n'> <'\tgit commit -m version2 &&\n'> <'\tgit tag version2 &&\n'> <'\n'> 
          <'\ttest_must_fail git merge fifth &&\n'> <'\ttest_cmp expected file3 &&\n'> <'\ttest_must_fail git update-index --refresh\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <rerere.autoupdate>)} 
      {
        (SQ <'\n'> <'\tgit config rerere.autoupdate true &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout version2 &&\n'> <'\ttest_must_fail git merge fifth &&\n'> <'\tgit update-index --refresh\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'merge --rerere-autoupdate'>)} 
      {
        (SQ <'\n'> <'\ttest_might_fail git config --unset rerere.autoupdate &&\n'> 
          <'\tgit reset --hard &&\n'> <'\tgit checkout version2 &&\n'> <'\ttest_must_fail git merge --rerere-autoupdate fifth &&\n'> 
          <'\tgit update-index --refresh\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'merge --no-rerere-autoupdate'>)} 
      {
        (SQ <'\n'> <'\theadblob=$(git rev-parse version2:file3) &&\n'> 
          <'\tmergeblob=$(git rev-parse fifth:file3) &&\n'> <'\tcat >expected <<-EOF &&\n'> <'\t100644 $headblob 2\tfile3\n'> <'\t100644 $mergeblob 3\tfile3\n'> 
          <'\tEOF\n'> <'\n'> <'\tgit config rerere.autoupdate true &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout version2 &&\n'> <'\ttest_must_fail git merge --no-rerere-autoupdate fifth &&\n'> <'\tgit ls-files -u >actual &&\n'> 
          <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'set up an unresolved merge'>)} 
      {
        (SQ <'\n'> <'\theadblob=$(git rev-parse version2:file3) &&\n'> 
          <'\tmergeblob=$(git rev-parse fifth:file3) &&\n'> <'\tcat >expected.unresolved <<-EOF &&\n'> <'\t100644 $headblob 2\tfile3\n'> 
          <'\t100644 $mergeblob 3\tfile3\n'> <'\tEOF\n'> <'\n'> <'\ttest_might_fail git config --unset rerere.autoupdate &&\n'> 
          <'\tgit reset --hard &&\n'> <'\tgit checkout version2 &&\n'> <'\tfifth=$(git rev-parse fifth) &&\n'> <'\techo "$fifth\t\tbranch '>
        ) <fifth> 
        (SQ <' of ." |\n'> <'\tgit fmt-merge-msg >msg &&\n'> 
          <'\tancestor=$(git merge-base version2 fifth) &&\n'> <'\ttest_must_fail git merge-recursive "$ancestor" -- HEAD fifth &&\n'> <'\n'> 
          <'\tgit ls-files --stage >failedmerge &&\n'> <'\tcp file3 file3.conflict &&\n'> <'\n'> <'\tgit ls-files -u >actual &&\n'> 
          <'\ttest_cmp expected.unresolved actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'explicit rerere'>)} 
      {
        (SQ <'\n'> <'\ttest_might_fail git config --unset rerere.autoupdate &&\n'> 
          <'\tgit rm -fr --cached . &&\n'> <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> 
          <'\ttest_must_fail git update-index --refresh -q &&\n'> <'\n'> <'\tgit rerere &&\n'> <'\tgit ls-files -u >actual &&\n'> 
          <'\ttest_cmp expected.unresolved actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'explicit rerere with autoupdate'>)} 
      {
        (SQ <'\n'> <'\tgit config rerere.autoupdate true &&\n'> <'\tgit rm -fr --cached . &&\n'> 
          <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> <'\ttest_must_fail git update-index --refresh -q &&\n'> <'\n'> 
          <'\tgit rerere &&\n'> <'\tgit update-index --refresh\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'explicit rerere --rerere-autoupdate overrides'>)} 
      {
        (SQ <'\n'> <'\tgit config rerere.autoupdate false &&\n'> <'\tgit rm -fr --cached . &&\n'> 
          <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> <'\tgit rerere &&\n'> <'\tgit ls-files -u >actual1 &&\n'> <'\n'> 
          <'\tgit rm -fr --cached . &&\n'> <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> 
          <'\tgit rerere --rerere-autoupdate &&\n'> <'\tgit update-index --refresh &&\n'> <'\n'> <'\tgit rm -fr --cached . &&\n'> 
          <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> <'\tgit rerere --rerere-autoupdate --no-rerere-autoupdate &&\n'> 
          <'\tgit ls-files -u >actual2 &&\n'> <'\n'> <'\tgit rm -fr --cached . &&\n'> <'\tgit update-index --index-info <failedmerge &&\n'> 
          <'\tcp file3.conflict file3 &&\n'> <'\tgit rerere --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate &&\n'> 
          <'\tgit update-index --refresh &&\n'> <'\n'> <'\ttest_cmp expected.unresolved actual1 &&\n'> <'\ttest_cmp expected.unresolved actual2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere --no-no-rerere-autoupdate'>)} 
      {
        (SQ <'\n'> <'\tgit rm -fr --cached . &&\n'> 
          <'\tgit update-index --index-info <failedmerge &&\n'> <'\tcp file3.conflict file3 &&\n'> 
          <'\ttest_must_fail git rerere --no-no-rerere-autoupdate 2>err &&\n'> <'\ttest_i18ngrep [Uu]sage err &&\n'> <'\ttest_must_fail git update-index --refresh\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'rerere -h'>)} 
      {(SQ <'\n'> <'\ttest_must_fail git rerere -h >help &&\n'> <'\ttest_i18ngrep [Uu]sage help\n'>)}
    )
    (command.ShFunction
      name: concat_insert
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:last)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [690]
                )
              ]
            )
            (C {<shift>})
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<cat>} {<early>})
                (C {<printf>} {(DQ <'%s'> <Id.Lit_Other '\\'> <n>)} {(DQ ($ Id.VSub_At '$@'))})
                (C {<cat>} {<late>} {(DQ ($ Id.VSub_DollarName '$last'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: count_pre_post
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{<find>} {<'.git/rr-cache/'>} {<-type>} {<f>} {<-name>} {(DQ <'preimage*'>)}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<actual>})]
                  do_fork: T
                )
                (C {<test_line_count>} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$1'))} {<actual>})
                (command.Simple
                  words: [{<find>} {<'.git/rr-cache/'>} {<-type>} {<f>} {<-name>} {(DQ <'postimage*'>)}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<actual>})]
                  do_fork: T
                )
                (C {<test_line_count>} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$2'))} {<actual>})
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'rerere gc'>)} 
      {
        (SQ <'\n'> <'\tfind .git/rr-cache -type f >original &&\n'> 
          <'\txargs test-chmtime -172800 <original &&\n'> <'\n'> <'\tgit -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&\n'> 
          <'\tfind .git/rr-cache -type f >actual &&\n'> <'\ttest_cmp original actual &&\n'> <'\n'> 
          <'\tgit -c gc.rerereresolved=5 -c gc.rerereunresolved=0 rerere gc &&\n'> <'\tfind .git/rr-cache -type f >actual &&\n'> <'\ttest_cmp original actual &&\n'> <'\n'> 
          <'\tgit -c gc.rerereresolved=0 -c gc.rerereunresolved=0 rerere gc &&\n'> <'\tfind .git/rr-cache -type f >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (command.ShFunction
      name: merge_conflict_resolve
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<git>} {<reset>} {<--hard>})
                (C {<test_must_fail>} {<git>} {<merge>} {<six.1>})
                (command.Simple
                  words: [{<concat_insert>} {<short>} {<6.1>} {<6.2>}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<file1>})]
                  do_fork: T
                )
                (command.Simple
                  words: [{<concat_insert>} {<long>} {<6.1>} {<6.2>}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<file2>})]
                  do_fork: T
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'multiple identical conflicts'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\n'> <'\ttest_seq 1 6 >early &&\n'> <'\t>late &&\n'> 
          <'\ttest_seq 11 15 >short &&\n'> <'\ttest_seq 111 120 >long &&\n'> <'\tconcat_insert short >file1 &&\n'> 
          <'\tconcat_insert long >file2 &&\n'> <'\tgit add file1 file2 &&\n'> <'\tgit commit -m base &&\n'> <'\tgit tag base &&\n'> 
          <'\tgit checkout -b six.1 &&\n'> <'\tconcat_insert short 6.1 >file1 &&\n'> <'\tconcat_insert long 6.1 >file2 &&\n'> 
          <'\tgit add file1 file2 &&\n'> <'\tgit commit -m 6.1 &&\n'> <'\tgit checkout -b six.2 HEAD^ &&\n'> 
          <'\tconcat_insert short 6.2 >file1 &&\n'> <'\tconcat_insert long 6.2 >file2 &&\n'> <'\tgit add file1 file2 &&\n'> <'\tgit commit -m 6.2 &&\n'> 
          <'\n'> <'\t# At this point, six.1 and six.2\n'> <'\t# - derive from common ancestor that has two files\n'> 
          <'\t#   1...6 7 11..15 (file1) and 1...6 7 111..120 (file2)\n'> <'\t# - six.1 replaces these 7s with 6.1\n'> <'\t# - six.2 replaces these 7s with 6.2\n'> <'\n'> 
          <'\tmerge_conflict_resolve &&\n'> <'\n'> <'\t# Check that rerere knows that file1 and file2 have conflicts\n'> <'\n'> 
          <'\tprintf "%s\\n" file1 file2 >expect &&\n'> <'\tgit ls-files -u | sed -e "s/^.*\t//" | sort -u >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\n'> <'\tgit rerere status | sort >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> 
          <'\tgit rerere remaining >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\tcount_pre_post 2 0 &&\n'> <'\n'> 
          <'\t# Pretend that the conflicts were made quite some time ago\n'> <'\tfind .git/rr-cache/ -type f | xargs test-chmtime -172800 &&\n'> <'\n'> 
          <'\t# Unresolved entries have not expired yet\n'> <'\tgit -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&\n'> <'\tcount_pre_post 2 0 &&\n'> 
          <'\n'> <'\t# Unresolved entries have expired\n'> 
          <'\tgit -c gc.rerereresolved=5 -c gc.rerereunresolved=1 rerere gc &&\n'> <'\tcount_pre_post 0 0 &&\n'> <'\n'> <'\t# Recreate the conflicted state\n'> 
          <'\tmerge_conflict_resolve &&\n'> <'\tcount_pre_post 2 0 &&\n'> <'\n'> <'\t# Clear it\n'> <'\tgit rerere clear &&\n'> 
          <'\tcount_pre_post 0 0 &&\n'> <'\n'> <'\t# Recreate the conflicted state\n'> <'\tmerge_conflict_resolve &&\n'> 
          <'\tcount_pre_post 2 0 &&\n'> <'\n'> <'\t# We resolved file1 and file2\n'> <'\tgit rerere &&\n'> <'\t>expect &&\n'> 
          <'\tgit rerere remaining >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\t# We must have recorded both of them\n'> 
          <'\tcount_pre_post 2 2 &&\n'> <'\n'> <'\t# Now we should be able to resolve them both\n'> <'\tgit reset --hard &&\n'> 
          <'\ttest_must_fail git merge six.1 &&\n'> <'\tgit rerere &&\n'> <'\n'> <'\t>expect &&\n'> <'\tgit rerere remaining >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\n'> <'\tconcat_insert short 6.1 6.2 >file1.expect &&\n'> 
          <'\tconcat_insert long 6.1 6.2 >file2.expect &&\n'> <'\ttest_cmp file1.expect file1 &&\n'> <'\ttest_cmp file2.expect file2 &&\n'> <'\n'> 
          <'\t# Forget resolution for file2\n'> <'\tgit rerere forget file2 &&\n'> <'\techo file2 >expect &&\n'> <'\tgit rerere status >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tcount_pre_post 2 1 &&\n'> <'\n'> <'\t# file2 already has correct resolution, so record it again\n'> 
          <'\tgit rerere &&\n'> <'\n'> <'\t# Pretend that the resolutions are old again\n'> 
          <'\tfind .git/rr-cache/ -type f | xargs test-chmtime -172800 &&\n'> <'\n'> <'\t# Resolved entries have not expired yet\n'> 
          <'\tgit -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&\n'> <'\n'> <'\tcount_pre_post 2 2 &&\n'> <'\n'> <'\t# Resolved entries have expired\n'> 
          <'\tgit -c gc.rerereresolved=1 -c gc.rerereunresolved=5 rerere gc &&\n'> <'\tcount_pre_post 0 0\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)