(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:'merging with submodules' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:48) (Token id:Id.Lit_Chars val:'\n' span_id:49) (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:51) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\t echo original > file &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\t git commit -m sub-root) &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\tgit commit -m root &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\n' span_id:60) (Token id:Id.Lit_Chars val:'\tgit checkout -b a master &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\t echo A > file &&\n' span_id:63) (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\t git commit -m sub-a) &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\tgit commit -m a &&\n' span_id:69) (Token id:Id.Lit_Chars val:'\n' span_id:70) (Token id:Id.Lit_Chars val:'\tgit checkout -b b master &&\n' span_id:71) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:72) (Token id:Id.Lit_Chars val:'\t echo B > file &&\n' span_id:73) (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:74) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:75) (Token id:Id.Lit_Chars val:'\t git commit -m sub-b) &&\n' span_id:76) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:78) (Token id:Id.Lit_Chars val:'\tgit commit -m b &&\n' span_id:79) (Token id:Id.Lit_Chars val:'\n' span_id:80) (Token id:Id.Lit_Chars val:'\tgit checkout -b c a &&\n' span_id:81) (Token id:Id.Lit_Chars val:'\tgit merge -s ours b &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\n' span_id:83) (Token id:Id.Lit_Chars val:'\tgit checkout -b d b &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\tgit merge -s ours a\n' span_id:85) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for merge search' span_id:125))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:129) (Token id:Id.Lit_Chars val:'\tmkdir merge-search &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tgit init &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\t echo "file-a" > file-a &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\t git add file-a &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\t git commit -m "sub-a" &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\t git branch sub-a) &&\n' span_id:139) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m init &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\tgit branch init &&\n' span_id:141) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\tgit commit -m "a" &&\n' span_id:143) (Token id:Id.Lit_Chars val:'\tgit branch a &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\n' span_id:145) (Token id:Id.Lit_Chars val:'\tgit checkout -b b &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-b &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t echo "file-b" > file-b &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\t git add file-b &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\t git commit -m "sub-b") &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "b" &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) (Token id:Id.Lit_Chars val:'\tgit checkout -b c a &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-c sub-a &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\t echo "file-c" > file-c &&\n' span_id:157) (Token id:Id.Lit_Chars val:'\t git add file-c &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\t git commit -m "sub-c") &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "c" &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\n' span_id:161) (Token id:Id.Lit_Chars val:'\tgit checkout -b d a &&\n' span_id:162) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-d sub-b &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\t git merge sub-c) &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "d" &&\n' span_id:166) (Token id:Id.Lit_Chars val:'\tgit branch test b &&\n' span_id:167) (Token id:Id.Lit_Chars val:'\n' span_id:168) (Token id:Id.Lit_Chars val:'\tgit checkout -b g init &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:170) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-g sub-c) &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "g")\n' span_id:173) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'merge with one side as a fast-forward of the other' span_id: 180 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\t git checkout -b test-forward b &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\t git merge d &&\n' span_id:187) (Token id: Id.Lit_Chars val: '\t git ls-tree test-forward sub | cut -f1 | cut -f3 -d" " > actual &&\n' span_id: 188 ) (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:189) (Token id: Id.Lit_Chars val: '\t git rev-parse sub-d > ../expect) &&\n' span_id: 190 ) (Token id:Id.Lit_Chars val:'\t test_cmp actual expect)\n' span_id:191) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merging should conflict for non fast-forward' span_id:198))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\t git checkout -b test-nonforward b &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\t git rev-parse sub-d > ../expect) &&\n' span_id:206) (Token id: Id.Lit_Chars val: '\t test_must_fail git merge c 2> actual &&\n' span_id: 207 ) (Token id:Id.Lit_Chars val:'\t grep $(cat expect) actual > /dev/null &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\t git reset --hard)\n' span_id:209) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merging should fail for ambiguous common parent' span_id:216))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:220) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit checkout -b test-ambiguous b &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\t git checkout -b ambiguous sub-b &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\t git merge sub-c &&\n' span_id:225) (Token id:Id.Lit_Chars val:'\t git rev-parse sub-d > ../expect1 &&\n' span_id:226) (Token id: Id.Lit_Chars val: '\t git rev-parse ambiguous > ../expect2) &&\n' span_id: 227 ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c 2> actual &&\n' span_id:228) (Token id: Id.Lit_Chars val: '\tgrep $(cat expect1) actual > /dev/null &&\n' span_id: 229 ) (Token id:Id.Lit_Chars val:'\tgrep $(cat expect2) actual > /dev/null &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\tgit reset --hard)\n' span_id:231) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'merging should fail for changes that are backwards' span_id: 289 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:293) (Token id:Id.Lit_Chars val:'\t(cd merge-search &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\tgit checkout -b bb a &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\t git checkout sub-b) &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "bb" &&\n' span_id:298) (Token id:Id.Lit_Chars val:'\n' span_id:299) (Token id:Id.Lit_Chars val:'\tgit checkout -b e bb &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\t git checkout sub-a) &&\n' span_id:302) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "e" &&\n' span_id:303) (Token id:Id.Lit_Chars val:'\n' span_id:304) (Token id:Id.Lit_Chars val:'\tgit checkout -b f bb &&\n' span_id:305) (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\t git checkout sub-d) &&\n' span_id:307) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "f" &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\n' span_id:309) (Token id:Id.Lit_Chars val:'\tgit checkout -b test-backward e &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge f)\n' span_id:311) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git submodule status should display the merge conflict properly with merge base' span_id: 325 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:329) (Token id:Id.Lit_Chars val:' (cd merge-search &&\n' span_id:330) (Token id:Id.Lit_Chars val:' cat >.gitmodules <<EOF &&\n' span_id:331) (Token id:Id.Lit_Chars val:'[submodule "sub"]\n' span_id:332) (Token id:Id.Lit_Chars val:' path = sub\n' span_id:333) (Token id:Id.Lit_Chars val:' url = $TRASH_DIRECTORY/sub\n' span_id:334) (Token id:Id.Lit_Chars val:'EOF\n' span_id:335) (Token id:Id.Lit_Chars val:' cat >expect <<EOF &&\n' span_id:336) (Token id:Id.Lit_Chars val:'U0000000000000000000000000000000000000000 sub\n' span_id:337) (Token id:Id.Lit_Chars val:'EOF\n' span_id:338) (Token id:Id.Lit_Chars val:' git submodule status > actual &&\n' span_id:339) (Token id:Id.Lit_Chars val:' test_cmp expect actual &&\n' span_id:340) (Token id:Id.Lit_Chars val:'\tgit reset --hard)\n' span_id:341) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git submodule status should display the merge conflict properly without merge-base' span_id: 354 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:358) (Token id:Id.Lit_Chars val:' (cd merge-search &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\tgit checkout -b test-no-merge-base g &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge b &&\n' span_id:361) (Token id:Id.Lit_Chars val:' cat >.gitmodules <<EOF &&\n' span_id:362) (Token id:Id.Lit_Chars val:'[submodule "sub"]\n' span_id:363) (Token id:Id.Lit_Chars val:' path = sub\n' span_id:364) (Token id:Id.Lit_Chars val:' url = $TRASH_DIRECTORY/sub\n' span_id:365) (Token id:Id.Lit_Chars val:'EOF\n' span_id:366) (Token id:Id.Lit_Chars val:' cat >expect <<EOF &&\n' span_id:367) (Token id:Id.Lit_Chars val:'U0000000000000000000000000000000000000000 sub\n' span_id:368) (Token id:Id.Lit_Chars val:'EOF\n' span_id:369) (Token id:Id.Lit_Chars val:' git submodule status > actual &&\n' span_id:370) (Token id:Id.Lit_Chars val:' test_cmp expect actual &&\n' span_id:371) (Token id:Id.Lit_Chars val:' git reset --hard)\n' span_id:372) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'merging with a modify/modify conflict between merge bases' span_id: 380 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:384) (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD &&\n' span_id:385) (Token id:Id.Lit_Chars val:'\tgit checkout -b test2 c &&\n' span_id:386) (Token id:Id.Lit_Chars val:'\tgit merge d\n' span_id:387) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for recursive merge with submodule' span_id:397))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:401) (Token id:Id.Lit_Chars val:'\tmkdir merge-recursive &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\t(cd merge-recursive &&\n' span_id:403) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:404) (Token id:Id.Lit_Chars val:'\t mkdir sub &&\n' span_id:405) (Token id:Id.Lit_Chars val:'\t (cd sub &&\n' span_id:406) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:407) (Token id:Id.Lit_Chars val:'\t test_commit a &&\n' span_id:408) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-b master &&\n' span_id:409) (Token id:Id.Lit_Chars val:'\t test_commit b &&\n' span_id:410) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-c master &&\n' span_id:411) (Token id:Id.Lit_Chars val:'\t test_commit c &&\n' span_id:412) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-bc sub-b &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\t git merge sub-c &&\n' span_id:414) (Token id:Id.Lit_Chars val:'\t git checkout -b sub-cb sub-c &&\n' span_id:415) (Token id:Id.Lit_Chars val:'\t git merge sub-b &&\n' span_id:416) (Token id:Id.Lit_Chars val:'\t git checkout master) &&\n' span_id:417) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\t git commit -m a &&\n' span_id:419) (Token id:Id.Lit_Chars val:'\t git checkout -b top-b master &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-b) &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\t git commit -m b &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\t git checkout -b top-c master &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-c) &&\n' span_id:425) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:426) (Token id:Id.Lit_Chars val:'\t git commit -m c &&\n' span_id:427) (Token id:Id.Lit_Chars val:'\t git checkout -b top-bc top-b &&\n' span_id:428) (Token id:Id.Lit_Chars val:'\t git merge -s ours --no-commit top-c &&\n' span_id:429) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-bc) &&\n' span_id:430) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:431) (Token id:Id.Lit_Chars val:'\t git commit -m bc &&\n' span_id:432) (Token id:Id.Lit_Chars val:'\t git checkout -b top-cb top-c &&\n' span_id:433) (Token id: Id.Lit_Chars val: '\t git merge -s ours --no-commit top-b &&\n' span_id: 434 ) (Token id:Id.Lit_Chars val:'\t (cd sub && git checkout sub-cb) &&\n' span_id:435) (Token id:Id.Lit_Chars val:'\t git add sub &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\t git commit -m cb)\n' span_id:437) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'recursive merge with submodule' span_id:447))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:451) (Token id:Id.Lit_Chars val:'\t(cd merge-recursive &&\n' span_id:452) (Token id:Id.Lit_Chars val:'\t test_must_fail git merge top-bc &&\n' span_id:453) (Token id: Id.Lit_Chars val: '\t echo "160000 $(git rev-parse top-cb:sub) 2\tsub" > expect2 &&\n' span_id: 454 ) (Token id: Id.Lit_Chars val: '\t echo "160000 $(git rev-parse top-bc:sub) 3\tsub" > expect3 &&\n' span_id: 455 ) (Token id:Id.Lit_Chars val:'\t git ls-files -u > actual &&\n' span_id:456) (Token id: Id.Lit_Chars val: '\t grep "$(cat expect2)" actual > /dev/null &&\n' span_id: 457 ) (Token id:Id.Lit_Chars val:'\t grep "$(cat expect3)" actual > /dev/null)\n' span_id:458) ) } ) (C {(test_done)}) ] )