(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ <'Three way merge with read-tree -m\n'> <'\n'> <'This test tries three-way merge with read-tree -m\n'> <'\n'> <'There is one ancestor (called O for Original) and two branches A\n'> <'and B derived from it. We want to do a 3-way merge between A and\n'> <'B, using O as the common ancestor.\n'> <'\n'> <' merge A O B\n'> <'\n'> <'Decisions are made by comparing contents of O, A and B pathname\n'> <'by pathname. The result is determined by the following guiding\n'> <'principle:\n'> <'\n'> <' - If only A does something to it and B does not touch it, take\n'> <' whatever A does.\n'> <'\n'> <' - If only B does something to it and A does not touch it, take\n'> <' whatever B does.\n'> <'\n'> <' - If both A and B does something but in the same way, take\n'> <' whatever they do.\n'> <'\n'> <' - If A and B does something but different things, we need a\n'> <' 3-way merge:\n'> <'\n'> <' - We cannot do anything about the following cases:\n'> <'\n'> <' * O does not have it. A and B both must be adding to the\n'> <' same path independently.\n'> <'\n'> <' * A deletes it. B must be modifying.\n'> <'\n'> <' - Otherwise, A and B are modifying. Run 3-way merge.\n'> <'\n'> <'First, the case matrix.\n'> <'\n'> <' - Vertical axis is for A'> ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (SQ <'s actions.\n'> <' - Horizontal axis is for B'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) (SQ <'s actions.\n'> <'\n'> <'.----------------------------------------------------------------.\n'> <'| A B | No Action | Delete | Modify | Add |\n'> <'|------------+------------+------------+------------+------------|\n'> <'| No Action | | | | |\n'> <'| | select O | delete | select B | select B |\n'> <'| | | | | |\n'> <'|------------+------------+------------+------------+------------|\n'> <'| Delete | | | ********** | can |\n'> <'| | delete | delete | merge | not |\n'> <'| | | | | happen |\n'> <'|------------+------------+------------+------------+------------|\n'> <'| Modify | | ********** | ?????????? | can |\n'> <'| | select A | merge | select A=B | not |\n'> <'| | | | merge | happen |\n'> <'|------------+------------+------------+------------+------------|\n'> <'| Add | | can | can | ?????????? |\n'> <'| | select A | not | not | select A=B |\n'> <'| | | happen | happen | merge |\n'> <'.----------------------------------------------------------------.\n'> <'\n'> <'In addition:\n'> <'\n'> <' SS: a special case of MM, where A and B makes the same modification.\n'> <' LL: a special case of AA, where A and B creates the same file.\n'> <' TT: a special case of MM, where A and B makes mergeable changes.\n'> <' DF: a special case, where A makes a directory and B makes a file.\n'> <'\n'> ) } spids: [13] ) ] ) (C {<.>} {<'./test-lib.sh'>}) (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/lib-read-tree.sh'>}) (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/lib-read-tree-m-3way.sh'>}) (command.Simple words: [{<cat>}] redirects: [ (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>}) (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>} here_end_span_id: 175 stdin_parts: [ <'100644 X 2\tAA\n'> <'100644 X 3\tAA\n'> <'100644 X 0\tAN\n'> <'100644 X 1\tDD\n'> <'100644 X 3\tDF\n'> <'100644 X 2\tDF/DF\n'> <'100644 X 1\tDM\n'> <'100644 X 3\tDM\n'> <'100644 X 1\tDN\n'> <'100644 X 3\tDN\n'> <'100644 X 0\tLL\n'> <'100644 X 1\tMD\n'> <'100644 X 2\tMD\n'> <'100644 X 1\tMM\n'> <'100644 X 2\tMM\n'> <'100644 X 3\tMM\n'> <'100644 X 0\tMN\n'> <'100644 X 0\tNA\n'> <'100644 X 1\tND\n'> <'100644 X 2\tND\n'> <'100644 X 0\tNM\n'> <'100644 X 0\tNN\n'> <'100644 X 0\tSS\n'> <'100644 X 1\tTT\n'> <'100644 X 2\tTT\n'> <'100644 X 3\tTT\n'> <'100644 X 2\tZ/AA\n'> <'100644 X 3\tZ/AA\n'> <'100644 X 0\tZ/AN\n'> <'100644 X 1\tZ/DD\n'> <'100644 X 1\tZ/DM\n'> <'100644 X 3\tZ/DM\n'> <'100644 X 1\tZ/DN\n'> <'100644 X 3\tZ/DN\n'> <'100644 X 1\tZ/MD\n'> <'100644 X 2\tZ/MD\n'> <'100644 X 1\tZ/MM\n'> <'100644 X 2\tZ/MM\n'> <'100644 X 3\tZ/MM\n'> <'100644 X 0\tZ/MN\n'> <'100644 X 0\tZ/NA\n'> <'100644 X 1\tZ/ND\n'> <'100644 X 2\tZ/ND\n'> <'100644 X 0\tZ/NM\n'> <'100644 X 0\tZ/NN\n'> ] ) ) ] do_fork: T ) (command.ShFunction name: check_result body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Pipeline children: [ (C {<git>} {<ls-files>} {<--stage>}) (command.Simple words: [ {<sed>} {<-e>} {(SQ <'s/ '>) (DQ ($ Id.VSub_DollarName '$_x40')) (SQ <' / X /'>)} ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<current>} ) ] do_fork: T ) ] negated: F ) (C {<test_cmp>} {<expected>} {<current>}) ] ) ] ) ) (C {<test_expect_success>} {(SQ <'3-way merge with git read-tree -m, empty cache'>)} { (DQ <'rm -fr [NDMALTS][NDMALTSF] Z &&\n'> <' rm .git/index &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'3-way merge with git read-tree -m, match H'>)} { (DQ <'rm -fr [NDMALTS][NDMALTSF] Z &&\n'> <' rm .git/index &&\n'> <' read_tree_must_succeed '> ($ Id.VSub_DollarName '$tree_A') <' &&\n'> <' git checkout-index -f -u -a &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (command.Simple words: [{<Id.Lit_Colon ':'>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <ND_OF_CASE_TABLE>} here_end_span_id: 345 stdin_parts: [ <'\n'> <'We have so far tested only empty index and clean-and-matching-A index\n'> <'case which are trivial. Make sure index requirements are also\n'> <'checked.\n'> <'\n'> <'"git read-tree -m O A B"\n'> <'\n'> <' O A B result index requirements\n'> <'-------------------------------------------------------------------\n'> <' 1 missing missing missing - must not exist.\n'> <' ------------------------------------------------------------------\n'> <' 2 missing missing exists take B* must match B, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 3 missing exists missing take A* must match A, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 4 missing exists A!=B no merge must match A and be\n'> <' up-to-date, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 5 missing exists A==B take A must match A, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 6 exists missing missing remove must not exist.\n'> <' ------------------------------------------------------------------\n'> <' 7 exists missing O!=B no merge must not exist.\n'> <' ------------------------------------------------------------------\n'> <' 8 exists missing O==B remove must not exist.\n'> <' ------------------------------------------------------------------\n'> <' 9 exists O!=A missing no merge must match A and be\n'> <' up-to-date, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 10 exists O==A missing no merge must match A\n'> <' ------------------------------------------------------------------\n'> <' 11 exists O!=A O!=B no merge must match A and be\n'> <' A!=B up-to-date, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 12 exists O!=A O!=B take A must match A, if exists.\n'> <' A==B\n'> <' ------------------------------------------------------------------\n'> <' 13 exists O!=A O==B take A must match A, if exists.\n'> <' ------------------------------------------------------------------\n'> <' 14 exists O==A O!=B take B if exists, must either (1)\n'> <' match A and be up-to-date,\n'> <' or (2) match B.\n'> <' ------------------------------------------------------------------\n'> <' 15 exists O==A O==B take B must match A if exists.\n'> <' ------------------------------------------------------------------\n'> <' 16 exists O==A O==B barf must match A if exists.\n'> <' *multi* in one in another\n'> <'-------------------------------------------------------------------\n'> <'\n'> <'Note: we need to be careful in case 2 and 3. The tree A may contain\n'> <'DF (file) when tree B require DF to be a directory by having DF/DF\n'> <'(file).\n'> <'\n'> ] ) ) ] do_fork: T ) (C {<test_expect_success>} {(SQ <'1 - must not have an entry not in A.'>)} { (DQ <'\n'> <' rm -f .git/index XX &&\n'> <' echo XX >XX &&\n'> <' git update-index --add XX &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'2 - must match B in !O && !A && B case.'>)} { (DQ <'rm -f .git/index NA &&\n'> <' cp .orig-B/NA NA &&\n'> <' git update-index --add NA &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') ) } ) (C {<test_expect_success>} {(SQ <'2 - matching B alone is OK in !O && !A && B case.'>)} { (DQ <'rm -f .git/index NA &&\n'> <' cp .orig-B/NA NA &&\n'> <' git update-index --add NA &&\n'> <' echo extra >>NA &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') ) } ) (C {<test_expect_success>} {(SQ <'3 - must match A in !O && A && !B case.'>)} { (DQ <'rm -f .git/index AN &&\n'> <' cp .orig-A/AN AN &&\n'> <' git update-index --add AN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'3 - matching A alone is OK in !O && A && !B case.'>)} { (DQ <'rm -f .git/index AN &&\n'> <' cp .orig-A/AN AN &&\n'> <' git update-index --add AN &&\n'> <' echo extra >>AN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') ) } ) (C {<test_expect_success>} {(SQ <'3 (fail) - must match A in !O && A && !B case.'>)} { (DQ <'\n'> <' rm -f .git/index AN &&\n'> <' cp .orig-A/AN AN &&\n'> <' echo extra >>AN &&\n'> <' git update-index --add AN &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'4 - must match and be up-to-date in !O && A && B && A!=B case.'>)} { (DQ <'rm -f .git/index AA &&\n'> <' cp .orig-A/AA AA &&\n'> <' git update-index --add AA &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.'>)} { (DQ <'\n'> <' rm -f .git/index AA &&\n'> <' cp .orig-A/AA AA &&\n'> <' git update-index --add AA &&\n'> <' echo extra >>AA &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.'>)} { (DQ <'\n'> <' rm -f .git/index AA &&\n'> <' cp .orig-A/AA AA &&\n'> <' echo extra >>AA &&\n'> <' git update-index --add AA &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'5 - must match in !O && A && B && A==B case.'>)} { (DQ <'rm -f .git/index LL &&\n'> <' cp .orig-A/LL LL &&\n'> <' git update-index --add LL &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'5 - must match in !O && A && B && A==B case.'>)} { (DQ <'rm -f .git/index LL &&\n'> <' cp .orig-A/LL LL &&\n'> <' git update-index --add LL &&\n'> <' echo extra >>LL &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'5 (fail) - must match A in !O && A && B && A==B case.'>)} { (DQ <'\n'> <' rm -f .git/index LL &&\n'> <' cp .orig-A/LL LL &&\n'> <' echo extra >>LL &&\n'> <' git update-index --add LL &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'6 - must not exist in O && !A && !B case'>)} { (DQ <'\n'> <' rm -f .git/index DD &&\n'> <' echo DD >DD &&\n'> <' git update-index --add DD &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'7 - must not exist in O && !A && B && O!=B case'>)} { (DQ <'\n'> <' rm -f .git/index DM &&\n'> <' cp .orig-B/DM DM &&\n'> <' git update-index --add DM &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'8 - must not exist in O && !A && B && O==B case'>)} { (DQ <'\n'> <' rm -f .git/index DN &&\n'> <' cp .orig-B/DN DN &&\n'> <' git update-index --add DN &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'9 - must match and be up-to-date in O && A && !B && O!=A case'>)} { (DQ <'rm -f .git/index MD &&\n'> <' cp .orig-A/MD MD &&\n'> <' git update-index --add MD &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'9 (fail) - must match and be up-to-date in O && A && !B && O!=A case'>)} { (DQ <'\n'> <' rm -f .git/index MD &&\n'> <' cp .orig-A/MD MD &&\n'> <' git update-index --add MD &&\n'> <' echo extra >>MD &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'9 (fail) - must match and be up-to-date in O && A && !B && O!=A case'>)} { (DQ <'\n'> <' rm -f .git/index MD &&\n'> <' cp .orig-A/MD MD &&\n'> <' echo extra >>MD &&\n'> <' git update-index --add MD &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'10 - must match and be up-to-date in O && A && !B && O==A case'>)} { (DQ <'rm -f .git/index ND &&\n'> <' cp .orig-A/ND ND &&\n'> <' git update-index --add ND &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'10 (fail) - must match and be up-to-date in O && A && !B && O==A case'>)} { (DQ <'\n'> <' rm -f .git/index ND &&\n'> <' cp .orig-A/ND ND &&\n'> <' git update-index --add ND &&\n'> <' echo extra >>ND &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'10 (fail) - must match and be up-to-date in O && A && !B && O==A case'>)} { (DQ <'\n'> <' rm -f .git/index ND &&\n'> <' cp .orig-A/ND ND &&\n'> <' echo extra >>ND &&\n'> <' git update-index --add ND &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case'>)} { (DQ <'rm -f .git/index MM &&\n'> <' cp .orig-A/MM MM &&\n'> <' git update-index --add MM &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case'>)} { (DQ <'\n'> <' rm -f .git/index MM &&\n'> <' cp .orig-A/MM MM &&\n'> <' git update-index --add MM &&\n'> <' echo extra >>MM &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case'>)} { (DQ <'\n'> <' rm -f .git/index MM &&\n'> <' cp .orig-A/MM MM &&\n'> <' echo extra >>MM &&\n'> <' git update-index --add MM &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'12 - must match A in O && A && B && O!=A && A==B case'>)} { (DQ <'rm -f .git/index SS &&\n'> <' cp .orig-A/SS SS &&\n'> <' git update-index --add SS &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'12 - must match A in O && A && B && O!=A && A==B case'>)} { (DQ <'rm -f .git/index SS &&\n'> <' cp .orig-A/SS SS &&\n'> <' git update-index --add SS &&\n'> <' echo extra >>SS &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'12 (fail) - must match A in O && A && B && O!=A && A==B case'>)} { (DQ <'\n'> <' rm -f .git/index SS &&\n'> <' cp .orig-A/SS SS &&\n'> <' echo extra >>SS &&\n'> <' git update-index --add SS &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'13 - must match A in O && A && B && O!=A && O==B case'>)} { (DQ <'rm -f .git/index MN &&\n'> <' cp .orig-A/MN MN &&\n'> <' git update-index --add MN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'13 - must match A in O && A && B && O!=A && O==B case'>)} { (DQ <'rm -f .git/index MN &&\n'> <' cp .orig-A/MN MN &&\n'> <' git update-index --add MN &&\n'> <' echo extra >>MN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'14 - must match and be up-to-date in O && A && B && O==A && O!=B case'>)} { (DQ <'rm -f .git/index NM &&\n'> <' cp .orig-A/NM NM &&\n'> <' git update-index --add NM &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'14 - may match B in O && A && B && O==A && O!=B case'>)} { (DQ <'rm -f .git/index NM &&\n'> <' cp .orig-B/NM NM &&\n'> <' git update-index --add NM &&\n'> <' echo extra >>NM &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case'>)} { (DQ <'\n'> <' rm -f .git/index NM &&\n'> <' cp .orig-A/NM NM &&\n'> <' git update-index --add NM &&\n'> <' echo extra >>NM &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case'>)} { (DQ <'\n'> <' rm -f .git/index NM &&\n'> <' cp .orig-A/NM NM &&\n'> <' echo extra >>NM &&\n'> <' git update-index --add NM &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'15 - must match A in O && A && B && O==A && O==B case'>)} { (DQ <'rm -f .git/index NN &&\n'> <' cp .orig-A/NN NN &&\n'> <' git update-index --add NN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'15 - must match A in O && A && B && O==A && O==B case'>)} { (DQ <'rm -f .git/index NN &&\n'> <' cp .orig-A/NN NN &&\n'> <' git update-index --add NN &&\n'> <' echo extra >>NN &&\n'> <' read_tree_must_succeed -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <' &&\n'> <' check_result'> ) } ) (C {<test_expect_success>} {(SQ <'15 (fail) - must match A in O && A && B && O==A && O==B case'>)} { (DQ <'\n'> <' rm -f .git/index NN &&\n'> <' cp .orig-A/NN NN &&\n'> <' echo extra >>NN &&\n'> <' git update-index --add NN &&\n'> <' read_tree_must_fail -m '> ($ Id.VSub_DollarName '$tree_O') <' '> ($ Id.VSub_DollarName '$tree_A') <' '> ($ Id.VSub_DollarName '$tree_B') <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'16 - A matches in one and B matches in another.'>)} { (SQ <'rm -f .git/index F16 &&\n'> <' echo F16 >F16 &&\n'> <' git update-index --add F16 &&\n'> <' tree0=$(git write-tree) &&\n'> <' echo E16 >F16 &&\n'> <' git update-index F16 &&\n'> <' tree1=$(git write-tree) &&\n'> <' read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&\n'> <' git ls-files --stage'> ) } ) (C {<test_done>}) ] )