(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: 'per path merge controlled by merge attribute' span_id: 15 ) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:29) (Token id:Id.Lit_Chars val:'\n' span_id:30) (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:31) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:32) (Token id: Id.Lit_Chars val: '\t\techo Initial >$f && git add $f || return 1\n' span_id: 33 ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tgit commit -m Initial &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit branch side &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:39) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:40) (Token id: Id.Lit_Chars val: '\t\techo Master >>$f && git add $f || return 1\n' span_id: 41 ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:42) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tgit commit -m Master &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\n' span_id:45) (Token id:Id.Lit_Chars val:'\tgit checkout side &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\tfor f in text binary union\n' span_id:47) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:48) (Token id: Id.Lit_Chars val: '\t\techo Side >>$f && git add $f || return 1\n' span_id: 49 ) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:51) (Token id:Id.Lit_Chars val:'\tgit commit -m Side &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\n' span_id:53) (Token id:Id.Lit_Chars val:'\tgit tag anchor\n' span_id:54) ) } ) (C {(test_expect_success)} {(merge)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:63) (Token id:Id.Lit_Chars val:'\n' span_id:64) (Token id:Id.Lit_Chars val:'\t{\n' span_id:65) (Token id:Id.Lit_Chars val:'\t\techo "binary -merge"\n' span_id:66) (Token id:Id.Lit_Chars val:'\t\techo "union merge=union"\n' span_id:67) (Token id:Id.Lit_Chars val:'\t} >.gitattributes &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\n' span_id:69) (Token id:Id.Lit_Chars val:'\tif git merge master\n' span_id:70) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:71) (Token id:Id.Lit_Chars val:'\t\techo Gaah, should have conflicted\n' span_id:72) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:73) (Token id:Id.Lit_Chars val:'\telse\n' span_id:74) (Token id:Id.Lit_Chars val:'\t\techo Ok, conflicted.\n' span_id:75) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:76) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check merge result in index' span_id:83))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) (Token id:Id.Lit_Chars val:'\n' span_id:88) (Token id:Id.Lit_Chars val:'\tgit ls-files -u | grep binary &&\n' span_id:89) (Token id:Id.Lit_Chars val:'\tgit ls-files -u | grep text &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\t! (git ls-files -u | grep union)\n' span_id:91) (Token id:Id.Lit_Chars val:'\n' span_id:92) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check merge result in working tree' span_id:99))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\n' span_id:104) (Token id: Id.Lit_Chars val: '\tgit cat-file -p HEAD:binary >binary-orig &&\n' span_id: 105 ) (Token id:Id.Lit_Chars val:'\tgrep "<<<<<<<" text &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\tcmp binary-orig binary &&\n' span_id:107) (Token id:Id.Lit_Chars val:'\t! grep "<<<<<<<" union &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\tgrep Master union &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\tgrep Side union\n' span_id:110) (Token id:Id.Lit_Chars val:'\n' span_id:111) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'retry the merge with longer context' span_id:118))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) (Token id: Id.Lit_Chars val: '\techo text conflict-marker-size=32 >>.gitattributes &&\n' span_id: 123 ) (Token id:Id.Lit_Chars val:'\tgit checkout -m text &&\n' span_id:124) (Token id:Id.Lit_Chars val:'\tsed -ne "/^\\([<=>]\\)\\1\\1\\1*/{\n' span_id:125) (Token id:Id.Lit_Chars val:'\t\ts/ .*$//\n' span_id:126) (Token id:Id.Lit_Chars val:'\t\tp\n' span_id:127) (Token id:Id.Lit_Chars val:'\t}" >actual text &&\n' span_id:128) (Token id: Id.Lit_Chars val: '\tgrep ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" actual &&\n' span_id: 129 ) (Token id:Id.Lit_Chars val:'\tgrep "================================" actual &&\n' span_id:130) (Token id: Id.Lit_Chars val: '\tgrep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual\n' span_id: 131 ) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:137) fd: -1 arg_word: {(./custom-merge)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:140) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:141)) (OF) } here_end_span_id: 162 stdin_parts: [ ('#!/bin/sh\n') ('\n') ('orig="$1" ours="$2" theirs="$3" exit="$4" path=$5\n') ('(\n') ('\techo "orig is $orig"\n') ('\techo "ours is $ours"\n') ('\techo "theirs is $theirs"\n') ('\techo "path is $path"\n') ('\techo "=== orig ==="\n') ('\tcat "$orig"\n') ('\techo "=== ours ==="\n') ('\tcat "$ours"\n') ('\techo "=== theirs ==="\n') ('\tcat "$theirs"\n') (') >"$ours+"\n') ('cat "$ours+" >"$ours"\n') ('rm -f "$ours+"\n') ('exit "$exit"\n') ] ) ] ) (C {(chmod)} {(Id.Lit_Other '+') (x)} {(./custom-merge)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'custom merge backend' span_id:174))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) (Token id: Id.Lit_Chars val: '\techo "* merge=union" >.gitattributes &&\n' span_id: 180 ) (Token id:Id.Lit_Chars val:'\techo "text merge=custom" >>.gitattributes &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\n' span_id:182) (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:184) (Token id:Id.Lit_Chars val:'\tmerge.custom.driver "./custom-merge %O %A %B 0 %P" &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:186) (Token id:Id.Lit_Chars val:'\tmerge.custom.name "custom merge driver for testing" &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\n' span_id:188) (Token id:Id.Lit_Chars val:'\tgit merge master &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\n' span_id:190) (Token id:Id.Lit_Chars val:'\tcmp binary union &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d text >check-1 &&\n' span_id:192) (Token id:Id.Lit_Chars val:'\to=$(git unpack-file master^:text) &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\ta=$(git unpack-file side^:text) &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\tb=$(git unpack-file master:text) &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\tsh -c "./custom-merge $o $a $b 0 ' span_id:196) ) (text) (SQ (Token id:Id.Lit_Chars val:'" &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d $a >check-2 &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\tcmp check-1 check-2 &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\trm -f $o $a $b\n' span_id:203) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'custom merge backend' span_id:210))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:214) (Token id:Id.Lit_Chars val:'\n' span_id:215) (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:217) (Token id: Id.Lit_Chars val: '\tmerge.custom.driver "./custom-merge %O %A %B 1 %P" &&\n' span_id: 218 ) (Token id:Id.Lit_Chars val:'\tgit config --replace-all \\\n' span_id:219) (Token id: Id.Lit_Chars val: '\tmerge.custom.name "custom merge driver for testing" &&\n' span_id: 220 ) (Token id:Id.Lit_Chars val:'\n' span_id:221) (Token id:Id.Lit_Chars val:'\tif git merge master\n' span_id:222) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:223) (Token id:Id.Lit_Chars val:'\t\techo "Eh? should have conflicted"\n' span_id:224) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:225) (Token id:Id.Lit_Chars val:'\telse\n' span_id:226) (Token id:Id.Lit_Chars val:'\t\techo "Ok, conflicted"\n' span_id:227) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\n' span_id:229) (Token id:Id.Lit_Chars val:'\tcmp binary union &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d text >check-1 &&\n' span_id:231) (Token id: Id.Lit_Chars val: '\to=$(git unpack-file master^:text) &&\n' span_id: 232 ) (Token id:Id.Lit_Chars val:'\ta=$(git unpack-file anchor:text) &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\tb=$(git unpack-file master:text) &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\tsh -c "./custom-merge $o $a $b 0 ' span_id:235) ) (text) (SQ (Token id:Id.Lit_Chars val:'" &&\n' span_id:239) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d $a >check-2 &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\tcmp check-1 check-2 &&\n' span_id:241) (Token id:Id.Lit_Chars val:'\tsed -e 1,3d -e 4q $a >check-3 &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\techo "path is text" >expect &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\tcmp expect check-3 &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\trm -f $o $a $b\n' span_id:245) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'up-to-date merge without common ancestor' span_id:252))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:256) (Token id:Id.Lit_Chars val:'\ttest_create_repo repo1 &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\ttest_create_repo repo2 &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\t(\n' span_id:260) (Token id:Id.Lit_Chars val:'\t\tcd repo1 &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\t\t>a &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\t\tgit add a &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\t\tgit commit -m initial\n' span_id:264) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\t(\n' span_id:267) (Token id:Id.Lit_Chars val:'\t\tcd repo2 &&\n' span_id:268) (Token id: Id.Lit_Chars val: '\t\tgit commit --allow-empty -m initial\n' span_id: 269 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\t(\n' span_id:272) (Token id:Id.Lit_Chars val:'\t\tcd repo1 &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\t\tgit fetch ../repo2 master &&\n' span_id:274) (Token id: Id.Lit_Chars val: '\t\tgit merge --allow-unrelated-histories FETCH_HEAD\n' span_id: 275 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:276) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'custom merge does not lock index' span_id:283))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) (Token id:Id.Lit_Chars val:'\tgit reset --hard anchor &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\twrite_script sleep-one-second.sh <<-\\EOF &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\t\tsleep 1 &\n' span_id:290) (Token id:Id.Lit_Chars val:'\t\techo $! >sleep.pid\n' span_id:291) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:292) (Token id:Id.Lit_Chars val:'\ttest_when_finished "kill \\$(cat sleep.pid)" &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\n' span_id:294) (Token id:Id.Lit_Chars val:'\ttest_write_lines >.gitattributes \\\n' span_id:295) (Token id: Id.Lit_Chars val: '\t\t"* merge=ours" "text merge=sleep-one-second" &&\n' span_id: 296 ) (Token id:Id.Lit_Chars val:'\ttest_config merge.ours.driver true &&\n' span_id:297) (Token id: Id.Lit_Chars val: '\ttest_config merge.sleep-one-second.driver ./sleep-one-second.sh &&\n' span_id: 298 ) (Token id:Id.Lit_Chars val:'\tgit merge master\n' span_id:299) ) } ) (C {(test_done)}) ] )