(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:'combined diff' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)}) (command.ShFunction name: setup_helper body: (command.BraceGroup children: [ (command.AndOr ops: [ Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp ] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:one) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [30] ) (assign_pair lhs: (sh_lhs_expr.Name name:branch) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [33] ) (assign_pair lhs: (sh_lhs_expr.Name name:side) op: assign_op.Equal rhs: {($ Id.VSub_Number '$3')} spids: [36] ) ] ) (C {(git)} {(branch)} {($ Id.VSub_DollarName '$side')} {($ Id.VSub_DollarName '$branch')}) (command.ForEach iter_name: l iter_words: [{($ Id.VSub_DollarName '$one')} {(two)} {(three)} {(fyra)}] do_arg_iter: F body: (command.DoGroup children:[(C {(echo)} {($ Id.VSub_DollarName '$l')})]) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:79) fd: -1 arg_word: {(file)} ) ] ) (C {(git)} {(add)} {(file)}) (C {(test_tick)}) (C {(git)} {(commit)} {(-m)} {($ Id.VSub_DollarName '$branch')}) (C {(git)} {(checkout)} {($ Id.VSub_DollarName '$side')}) (command.ForEach iter_name: l iter_words: [{($ Id.VSub_DollarName '$one')} {(two)} {(three)} {(quatro)}] do_arg_iter: F body: (command.DoGroup children:[(C {(echo)} {($ Id.VSub_DollarName '$l')})]) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:144) fd: -1 arg_word: {(file)} ) ] ) (C {(git)} {(add)} {(file)}) (C {(test_tick)}) (C {(git)} {(commit)} {(-m)} {($ Id.VSub_DollarName '$side')}) (C {(test_must_fail)} {(git)} {(merge)} {($ Id.VSub_DollarName '$branch')}) (command.ForEach iter_name: l iter_words: [{($ Id.VSub_DollarName '$one')} {(three)} {(four)}] do_arg_iter: F body: (command.DoGroup children:[(C {(echo)} {($ Id.VSub_DollarName '$l')})]) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:209) fd: -1 arg_word: {(file)} ) ] ) (C {(git)} {(add)} {(file)}) (C {(test_tick)}) (C {(git)} {(commit)} {(-m)} { (DQ ('merge ') ($ Id.VSub_DollarName '$branch') (' into ') ($ Id.VSub_DollarName '$side') ) } ) ] ) ] ) ) (command.ShFunction name: verify_helper body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:it) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [253] ) ] ) (command.Simple words: [ {(sed)} {(-e)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id: Id.Lit_Chars val: '\t\t1,/^@@@/d\n' span_id: 270 ) (Token id:Id.Lit_Chars val:'\t\t/^ -/d\n' span_id:271) (Token id: Id.Lit_Chars val: '\t\ts/^\\(.\\)./\\1/\n' span_id: 272 ) (Token id:Id.Lit_Chars val:'\t' span_id:273) ) } {(DQ ($ Id.VSub_DollarName '$it'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:280) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$it') (.actual.1))} ) ] ) (command.Simple words: [ {(sed)} {(-e)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:294) (Token id: Id.Lit_Chars val: '\t\t1,/^@@@/d\n' span_id: 295 ) (Token id:Id.Lit_Chars val:'\t\t/^- /d\n' span_id:296) (Token id: Id.Lit_Chars val: '\t\ts/^.\\(.\\)/\\1/\n' span_id: 297 ) (Token id:Id.Lit_Chars val:'\t' span_id:298) ) } {(DQ ($ Id.VSub_DollarName '$it'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:305) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$it') (.actual.2))} ) ] ) (command.Pipeline children: [ (C {(git)} {(diff)} {(DQ ($ Id.VSub_DollarName '$it') ('^'))} {(DQ ($ Id.VSub_DollarName '$it'))} {(--)} ) (command.Simple words: [{(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'1,/^@@/d' span_id:337))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:340) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$it') (.expect.1))} ) ] ) ] negated: F ) (C {(test_cmp)} {(DQ ($ Id.VSub_DollarName '$it') (.expect.1))} {(DQ ($ Id.VSub_DollarName '$it') (.actual.1))} ) (command.Pipeline children: [ (C {(git)} {(diff)} {(DQ ($ Id.VSub_DollarName '$it') ('^2'))} {(DQ ($ Id.VSub_DollarName '$it'))} {(--)} ) (command.Simple words: [{(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'1,/^@@/d' span_id:387))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:390) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$it') (.expect.2))} ) ] ) ] negated: F ) (C {(test_cmp)} {(DQ ($ Id.VSub_DollarName '$it') (.expect.2))} {(DQ ($ Id.VSub_DollarName '$it') (.actual.2))} ) ] ) ] ) ) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:419) (Token id:Id.Lit_Chars val:'\t>file &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\n' span_id:424) (Token id:Id.Lit_Chars val:'\tgit branch withone &&\n' span_id:425) (Token id:Id.Lit_Chars val:'\tgit branch sansone &&\n' span_id:426) (Token id:Id.Lit_Chars val:'\n' span_id:427) (Token id:Id.Lit_Chars val:'\tgit checkout withone &&\n' span_id:428) (Token id:Id.Lit_Chars val:'\tsetup_helper one withone sidewithone &&\n' span_id:429) (Token id:Id.Lit_Chars val:'\n' span_id:430) (Token id:Id.Lit_Chars val:'\tgit checkout sansone &&\n' span_id:431) (Token id:Id.Lit_Chars val:'\tsetup_helper "" sansone sidesansone\n' span_id:432) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (1)' span_id:439))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:443) (Token id: Id.Lit_Chars val: '\tgit show sidewithone -- >sidewithone &&\n' span_id: 444 ) (Token id:Id.Lit_Chars val:'\tverify_helper sidewithone\n' span_id:445) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (2)' span_id:452))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:456) (Token id: Id.Lit_Chars val: '\tgit show sidesansone -- >sidesansone &&\n' span_id: 457 ) (Token id:Id.Lit_Chars val:'\tverify_helper sidesansone\n' span_id:458) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diagnose truncated file' span_id:465))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:469) (Token id:Id.Lit_Chars val:'\t>file &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:471) (Token id:Id.Lit_Chars val:'\tgit commit --amend -C HEAD &&\n' span_id:472) (Token id:Id.Lit_Chars val:'\tgit show >out &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\tgrep "diff --cc file" out\n' span_id:474) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for --cc --raw' span_id:481))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:485) (Token id: Id.Lit_Chars val: '\tblob=$(echo file | git hash-object --stdin -w) &&\n' span_id: 486 ) (Token id: Id.Lit_Chars val: '\tbase_tree=$(echo "100644 blob $blob\tfile" | git mktree) &&\n' span_id: 487 ) (Token id:Id.Lit_Chars val:'\ttrees= &&\n' span_id:488) (Token id:Id.Lit_Chars val:'\tfor i in $(test_seq 1 40)\n' span_id:489) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:490) (Token id: Id.Lit_Chars val: '\t\tblob=$(echo file$i | git hash-object --stdin -w) &&\n' span_id: 491 ) (Token id: Id.Lit_Chars val: '\t\ttrees="$trees$(echo "100644 blob $blob\tfile" | git mktree)$LF"\n' span_id: 492 ) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:493) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check --cc --raw with four trees' span_id:500))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:504) (Token id: Id.Lit_Chars val: '\tfour_trees=$(echo "$trees" | sed -e 4q) &&\n' span_id: 505 ) (Token id:Id.Lit_Chars val:'\tgit diff --cc --raw $four_trees $base_tree >out &&\n' span_id:506) (Token id: Id.Lit_Chars val: '\t# Check for four leading colons in the output:\n' span_id: 507 ) (Token id:Id.Lit_Chars val:'\tgrep "^::::[^:]" out\n' span_id:508) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check --cc --raw with forty trees' span_id:515))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:519) (Token id: Id.Lit_Chars val: '\tgit diff --cc --raw $trees $base_tree >out &&\n' span_id: 520 ) (Token id:Id.Lit_Chars val:'\t# Check for forty leading colons in the output:\n' span_id:521) (Token id: Id.Lit_Chars val: '\tgrep "^::::::::::::::::::::::::::::::::::::::::[^:]" out\n' span_id: 522 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup combined ignore spaces' span_id:529))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:533) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:535) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:536) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:537) (Token id:Id.Lit_Chars val:'\n' span_id:538) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >test &&\n' span_id:539) (Token id:Id.Lit_Chars val:'\talways coalesce\n' span_id:540) (Token id:Id.Lit_Chars val:'\teol space coalesce Q\n' span_id:541) (Token id:Id.Lit_Chars val:'\tspace change coalesce\n' span_id:542) (Token id:Id.Lit_Chars val:'\tall spa ces coalesce\n' span_id:543) (Token id:Id.Lit_Chars val:'\teol spaces Q\n' span_id:544) (Token id:Id.Lit_Chars val:'\tspace change\n' span_id:545) (Token id:Id.Lit_Chars val:'\tall spa ces\n' span_id:546) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:547) (Token id: Id.Lit_Chars val: '\tgit commit -m "test space change" -a &&\n' span_id: 548 ) (Token id:Id.Lit_Chars val:'\n' span_id:549) (Token id:Id.Lit_Chars val:'\tgit checkout -b side HEAD^ &&\n' span_id:550) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >test &&\n' span_id:551) (Token id:Id.Lit_Chars val:'\talways coalesce\n' span_id:552) (Token id:Id.Lit_Chars val:'\teol space coalesce\n' span_id:553) (Token id:Id.Lit_Chars val:'\tspace change coalesce\n' span_id:554) (Token id:Id.Lit_Chars val:'\tall spaces coalesce\n' span_id:555) (Token id:Id.Lit_Chars val:'\teol spaces\n' span_id:556) (Token id:Id.Lit_Chars val:'\tspace change\n' span_id:557) (Token id:Id.Lit_Chars val:'\tall spaces\n' span_id:558) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:559) (Token id: Id.Lit_Chars val: '\tgit commit -m "test other space changes" -a &&\n' span_id: 560 ) (Token id:Id.Lit_Chars val:'\n' span_id:561) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge master &&\n' span_id:562) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >test &&\n' span_id:563) (Token id:Id.Lit_Chars val:'\teol spaces Q\n' span_id:564) (Token id:Id.Lit_Chars val:'\tspace change\n' span_id:565) (Token id:Id.Lit_Chars val:'\tall spa ces\n' span_id:566) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:567) (Token id:Id.Lit_Chars val:'\tgit commit -m merged -a\n' span_id:568) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (no ignore space)' span_id:575))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:579) (Token id:Id.Lit_Chars val:'\tgit show >actual.tmp &&\n' span_id:580) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:581) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:582) (Token id:Id.Lit_Chars val:'\t--always coalesce\n' span_id:583) (Token id:Id.Lit_Chars val:'\t- eol space coalesce\n' span_id:584) (Token id:Id.Lit_Chars val:'\t- space change coalesce\n' span_id:585) (Token id:Id.Lit_Chars val:'\t- all spaces coalesce\n' span_id:586) (Token id:Id.Lit_Chars val:'\t- eol spaces\n' span_id:587) (Token id:Id.Lit_Chars val:'\t- space change\n' span_id:588) (Token id:Id.Lit_Chars val:'\t- all spaces\n' span_id:589) (Token id:Id.Lit_Chars val:'\t -eol space coalesce Q\n' span_id:590) (Token id:Id.Lit_Chars val:'\t -space change coalesce\n' span_id:591) (Token id:Id.Lit_Chars val:'\t -all spa ces coalesce\n' span_id:592) (Token id:Id.Lit_Chars val:'\t+ eol spaces Q\n' span_id:593) (Token id:Id.Lit_Chars val:'\t+ space change\n' span_id:594) (Token id:Id.Lit_Chars val:'\t+ all spa ces\n' span_id:595) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:596) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:597) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (ignore space at eol)' span_id:604))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:608) (Token id: Id.Lit_Chars val: '\tgit show --ignore-space-at-eol >actual.tmp &&\n' span_id: 609 ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:610) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\t--always coalesce\n' span_id:612) (Token id:Id.Lit_Chars val:'\t--eol space coalesce\n' span_id:613) (Token id:Id.Lit_Chars val:'\t- space change coalesce\n' span_id:614) (Token id:Id.Lit_Chars val:'\t- all spaces coalesce\n' span_id:615) (Token id:Id.Lit_Chars val:'\t -space change coalesce\n' span_id:616) (Token id:Id.Lit_Chars val:'\t -all spa ces coalesce\n' span_id:617) (Token id:Id.Lit_Chars val:'\t eol spaces Q\n' span_id:618) (Token id:Id.Lit_Chars val:'\t- space change\n' span_id:619) (Token id:Id.Lit_Chars val:'\t- all spaces\n' span_id:620) (Token id:Id.Lit_Chars val:'\t+ space change\n' span_id:621) (Token id:Id.Lit_Chars val:'\t+ all spa ces\n' span_id:622) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:623) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:624) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (ignore space change)' span_id:631))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:635) (Token id:Id.Lit_Chars val:'\tgit show -b >actual.tmp &&\n' span_id:636) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:637) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:638) (Token id:Id.Lit_Chars val:'\t--always coalesce\n' span_id:639) (Token id:Id.Lit_Chars val:'\t--eol space coalesce\n' span_id:640) (Token id:Id.Lit_Chars val:'\t--space change coalesce\n' span_id:641) (Token id:Id.Lit_Chars val:'\t- all spaces coalesce\n' span_id:642) (Token id:Id.Lit_Chars val:'\t -all spa ces coalesce\n' span_id:643) (Token id:Id.Lit_Chars val:'\t eol spaces Q\n' span_id:644) (Token id:Id.Lit_Chars val:'\t space change\n' span_id:645) (Token id:Id.Lit_Chars val:'\t- all spaces\n' span_id:646) (Token id:Id.Lit_Chars val:'\t+ all spa ces\n' span_id:647) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:648) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:649) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check combined output (ignore all spaces)' span_id:656))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:660) (Token id:Id.Lit_Chars val:'\tgit show -w >actual.tmp &&\n' span_id:661) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:662) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:663) (Token id:Id.Lit_Chars val:'\t--always coalesce\n' span_id:664) (Token id:Id.Lit_Chars val:'\t--eol space coalesce\n' span_id:665) (Token id:Id.Lit_Chars val:'\t--space change coalesce\n' span_id:666) (Token id:Id.Lit_Chars val:'\t--all spaces coalesce\n' span_id:667) (Token id:Id.Lit_Chars val:'\t eol spaces Q\n' span_id:668) (Token id:Id.Lit_Chars val:'\t space change\n' span_id:669) (Token id:Id.Lit_Chars val:'\t all spa ces\n' span_id:670) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:671) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:672) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'combine diff coalesce simple' span_id:679))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:683) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:684) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:685) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:686) (Token id:Id.Lit_Chars val:'\ttest_seq 4 >test &&\n' span_id:687) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty1 &&\n' span_id:688) (Token id:Id.Lit_Chars val:'\tgit branch side1 &&\n' span_id:689) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:690) (Token id:Id.Lit_Chars val:'\ttest_seq 5 >test &&\n' span_id:691) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty2 &&\n' span_id:692) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge side1 &&\n' span_id:693) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:694) (Token id:Id.Lit_Chars val:'\tgit commit -a -m merge &&\n' span_id:695) (Token id:Id.Lit_Chars val:'\tgit show >actual.tmp &&\n' span_id:696) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:697) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:698) (Token id:Id.Lit_Chars val:'\t--1\n' span_id:699) (Token id:Id.Lit_Chars val:'\t--2\n' span_id:700) (Token id:Id.Lit_Chars val:'\t--3\n' span_id:701) (Token id:Id.Lit_Chars val:'\t--4\n' span_id:702) (Token id:Id.Lit_Chars val:'\t- 5\n' span_id:703) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:704) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:705) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'combine diff coalesce tricky' span_id:712))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:716) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:717) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:718) (Token id: Id.Lit_Chars val: '\tgit commit -m initial --allow-empty &&\n' span_id: 719 ) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:720) (Token id:Id.Lit_Chars val:'\t3\n' span_id:721) (Token id:Id.Lit_Chars val:'\t1\n' span_id:722) (Token id:Id.Lit_Chars val:'\t2\n' span_id:723) (Token id:Id.Lit_Chars val:'\t3\n' span_id:724) (Token id:Id.Lit_Chars val:'\t4\n' span_id:725) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:726) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty1 &&\n' span_id:727) (Token id:Id.Lit_Chars val:'\tgit branch -f side1 &&\n' span_id:728) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:729) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:730) (Token id:Id.Lit_Chars val:'\t1\n' span_id:731) (Token id:Id.Lit_Chars val:'\t3\n' span_id:732) (Token id:Id.Lit_Chars val:'\t5\n' span_id:733) (Token id:Id.Lit_Chars val:'\t4\n' span_id:734) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:735) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty2 &&\n' span_id:736) (Token id:Id.Lit_Chars val:'\tgit branch -f side2 &&\n' span_id:737) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge side1 &&\n' span_id:738) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:739) (Token id:Id.Lit_Chars val:'\tgit commit -a -m merge &&\n' span_id:740) (Token id:Id.Lit_Chars val:'\tgit show >actual.tmp &&\n' span_id:741) (Token id: Id.Lit_Chars val: '\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id: 742 ) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:743) (Token id:Id.Lit_Chars val:'\t -3\n' span_id:744) (Token id:Id.Lit_Chars val:'\t--1\n' span_id:745) (Token id:Id.Lit_Chars val:'\t -2\n' span_id:746) (Token id:Id.Lit_Chars val:'\t--3\n' span_id:747) (Token id:Id.Lit_Chars val:'\t- 5\n' span_id:748) (Token id:Id.Lit_Chars val:'\t--4\n' span_id:749) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:750) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual &&\n' span_id:751) (Token id:Id.Lit_Chars val:'\tgit checkout -f side1 &&\n' span_id:752) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge side2 &&\n' span_id:753) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:754) (Token id:Id.Lit_Chars val:'\tgit commit -a -m merge &&\n' span_id:755) (Token id:Id.Lit_Chars val:'\tgit show >actual.tmp &&\n' span_id:756) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id:757) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:758) (Token id:Id.Lit_Chars val:'\t- 3\n' span_id:759) (Token id:Id.Lit_Chars val:'\t--1\n' span_id:760) (Token id:Id.Lit_Chars val:'\t- 2\n' span_id:761) (Token id:Id.Lit_Chars val:'\t--3\n' span_id:762) (Token id:Id.Lit_Chars val:'\t -5\n' span_id:763) (Token id:Id.Lit_Chars val:'\t--4\n' span_id:764) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:765) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:766) ) } ) (C {(test_expect_failure)} {(SQ (Token id:Id.Lit_Chars val:'combine diff coalesce three parents' span_id:773))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:777) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:778) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:779) (Token id: Id.Lit_Chars val: '\tgit commit -m initial --allow-empty &&\n' span_id: 780 ) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:781) (Token id:Id.Lit_Chars val:'\t3\n' span_id:782) (Token id:Id.Lit_Chars val:'\t1\n' span_id:783) (Token id:Id.Lit_Chars val:'\t2\n' span_id:784) (Token id:Id.Lit_Chars val:'\t3\n' span_id:785) (Token id:Id.Lit_Chars val:'\t4\n' span_id:786) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:787) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty1 &&\n' span_id:788) (Token id:Id.Lit_Chars val:'\tgit checkout -B side1 &&\n' span_id:789) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:790) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:791) (Token id:Id.Lit_Chars val:'\t1\n' span_id:792) (Token id:Id.Lit_Chars val:'\t3\n' span_id:793) (Token id:Id.Lit_Chars val:'\t7\n' span_id:794) (Token id:Id.Lit_Chars val:'\t5\n' span_id:795) (Token id:Id.Lit_Chars val:'\t4\n' span_id:796) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:797) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty2 &&\n' span_id:798) (Token id:Id.Lit_Chars val:'\tgit branch -f side2 &&\n' span_id:799) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:800) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:801) (Token id:Id.Lit_Chars val:'\t3\n' span_id:802) (Token id:Id.Lit_Chars val:'\t1\n' span_id:803) (Token id:Id.Lit_Chars val:'\t6\n' span_id:804) (Token id:Id.Lit_Chars val:'\t5\n' span_id:805) (Token id:Id.Lit_Chars val:'\t4\n' span_id:806) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:807) (Token id:Id.Lit_Chars val:'\tgit commit -a -m empty3 &&\n' span_id:808) (Token id:Id.Lit_Chars val:'\t>test &&\n' span_id:809) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:810) (Token id:Id.Lit_Chars val:'\tTREE=$(git write-tree) &&\n' span_id:811) (Token id: Id.Lit_Chars val: '\tCOMMIT=$(git commit-tree -p HEAD -p side1 -p side2 -m merge $TREE) &&\n' span_id: 812 ) (Token id:Id.Lit_Chars val:'\tgit show $COMMIT >actual.tmp &&\n' span_id:813) (Token id: Id.Lit_Chars val: '\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id: 814 ) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:815) (Token id:Id.Lit_Chars val:'\t-- 3\n' span_id:816) (Token id:Id.Lit_Chars val:'\t---1\n' span_id:817) (Token id:Id.Lit_Chars val:'\t- 6\n' span_id:818) (Token id:Id.Lit_Chars val:'\t - 2\n' span_id:819) (Token id:Id.Lit_Chars val:'\t --3\n' span_id:820) (Token id:Id.Lit_Chars val:'\t -7\n' span_id:821) (Token id:Id.Lit_Chars val:'\t- -5\n' span_id:822) (Token id:Id.Lit_Chars val:'\t---4\n' span_id:823) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:824) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:825) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'combine diff missing delete bug' span_id:844))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:848) (Token id: Id.Lit_Chars val: '\tgit commit -m initial --allow-empty &&\n' span_id: 849 ) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:850) (Token id:Id.Lit_Chars val:'\t1\n' span_id:851) (Token id:Id.Lit_Chars val:'\t2\n' span_id:852) (Token id:Id.Lit_Chars val:'\t3\n' span_id:853) (Token id:Id.Lit_Chars val:'\t4\n' span_id:854) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:855) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:856) (Token id:Id.Lit_Chars val:'\tgit commit -a -m side1 &&\n' span_id:857) (Token id:Id.Lit_Chars val:'\tgit checkout -B side1 &&\n' span_id:858) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:859) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:860) (Token id:Id.Lit_Chars val:'\t0\n' span_id:861) (Token id:Id.Lit_Chars val:'\t1\n' span_id:862) (Token id:Id.Lit_Chars val:'\t2\n' span_id:863) (Token id:Id.Lit_Chars val:'\t3\n' span_id:864) (Token id:Id.Lit_Chars val:'\t4modified\n' span_id:865) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:866) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:867) (Token id:Id.Lit_Chars val:'\tgit commit -m side2 &&\n' span_id:868) (Token id:Id.Lit_Chars val:'\tgit branch -f side2 &&\n' span_id:869) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge --no-commit side1 &&\n' span_id:870) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >test &&\n' span_id:871) (Token id:Id.Lit_Chars val:'\t1\n' span_id:872) (Token id:Id.Lit_Chars val:'\t2\n' span_id:873) (Token id:Id.Lit_Chars val:'\t3\n' span_id:874) (Token id:Id.Lit_Chars val:'\t4modified\n' span_id:875) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:876) (Token id:Id.Lit_Chars val:'\tgit add test &&\n' span_id:877) (Token id:Id.Lit_Chars val:'\tgit commit -a -m merge &&\n' span_id:878) (Token id:Id.Lit_Chars val:'\tgit diff-tree -c -p HEAD >actual.tmp &&\n' span_id:879) (Token id: Id.Lit_Chars val: '\tsed -e "1,/^@@@/d" < actual.tmp >actual &&\n' span_id: 880 ) (Token id:Id.Lit_Chars val:'\ttr -d Q <<-\\EOF >expected &&\n' span_id:881) (Token id:Id.Lit_Chars val:'\t- 0\n' span_id:882) (Token id:Id.Lit_Chars val:'\t 1\n' span_id:883) (Token id:Id.Lit_Chars val:'\t 2\n' span_id:884) (Token id:Id.Lit_Chars val:'\t 3\n' span_id:885) (Token id:Id.Lit_Chars val:'\t -4\n' span_id:886) (Token id:Id.Lit_Chars val:'\t +4modified\n' span_id:887) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:888) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected actual\n' span_id:889) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'combine diff gets tree sorting right' span_id:896))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:900) (Token id: Id.Lit_Chars val: '\t# create a directory and a file that sort differently in trees\n' span_id: 901 ) (Token id:Id.Lit_Chars val:'\t# versus byte-wise (implied "/" sorts after ".")\n' span_id:902) (Token id:Id.Lit_Chars val:'\tgit checkout -f master &&\n' span_id:903) (Token id:Id.Lit_Chars val:'\tmkdir foo &&\n' span_id:904) (Token id:Id.Lit_Chars val:'\techo base >foo/one &&\n' span_id:905) (Token id:Id.Lit_Chars val:'\techo base >foo/two &&\n' span_id:906) (Token id:Id.Lit_Chars val:'\techo base >foo.ext &&\n' span_id:907) (Token id:Id.Lit_Chars val:'\tgit add foo foo.ext &&\n' span_id:908) (Token id:Id.Lit_Chars val:'\tgit commit -m base &&\n' span_id:909) (Token id:Id.Lit_Chars val:'\n' span_id:910) (Token id: Id.Lit_Chars val: '\t# one side modifies a file in the directory, along with the root\n' span_id: 911 ) (Token id:Id.Lit_Chars val:'\t# file...\n' span_id:912) (Token id:Id.Lit_Chars val:'\techo master >foo/one &&\n' span_id:913) (Token id:Id.Lit_Chars val:'\techo master >foo.ext &&\n' span_id:914) (Token id:Id.Lit_Chars val:'\tgit commit -a -m master &&\n' span_id:915) (Token id:Id.Lit_Chars val:'\n' span_id:916) (Token id: Id.Lit_Chars val: '\t# the other side modifies the other file in the directory\n' span_id: 917 ) (Token id:Id.Lit_Chars val:'\tgit checkout -b other HEAD^ &&\n' span_id:918) (Token id:Id.Lit_Chars val:'\techo other >foo/two &&\n' span_id:919) (Token id:Id.Lit_Chars val:'\tgit commit -a -m other &&\n' span_id:920) (Token id:Id.Lit_Chars val:'\n' span_id:921) (Token id: Id.Lit_Chars val: '\t# And now we merge. The files in the subdirectory will resolve cleanly,\n' span_id: 922 ) (Token id: Id.Lit_Chars val: '\t# meaning that a combined diff will not find them interesting. But it\n' span_id: 923 ) (Token id: Id.Lit_Chars val: '\t# will find the tree itself interesting, because it had to be merged.\n' span_id: 924 ) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:925) (Token id:Id.Lit_Chars val:'\tgit merge other &&\n' span_id:926) (Token id:Id.Lit_Chars val:'\n' span_id:927) (Token id:Id.Lit_Chars val:'\tprintf "MM\\tfoo\\n" >expect &&\n' span_id:928) (Token id:Id.Lit_Chars val:'\tgit diff-tree -c --name-status -t HEAD >actual.tmp &&\n' span_id:929) (Token id:Id.Lit_Chars val:'\tsed 1d <actual.tmp >actual &&\n' span_id:930) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:931) ) } ) (C {(test_done)}) ] )