(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:'git merge\n' span_id:6) (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'Testing pull.* configuration parsing.' span_id:8) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:20))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:24) (Token id:Id.Lit_Chars val:'\techo c0 >c0.c &&\n' span_id:25) (Token id:Id.Lit_Chars val:'\tgit add c0.c &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\tgit commit -m c0 &&\n' span_id:27) (Token id:Id.Lit_Chars val:'\tgit tag c0 &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\techo c1 >c1.c &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\tgit add c1.c &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\tgit commit -m c1 &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\tgit tag c1 &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:33) (Token id:Id.Lit_Chars val:'\techo c2 >c2.c &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tgit add c2.c &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tgit commit -m c2 &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\tgit tag c2 &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\techo c3 >c3.c &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit add c3.c &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit commit -m c3 &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\tgit tag c3\n' span_id:42) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge c1 with c2' span_id:49))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:53) (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\ttest -f c0.c &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\ttest ! -f c2.c &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\ttest ! -f c3.c &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\tgit merge c2 &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\ttest -f c2.c\n' span_id:61) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'fast-forward pull succeeds with "true" in pull.ff' span_id: 68 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:72) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:73) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff true &&\n' span_id:74) (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:75) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse HEAD)" = "$(git rev-parse c1)"\n' span_id:76) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pull.ff=true overrides merge.ff=false' span_id:83))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\ttest_config merge.ff false &&\n' span_id:89) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff true &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:91) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse HEAD)" = "$(git rev-parse c1)"\n' span_id: 92 ) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'fast-forward pull creates merge with "false" in pull.ff' span_id: 99 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff false &&\n' span_id:105) (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:106) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" &&\n' span_id: 107 ) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)"\n' span_id:108) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'pull prevents non-fast-forward with "only" in pull.ff' span_id: 115 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:120) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff only &&\n' span_id:121) (Token id:Id.Lit_Chars val:'\ttest_must_fail git pull . c3\n' span_id:122) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge c1 with c2 (ours in pull.twohead)' span_id:129))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:133) (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\tgit config pull.twohead ours &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\tgit merge c2 &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\t! test -f c2.c\n' span_id:138) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'merge c1 with c2 and c3 (recursive in pull.octopus)' span_id: 145 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\tgit config pull.octopus "recursive" &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c2 c3 &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse c1)" = "$(git rev-parse HEAD)"\n' span_id:153) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'merge c1 with c2 and c3 (recursive and octopus in pull.octopus)' span_id: 160 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:164) (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit config pull.octopus "recursive octopus" &&\n' span_id:166) (Token id:Id.Lit_Chars val:'\tgit merge c2 c3 &&\n' span_id:167) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&\n' span_id: 168 ) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&\n' span_id: 169 ) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&\n' span_id: 170 ) (Token id: Id.Lit_Chars val: '\ttest "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&\n' span_id: 171 ) (Token id:Id.Lit_Chars val:'\tgit diff --exit-code &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\ttest -f c0.c &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\ttest -f c2.c &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\ttest -f c3.c\n' span_id:176) ) } ) (command.ShFunction name: conflict_count body: (command.BraceGroup children: [ (command.Pipeline children: [ (command.BraceGroup children: [ (C {(git)} {(diff-files)} {(--name-only)}) (C {(git)} {(ls-files)} {(--unmerged)}) ] ) (C {(wc)} {(-l)}) ] negated: F ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup conflicted merge' span_id:246))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\techo A >conflict.c &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\techo contents >foo.c &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\tgit add foo.c &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\tgit commit -m c4 &&\n' span_id:256) (Token id:Id.Lit_Chars val:'\tgit tag c4 &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\techo B >conflict.c &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\tgit mv foo.c bar.c &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\tgit commit -m c5 &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\tgit tag c5 &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\tgit reset --hard c4 &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\techo C >conflict.c &&\n' span_id:264) (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\techo secondline >> foo.c &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\tgit add foo.c &&\n' span_id:267) (Token id:Id.Lit_Chars val:'\tgit commit -m c6 &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\tgit tag c6\n' span_id:269) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge picks up the best result' span_id:283))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) (Token id: Id.Lit_Chars val: '\tgit config --unset-all pull.twohead &&\n' span_id: 288 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:289) (Token id: Id.Lit_Chars val: '\ttest_must_fail git merge -s resolve c6 &&\n' span_id: 290 ) (Token id:Id.Lit_Chars val:'\tresolve_count=$(conflict_count) &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge -s recursive c6 &&\n' span_id:293) (Token id: Id.Lit_Chars val: '\trecursive_count=$(conflict_count) &&\n' span_id: 294 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:295) (Token id: Id.Lit_Chars val: '\ttest_must_fail git merge -s recursive -s resolve c6 &&\n' span_id: 296 ) (Token id:Id.Lit_Chars val:'\tauto_count=$(conflict_count) &&\n' span_id:297) (Token id: Id.Lit_Chars val: '\ttest $auto_count = $recursive_count &&\n' span_id: 298 ) (Token id:Id.Lit_Chars val:'\ttest $auto_count != $resolve_count\n' span_id:299) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge picks up the best result (from config)' span_id:306))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:310) (Token id: Id.Lit_Chars val: '\tgit config pull.twohead "recursive resolve" &&\n' span_id: 311 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:312) (Token id: Id.Lit_Chars val: '\ttest_must_fail git merge -s resolve c6 &&\n' span_id: 313 ) (Token id:Id.Lit_Chars val:'\tresolve_count=$(conflict_count) &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:315) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge -s recursive c6 &&\n' span_id:316) (Token id: Id.Lit_Chars val: '\trecursive_count=$(conflict_count) &&\n' span_id: 317 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c6 &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\tauto_count=$(conflict_count) &&\n' span_id:320) (Token id: Id.Lit_Chars val: '\ttest $auto_count = $recursive_count &&\n' span_id: 321 ) (Token id:Id.Lit_Chars val:'\ttest $auto_count != $resolve_count\n' span_id:322) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge errors out on invalid strategy' span_id:329))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:333) (Token id:Id.Lit_Chars val:'\tgit config pull.twohead "foobar" &&\n' span_id:334) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:335) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c6\n' span_id:336) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge errors out on invalid strategy' span_id:343))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:347) (Token id: Id.Lit_Chars val: '\tgit config --unset-all pull.twohead &&\n' span_id: 348 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:349) (Token id: Id.Lit_Chars val: '\ttest_must_fail git merge -s "resolve recursive" c6\n' span_id: 350 ) ) } ) (C {(test_done)}) ] )