(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"test tree diff when trees have duplicate entries">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: make_tree_entry body: (BraceGroup children: [ (AndOr children: [ (C {(printf)} {(SQ <"%s %s\\0">)} {(DQ ($ VSub_Number "$1"))} {(DQ ($ VSub_Number "$2"))}) (C {(perl)} {(-e)} {(SQ <"print chr(hex($_)) for ($ARGV[0] =~ /../g)">)} {(DQ ($ VSub_Number "$3"))} ) ] op_id: Op_DAmp ) ] spids: [31] ) spids: [26 30] ) (FuncDef name: make_tree body: (BraceGroup children: [ (Pipeline children: [ (While cond: [ (Sentence child: (C {(test)} {($ VSub_Pound "$#")} {(-gt)} {(2)}) terminator: <Op_Semi ";"> ) ] body: (DoGroup children: [ (C {(make_tree_entry)} {(DQ ($ VSub_Number "$1"))} {(DQ ($ VSub_Number "$2"))} {(DQ ($ VSub_Number "$3"))} ) (Sentence child: (C {(shift)}) terminator: <Op_Semi ";"> ) (Sentence child: (C {(shift)}) terminator: <Op_Semi ";"> ) (C {(shift)}) ] spids: [94 121] ) ) (C {(git)} {(hash-object)} {(-w)} {(-t)} {(tree)} {(--stdin)}) ] negated: False ) ] spids: [80] ) spids: [75 79] ) (C {(test_expect_success)} {(SQ <"create trees with duplicate entries">)} { (SQ <"\n"> <"\tblob_one=$(echo one | git hash-object -w --stdin) &&\n"> <"\tblob_two=$(echo two | git hash-object -w --stdin) &&\n"> <"\tinner_one_a=$(make_tree \\\n"> <"\t\t100644 inner $blob_one\n"> <"\t) &&\n"> <"\tinner_one_b=$(make_tree \\\n"> <"\t\t100644 inner $blob_two \\\n"> <"\t\t100644 inner $blob_two \\\n"> <"\t\t100644 inner $blob_two\n"> <"\t) &&\n"> <"\touter_one=$(make_tree \\\n"> <"\t\t040000 outer $inner_one_a \\\n"> <"\t\t040000 outer $inner_one_b\n"> <"\t) &&\n"> <"\tinner_two=$(make_tree \\\n"> <"\t\t100644 inner $blob_one \\\n"> <"\t\t100644 inner $blob_two \\\n"> <"\t\t100644 inner $blob_two \\\n"> <"\t\t100644 inner $blob_two\n"> <"\t) &&\n"> <"\touter_two=$(make_tree \\\n"> <"\t\t040000 outer $inner_two\n"> <"\t) &&\n"> <"\tgit tag one $outer_one &&\n"> <"\tgit tag two $outer_two\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-tree between trees">)} { (SQ <"\n"> <"\t{\n"> <"\t\tprintf \":000000 100644 $_z40 $blob_two A\\touter/inner\\n\" &&\n"> <"\t\tprintf \":000000 100644 $_z40 $blob_two A\\touter/inner\\n\" &&\n"> <"\t\tprintf \":000000 100644 $_z40 $blob_two A\\touter/inner\\n\" &&\n"> <"\t\tprintf \":100644 000000 $blob_two $_z40 D\\touter/inner\\n\" &&\n"> <"\t\tprintf \":100644 000000 $blob_two $_z40 D\\touter/inner\\n\" &&\n"> <"\t\tprintf \":100644 000000 $blob_two $_z40 D\\touter/inner\\n\"\n"> <"\t} >expect &&\n"> <"\tgit diff-tree -r --no-abbrev one two >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-tree with renames">)} { (SQ <"\n"> <"\t# same expectation as above, since we disable rename detection\n"> <"\tgit diff-tree -M -r --no-abbrev one two >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_done)}) ] )