(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) 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] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <setup>)} {(SQ <'\n'> <'\tcat >a1 <<-\\EOF &&\n'> <'\tSome title\n'> <'\t==========\n'> <'\tWhether '>) (EscapedLiteralPart token:<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, '> ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'tis a consummation\n'> <'\tDevoutly to be wish'>) (EscapedLiteralPart token:<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'> ) (EscapedLiteralPart token:<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'> ) (EscapedLiteralPart token:<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 '> ) (EscapedLiteralPart token:<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, '> ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'tis a consummation\n'> <'\t Devoutly to be wish'>) (EscapedLiteralPart token:<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'> ) (EscapedLiteralPart token:<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'> ) (EscapedLiteralPart token:<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'>)} ) (FuncDef name: concat_insert body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:last) op: Equal rhs: {($ VSub_Number '$1')} spids: [690] ) ] spids: [690] ) (C {(shift)}) (AndOr children: [ (C {(cat)} {(early)}) (AndOr children: [ (C {(printf)} {(DQ ('%s') (Lit_Other '\\') (n))} {(DQ ($ VSub_At '$@'))}) (C {(cat)} {(late)} {(DQ ($ VSub_Name '$last'))}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [687] ) spids: [682 686] ) (FuncDef name: count_pre_post body: (BraceGroup children: [ (AndOr children: [ (SimpleCommand words: [{(find)} {(.git/rr-cache/)} {(-type)} {(f)} {(-name)} {(DQ ('preimage*'))}] redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(actual)} spids:[750])] ) (AndOr children: [ (C {(test_line_count)} {(Lit_Other '=')} {(DQ ($ VSub_Number '$1'))} {(actual)}) (AndOr children: [ (SimpleCommand words: [ {(find)} {(.git/rr-cache/)} {(-type)} {(f)} {(-name)} {(DQ ('postimage*'))} ] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(actual)} spids: [783] ) ] ) (C {(test_line_count)} {(Lit_Other '=')} {(DQ ($ VSub_Number '$2'))} {(actual)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [733] ) spids: [728 732] ) (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'> ) } ) (FuncDef name: merge_conflict_resolve body: (BraceGroup children: [ (AndOr children: [ (C {(git)} {(reset)} {(--hard)}) (AndOr children: [ (C {(test_must_fail)} {(git)} {(merge)} {(six.1)}) (AndOr children: [ (SimpleCommand words: [{(concat_insert)} {(short)} {(6.1)} {(6.2)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(file1)} spids: [868] ) ] ) (SimpleCommand words: [{(concat_insert)} {(long)} {(6.1)} {(6.2)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(file2)} spids: [882] ) ] ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [833] ) spids: [828 832] ) (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)}) ] )