#!/bin/sh global test_description := ''merge-recursive backend test'' source ./test-lib.sh test_expect_success 'setup 1' ' echo hello >a && o0=$(git hash-object a) && cp a b && cp a c && mkdir d && cp a d/e && test_tick && git add a b c d/e && git commit -m initial && c0=$(git rev-parse --verify HEAD) && git branch side && git branch df-1 && git branch df-2 && git branch df-3 && git branch remove && git branch submod && git branch copy && git branch rename && git branch rename-ln && echo hello >>a && cp a d/e && o1=$(git hash-object a) && git add a d/e && test_tick && git commit -m "master modifies a and d/e" && c1=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o1 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o1 d/e" echo "100644 $o1 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'setup 2' ' rm -rf [abcd] && git checkout side && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual && echo goodbye >>a && o2=$(git hash-object a) && git add a && test_tick && git commit -m "side modifies a" && c2=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o2 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o2 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'setup 3' ' rm -rf [abcd] && git checkout df-1 && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual && rm -f b && mkdir b && echo df-1 >b/c && git add b/c && o3=$(git hash-object b/c) && test_tick && git commit -m "df-1 makes b/c" && c3=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o3 b/c" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o3 0 b/c" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'setup 4' ' rm -rf [abcd] && git checkout df-2 && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual && rm -f a && mkdir a && echo df-2 >a/c && git add a/c && o4=$(git hash-object a/c) && test_tick && git commit -m "df-2 makes a/c" && c4=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o4 a/c" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o4 0 a/c" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'setup 5' ' rm -rf [abcd] && git checkout remove && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual && rm -f b && echo remove-conflict >a && git add a && git rm b && o5=$(git hash-object a) && test_tick && git commit -m "remove removes b and modifies a" && c5=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o5 a" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o5 0 a" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'setup 6' ' rm -rf [abcd] && git checkout df-3 && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" ) >expected && test_cmp expected actual && rm -fr d && echo df-3 >d && git add d && o6=$(git hash-object d) && test_tick && git commit -m "df-3 makes d" && c6=$(git rev-parse --verify HEAD) && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "100644 blob $o0 a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o6 d" echo "100644 $o0 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o6 0 d" ) >expected && test_cmp expected actual ' test_expect_success 'setup 7' ' git checkout submod && git rm d/e && test_tick && git commit -m "remove d/e" && git update-index --add --cacheinfo 160000 $c1 d && test_tick && git commit -m "make d/ a submodule" ' test_expect_success 'setup 8' ' git checkout rename && git mv a e && git add e && test_tick && git commit -m "rename a->e" && c7=$(git rev-parse --verify HEAD) && git checkout rename-ln && git mv a e && test_ln_s_add e a && test_tick && git commit -m "rename a->e, symlink a->e" && oln=$(printf e | git hash-object --stdin) ' test_expect_success 'setup 9' ' git checkout copy && cp a e && git add e && test_tick && git commit -m "copy a->e" ' test_expect_success 'merge-recursive simple' ' rm -fr [abcd] && git checkout -f "$c2" && test_expect_code 1 git merge-recursive "$c0" -- "$c2" "$c1" ' test_expect_success 'merge-recursive result' ' git ls-files -s >actual && ( echo "100644 $o0 1 a" echo "100644 $o2 2 a" echo "100644 $o1 3 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'fail if the index has unresolved entries' ' rm -fr [abcd] && git checkout -f "$c1" && test_must_fail git merge "$c5" && test_must_fail git merge "$c5" 2> out && test_i18ngrep "not possible because you have unmerged files" out && git add -u && test_must_fail git merge "$c5" 2> out && test_i18ngrep "You have not concluded your merge" out && rm -f .git/MERGE_HEAD && test_must_fail git merge "$c5" 2> out && test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out ' test_expect_success 'merge-recursive remove conflict' ' rm -fr [abcd] && git checkout -f "$c1" && test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c5" ' test_expect_success 'merge-recursive remove conflict' ' git ls-files -s >actual && ( echo "100644 $o0 1 a" echo "100644 $o1 2 a" echo "100644 $o5 3 a" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive d/f simple' ' rm -fr [abcd] && git reset --hard && git checkout -f "$c1" && git merge-recursive "$c0" -- "$c1" "$c3" ' test_expect_success 'merge-recursive result' ' git ls-files -s >actual && ( echo "100644 $o1 0 a" echo "100644 $o3 0 b/c" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive d/f conflict' ' rm -fr [abcd] && git reset --hard && git checkout -f "$c1" && test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c4" ' test_expect_success 'merge-recursive d/f conflict result' ' git ls-files -s >actual && ( echo "100644 $o0 1 a" echo "100644 $o1 2 a" echo "100644 $o4 0 a/c" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive d/f conflict the other way' ' rm -fr [abcd] && git reset --hard && git checkout -f "$c4" && test_expect_code 1 git merge-recursive "$c0" -- "$c4" "$c1" ' test_expect_success 'merge-recursive d/f conflict result the other way' ' git ls-files -s >actual && ( echo "100644 $o0 1 a" echo "100644 $o1 3 a" echo "100644 $o4 0 a/c" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive d/f conflict' ' rm -fr [abcd] && git reset --hard && git checkout -f "$c1" && test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c6" ' test_expect_success 'merge-recursive d/f conflict result' ' git ls-files -s >actual && ( echo "100644 $o1 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o6 3 d" echo "100644 $o0 1 d/e" echo "100644 $o1 2 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive d/f conflict' ' rm -fr [abcd] && git reset --hard && git checkout -f "$c6" && test_expect_code 1 git merge-recursive "$c0" -- "$c6" "$c1" ' test_expect_success 'merge-recursive d/f conflict result' ' git ls-files -s >actual && ( echo "100644 $o1 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o6 2 d" echo "100644 $o0 1 d/e" echo "100644 $o1 3 d/e" ) >expected && test_cmp expected actual ' test_expect_success 'reset and 3-way merge' ' git reset --hard "$c2" && git read-tree -m "$c0" "$c2" "$c1" ' test_expect_success 'reset and bind merge' ' git reset --hard master && git read-tree --prefix=M/ master && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" echo "100644 $o0 0 M/b" echo "100644 $o0 0 M/c" echo "100644 $o1 0 M/d/e" echo "100644 $o1 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual && git read-tree --prefix=a1/ master && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" echo "100644 $o0 0 M/b" echo "100644 $o0 0 M/c" echo "100644 $o1 0 M/d/e" echo "100644 $o1 0 a" echo "100644 $o1 0 a1/a" echo "100644 $o0 0 a1/b" echo "100644 $o0 0 a1/c" echo "100644 $o1 0 a1/d/e" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" ) >expected && test_cmp expected actual && git read-tree --prefix=z/ master && git ls-files -s >actual && ( echo "100644 $o1 0 M/a" echo "100644 $o0 0 M/b" echo "100644 $o0 0 M/c" echo "100644 $o1 0 M/d/e" echo "100644 $o1 0 a" echo "100644 $o1 0 a1/a" echo "100644 $o0 0 a1/b" echo "100644 $o0 0 a1/c" echo "100644 $o1 0 a1/d/e" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o1 0 d/e" echo "100644 $o1 0 z/a" echo "100644 $o0 0 z/b" echo "100644 $o0 0 z/c" echo "100644 $o1 0 z/d/e" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive w/ empty work tree - ours has rename' ' ( GIT_WORK_TREE="$PWD/ours-has-rename-work" && export GIT_WORK_TREE && GIT_INDEX_FILE="$PWD/ours-has-rename-index" && export GIT_INDEX_FILE && mkdir "$GIT_WORK_TREE" && git read-tree -i -m $c7 && git update-index --ignore-missing --refresh && git merge-recursive $c0 -- $c7 $c3 && git ls-files -s >actual-files ) 2>actual-err && >expected-err && cat >expected-files <<-EOF && 100644 $o3 0 b/c 100644 $o0 0 c 100644 $o0 0 d/e 100644 $o0 0 e EOF test_cmp expected-files actual-files && test_cmp expected-err actual-err ' test_expect_success 'merge-recursive w/ empty work tree - theirs has rename' ' ( GIT_WORK_TREE="$PWD/theirs-has-rename-work" && export GIT_WORK_TREE && GIT_INDEX_FILE="$PWD/theirs-has-rename-index" && export GIT_INDEX_FILE && mkdir "$GIT_WORK_TREE" && git read-tree -i -m $c3 && git update-index --ignore-missing --refresh && git merge-recursive $c0 -- $c3 $c7 && git ls-files -s >actual-files ) 2>actual-err && >expected-err && cat >expected-files <<-EOF && 100644 $o3 0 b/c 100644 $o0 0 c 100644 $o0 0 d/e 100644 $o0 0 e EOF test_cmp expected-files actual-files && test_cmp expected-err actual-err ' test_expect_success 'merge removes empty directories' ' git reset --hard master && git checkout -b rm && git rm d/e && git commit -mremoved-d/e && git checkout master && git merge -s recursive rm && test_must_fail test -d d ' test_expect_failure 'merge-recursive simple w/submodule' ' git checkout submod && git merge remove ' test_expect_failure 'merge-recursive simple w/submodule result' ' git ls-files -s >actual && ( echo "100644 $o5 0 a" echo "100644 $o0 0 c" echo "160000 $c1 0 d" ) >expected && test_cmp expected actual ' test_expect_success 'merge-recursive copy vs. rename' ' git checkout -f copy && git merge rename && ( git ls-tree -r HEAD && git ls-files -s ) >actual && ( echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 blob $o0 e" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" echo "100644 $o0 0 e" ) >expected && test_cmp expected actual ' test_expect_failure 'merge-recursive rename vs. rename/symlink' ' git checkout -f rename && git merge rename-ln && ( git ls-tree -r HEAD ; git ls-files -s ) >actual && ( echo "120000 blob $oln a" echo "100644 blob $o0 b" echo "100644 blob $o0 c" echo "100644 blob $o0 d/e" echo "100644 blob $o0 e" echo "120000 $oln 0 a" echo "100644 $o0 0 b" echo "100644 $o0 0 c" echo "100644 $o0 0 d/e" echo "100644 $o0 0 e" ) >expected && test_cmp expected actual ' test_expect_success 'merging with triple rename across D/F conflict' ' git reset --hard HEAD && git checkout -b main && git rm -rf . && echo "just a file" >sub1 && mkdir -p sub2 && echo content1 >sub2/file1 && echo content2 >sub2/file2 && echo content3 >sub2/file3 && mkdir simple && echo base >simple/bar && git add -A && test_tick && git commit -m base && git checkout -b other && echo more >>simple/bar && test_tick && git commit -a -m changesimplefile && git checkout main && git rm sub1 && git mv sub2 sub1 && test_tick && git commit -m changefiletodir && test_tick && git merge other ' test_expect_success 'merge-recursive remembers the names of all base trees' ' git reset --hard HEAD && # more trees than static slots used by oid_to_hex() for commit in $c0 $c2 $c4 $c5 $c6 $c7 do git rev-parse "$commit^{tree}" done >trees && # ignore the return code -- it only fails because the input is weird test_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out && # merge-recursive prints in reverse order, but we do not care sort expect && sed -n "s/^virtual //p" out | sort >actual && test_cmp expect actual ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"merge-recursive backend test">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"setup 1">)} { (SQ <"\n"> <"\n"> <"\techo hello >a &&\n"> <"\to0=$(git hash-object a) &&\n"> <"\tcp a b &&\n"> <"\tcp a c &&\n"> <"\tmkdir d &&\n"> <"\tcp a d/e &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit add a b c d/e &&\n"> <"\tgit commit -m initial &&\n"> <"\tc0=$(git rev-parse --verify HEAD) &&\n"> <"\tgit branch side &&\n"> <"\tgit branch df-1 &&\n"> <"\tgit branch df-2 &&\n"> <"\tgit branch df-3 &&\n"> <"\tgit branch remove &&\n"> <"\tgit branch submod &&\n"> <"\tgit branch copy &&\n"> <"\tgit branch rename &&\n"> <"\tgit branch rename-ln &&\n"> <"\n"> <"\techo hello >>a &&\n"> <"\tcp a d/e &&\n"> <"\to1=$(git hash-object a) &&\n"> <"\n"> <"\tgit add a d/e &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"master modifies a and d/e\" &&\n"> <"\tc1=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o1\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o1\td/e\"\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 2">)} { (SQ <"\n"> <"\n"> <"\trm -rf [abcd] &&\n"> <"\tgit checkout side &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\techo goodbye >>a &&\n"> <"\to2=$(git hash-object a) &&\n"> <"\n"> <"\tgit add a &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"side modifies a\" &&\n"> <"\tc2=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o2\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o2 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 3">)} { (SQ <"\n"> <"\n"> <"\trm -rf [abcd] &&\n"> <"\tgit checkout df-1 &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\trm -f b && mkdir b && echo df-1 >b/c && git add b/c &&\n"> <"\to3=$(git hash-object b/c) &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"df-1 makes b/c\" &&\n"> <"\tc3=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o3\tb/c\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o3 0\tb/c\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 4">)} { (SQ <"\n"> <"\n"> <"\trm -rf [abcd] &&\n"> <"\tgit checkout df-2 &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\trm -f a && mkdir a && echo df-2 >a/c && git add a/c &&\n"> <"\to4=$(git hash-object a/c) &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"df-2 makes a/c\" &&\n"> <"\tc4=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o4\ta/c\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o4 0\ta/c\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 5">)} { (SQ <"\n"> <"\n"> <"\trm -rf [abcd] &&\n"> <"\tgit checkout remove &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\trm -f b &&\n"> <"\techo remove-conflict >a &&\n"> <"\n"> <"\tgit add a &&\n"> <"\tgit rm b &&\n"> <"\to5=$(git hash-object a) &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"remove removes b and modifies a\" &&\n"> <"\tc5=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o5\ta\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o5 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 6">)} { (SQ <"\n"> <"\n"> <"\trm -rf [abcd] &&\n"> <"\tgit checkout df-3 &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\trm -fr d && echo df-3 >d && git add d &&\n"> <"\to6=$(git hash-object d) &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"df-3 makes d\" &&\n"> <"\tc6=$(git rev-parse --verify HEAD) &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o6\td\"\n"> <"\t\techo \"100644 $o0 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o6 0\td\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 7">)} { (SQ <"\n"> <"\n"> <"\tgit checkout submod &&\n"> <"\tgit rm d/e &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"remove d/e\" &&\n"> <"\tgit update-index --add --cacheinfo 160000 $c1 d &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"make d/ a submodule\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 8">)} { (SQ <"\n"> <"\tgit checkout rename &&\n"> <"\tgit mv a e &&\n"> <"\tgit add e &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"rename a->e\" &&\n"> <"\tc7=$(git rev-parse --verify HEAD) &&\n"> <"\tgit checkout rename-ln &&\n"> <"\tgit mv a e &&\n"> <"\ttest_ln_s_add e a &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"rename a->e, symlink a->e\" &&\n"> <"\toln=$(printf e | git hash-object --stdin)\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup 9">)} { (SQ <"\n"> <"\tgit checkout copy &&\n"> <"\tcp a e &&\n"> <"\tgit add e &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"copy a->e\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive simple">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit checkout -f \"$c2\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c2\" \"$c1\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o0 1\ta\"\n"> <"\t\techo \"100644 $o2 2\ta\"\n"> <"\t\techo \"100644 $o1 3\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"fail if the index has unresolved entries">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit checkout -f \"$c1\" &&\n"> <"\n"> <"\ttest_must_fail git merge \"$c5\" &&\n"> <"\ttest_must_fail git merge \"$c5\" 2> out &&\n"> <"\ttest_i18ngrep \"not possible because you have unmerged files\" out &&\n"> <"\tgit add -u &&\n"> <"\ttest_must_fail git merge \"$c5\" 2> out &&\n"> <"\ttest_i18ngrep \"You have not concluded your merge\" out &&\n"> <"\trm -f .git/MERGE_HEAD &&\n"> <"\ttest_must_fail git merge \"$c5\" 2> out &&\n"> < "\ttest_i18ngrep \"Your local changes to the following files would be overwritten by merge:\" out\n" > ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive remove conflict">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit checkout -f \"$c1\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c1\" \"$c5\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive remove conflict">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o0 1\ta\"\n"> <"\t\techo \"100644 $o1 2\ta\"\n"> <"\t\techo \"100644 $o5 3\ta\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f simple">)} { (SQ <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -f \"$c1\" &&\n"> <"\n"> <"\tgit merge-recursive \"$c0\" -- \"$c1\" \"$c3\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o3 0\tb/c\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -f \"$c1\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c1\" \"$c4\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o0 1\ta\"\n"> <"\t\techo \"100644 $o1 2\ta\"\n"> <"\t\techo \"100644 $o4 0\ta/c\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict the other way">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -f \"$c4\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c4\" \"$c1\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict result the other way">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o0 1\ta\"\n"> <"\t\techo \"100644 $o1 3\ta\"\n"> <"\t\techo \"100644 $o4 0\ta/c\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -f \"$c1\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c1\" \"$c6\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o6 3\td\"\n"> <"\t\techo \"100644 $o0 1\td/e\"\n"> <"\t\techo \"100644 $o1 2\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict">)} { (SQ <"\n"> <"\n"> <"\trm -fr [abcd] &&\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -f \"$c6\" &&\n"> <"\n"> <"\ttest_expect_code 1 git merge-recursive \"$c0\" -- \"$c6\" \"$c1\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive d/f conflict result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o6 2\td\"\n"> <"\t\techo \"100644 $o0 1\td/e\"\n"> <"\t\techo \"100644 $o1 3\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"reset and 3-way merge">)} { (SQ <"\n"> <"\n"> <"\tgit reset --hard \"$c2\" &&\n"> <"\tgit read-tree -m \"$c0\" \"$c2\" \"$c1\"\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"reset and bind merge">)} { (SQ <"\n"> <"\n"> <"\tgit reset --hard master &&\n"> <"\tgit read-tree --prefix=M/ master &&\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\tM/a\"\n"> <"\t\techo \"100644 $o0 0\tM/b\"\n"> <"\t\techo \"100644 $o0 0\tM/c\"\n"> <"\t\techo \"100644 $o1 0\tM/d/e\"\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\tgit read-tree --prefix=a1/ master &&\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\tM/a\"\n"> <"\t\techo \"100644 $o0 0\tM/b\"\n"> <"\t\techo \"100644 $o0 0\tM/c\"\n"> <"\t\techo \"100644 $o1 0\tM/d/e\"\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o1 0\ta1/a\"\n"> <"\t\techo \"100644 $o0 0\ta1/b\"\n"> <"\t\techo \"100644 $o0 0\ta1/c\"\n"> <"\t\techo \"100644 $o1 0\ta1/d/e\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual &&\n"> <"\n"> <"\tgit read-tree --prefix=z/ master &&\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o1 0\tM/a\"\n"> <"\t\techo \"100644 $o0 0\tM/b\"\n"> <"\t\techo \"100644 $o0 0\tM/c\"\n"> <"\t\techo \"100644 $o1 0\tM/d/e\"\n"> <"\t\techo \"100644 $o1 0\ta\"\n"> <"\t\techo \"100644 $o1 0\ta1/a\"\n"> <"\t\techo \"100644 $o0 0\ta1/b\"\n"> <"\t\techo \"100644 $o0 0\ta1/c\"\n"> <"\t\techo \"100644 $o1 0\ta1/d/e\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o1 0\td/e\"\n"> <"\t\techo \"100644 $o1 0\tz/a\"\n"> <"\t\techo \"100644 $o0 0\tz/b\"\n"> <"\t\techo \"100644 $o0 0\tz/c\"\n"> <"\t\techo \"100644 $o1 0\tz/d/e\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive w/ empty work tree - ours has rename">)} { (SQ <"\n"> <"\t(\n"> <"\t\tGIT_WORK_TREE=\"$PWD/ours-has-rename-work\" &&\n"> <"\t\texport GIT_WORK_TREE &&\n"> <"\t\tGIT_INDEX_FILE=\"$PWD/ours-has-rename-index\" &&\n"> <"\t\texport GIT_INDEX_FILE &&\n"> <"\t\tmkdir \"$GIT_WORK_TREE\" &&\n"> <"\t\tgit read-tree -i -m $c7 &&\n"> <"\t\tgit update-index --ignore-missing --refresh &&\n"> <"\t\tgit merge-recursive $c0 -- $c7 $c3 &&\n"> <"\t\tgit ls-files -s >actual-files\n"> <"\t) 2>actual-err &&\n"> <"\t>expected-err &&\n"> <"\tcat >expected-files <<-EOF &&\n"> <"\t100644 $o3 0\tb/c\n"> <"\t100644 $o0 0\tc\n"> <"\t100644 $o0 0\td/e\n"> <"\t100644 $o0 0\te\n"> <"\tEOF\n"> <"\ttest_cmp expected-files actual-files &&\n"> <"\ttest_cmp expected-err actual-err\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive w/ empty work tree - theirs has rename">)} { (SQ <"\n"> <"\t(\n"> <"\t\tGIT_WORK_TREE=\"$PWD/theirs-has-rename-work\" &&\n"> <"\t\texport GIT_WORK_TREE &&\n"> <"\t\tGIT_INDEX_FILE=\"$PWD/theirs-has-rename-index\" &&\n"> <"\t\texport GIT_INDEX_FILE &&\n"> <"\t\tmkdir \"$GIT_WORK_TREE\" &&\n"> <"\t\tgit read-tree -i -m $c3 &&\n"> <"\t\tgit update-index --ignore-missing --refresh &&\n"> <"\t\tgit merge-recursive $c0 -- $c3 $c7 &&\n"> <"\t\tgit ls-files -s >actual-files\n"> <"\t) 2>actual-err &&\n"> <"\t>expected-err &&\n"> <"\tcat >expected-files <<-EOF &&\n"> <"\t100644 $o3 0\tb/c\n"> <"\t100644 $o0 0\tc\n"> <"\t100644 $o0 0\td/e\n"> <"\t100644 $o0 0\te\n"> <"\tEOF\n"> <"\ttest_cmp expected-files actual-files &&\n"> <"\ttest_cmp expected-err actual-err\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge removes empty directories">)} { (SQ <"\n"> <"\n"> <"\tgit reset --hard master &&\n"> <"\tgit checkout -b rm &&\n"> <"\tgit rm d/e &&\n"> <"\tgit commit -mremoved-d/e &&\n"> <"\tgit checkout master &&\n"> <"\tgit merge -s recursive rm &&\n"> <"\ttest_must_fail test -d d\n"> ) } ) (C {(test_expect_failure)} {(SQ <"merge-recursive simple w/submodule">)} {(SQ <"\n"> <"\n"> <"\tgit checkout submod &&\n"> <"\tgit merge remove\n">)} ) (C {(test_expect_failure)} {(SQ <"merge-recursive simple w/submodule result">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files -s >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 $o5 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"160000 $c1 0\td\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive copy vs. rename">)} { (SQ <"\n"> <"\tgit checkout -f copy &&\n"> <"\tgit merge rename &&\n"> <"\t( git ls-tree -r HEAD && git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 blob $o0\te\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t\techo \"100644 $o0 0\te\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_failure)} {(SQ <"merge-recursive rename vs. rename/symlink">)} { (SQ <"\n"> <"\n"> <"\tgit checkout -f rename &&\n"> <"\tgit merge rename-ln &&\n"> <"\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n"> <"\t(\n"> <"\t\techo \"120000 blob $oln\ta\"\n"> <"\t\techo \"100644 blob $o0\tb\"\n"> <"\t\techo \"100644 blob $o0\tc\"\n"> <"\t\techo \"100644 blob $o0\td/e\"\n"> <"\t\techo \"100644 blob $o0\te\"\n"> <"\t\techo \"120000 $oln 0\ta\"\n"> <"\t\techo \"100644 $o0 0\tb\"\n"> <"\t\techo \"100644 $o0 0\tc\"\n"> <"\t\techo \"100644 $o0 0\td/e\"\n"> <"\t\techo \"100644 $o0 0\te\"\n"> <"\t) >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"merging with triple rename across D/F conflict">)} { (SQ <"\n"> <"\tgit reset --hard HEAD &&\n"> <"\tgit checkout -b main &&\n"> <"\tgit rm -rf . &&\n"> <"\n"> <"\techo \"just a file\" >sub1 &&\n"> <"\tmkdir -p sub2 &&\n"> <"\techo content1 >sub2/file1 &&\n"> <"\techo content2 >sub2/file2 &&\n"> <"\techo content3 >sub2/file3 &&\n"> <"\tmkdir simple &&\n"> <"\techo base >simple/bar &&\n"> <"\tgit add -A &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m base &&\n"> <"\n"> <"\tgit checkout -b other &&\n"> <"\techo more >>simple/bar &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -a -m changesimplefile &&\n"> <"\n"> <"\tgit checkout main &&\n"> <"\tgit rm sub1 &&\n"> <"\tgit mv sub2 sub1 &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m changefiletodir &&\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit merge other\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge-recursive remembers the names of all base trees">)} { (SQ <"\n"> <"\tgit reset --hard HEAD &&\n"> <"\n"> <"\t# more trees than static slots used by oid_to_hex()\n"> <"\tfor commit in $c0 $c2 $c4 $c5 $c6 $c7\n"> <"\tdo\n"> <"\t\tgit rev-parse \"$commit^{tree}\"\n"> <"\tdone >trees &&\n"> <"\n"> <"\t# ignore the return code -- it only fails because the input is weird\n"> < "\ttest_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out &&\n" > <"\n"> <"\t# merge-recursive prints in reverse order, but we do not care\n"> <"\tsort expect &&\n"> <"\tsed -n \"s/^virtual //p\" out | sort >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_done)}) ] )