(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: 'test tree diff when trees have duplicate entries'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: make_tree_entry
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'%s %s\\0' span_id:37))} 
                  {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))}
                )
                (C {(perl)} {(-e)} 
                  {
                    (SQ 
                      (Token
                        id: Id.Lit_Chars
                        val: 'print chr(hex($_)) for ($ARGV[0] =~ /../g)'
                        span_id: 56
                      )
                    )
                  } {(DQ ($ Id.VSub_Number '$3'))}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: make_tree
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (command.WhileUntil
                  keyword: (Token id:Id.KW_While val:while span_id:83)
                  cond: [
                    (command.Sentence
                      child: (C {(test)} {($ Id.VSub_Pound '$#')} {(-gt)} {(2)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:92)
                    )
                  ]
                  body: 
                    (command.DoGroup
                      children: [
                        (C {(make_tree_entry)} {(DQ ($ Id.VSub_Number '$1'))} 
                          {(DQ ($ Id.VSub_Number '$2'))} {(DQ ($ Id.VSub_Number '$3'))}
                        )
                        (command.Sentence
                          child: (C {(shift)})
                          terminator: (Token id:Id.Op_Semi val:';' span_id:113)
                        )
                        (command.Sentence
                          child: (C {(shift)})
                          terminator: (Token id:Id.Op_Semi val:';' span_id:116)
                        )
                        (C {(shift)})
                      ]
                    )
                )
                (C {(git)} {(hash-object)} {(-w)} {(-t)} {(tree)} {(--stdin)})
              ]
              negated: F
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'create trees with duplicate entries' span_id:162))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:166) 
          (Token
            id: Id.Lit_Chars
            val: '\tblob_one=$(echo one | git hash-object -w --stdin) &&\n'
            span_id: 167
          ) (Token id:Id.Lit_Chars val:'\tblob_two=$(echo two | git hash-object -w --stdin) &&\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\tinner_one_a=$(make_tree \\\n' span_id:169) (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_one\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\tinner_one_b=$(make_tree \\\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two \\\n' span_id:173) (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two \\\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two\n' span_id:175) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\touter_one=$(make_tree \\\n' span_id:177) (Token id:Id.Lit_Chars val:'\t\t040000 outer $inner_one_a \\\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\t\t040000 outer $inner_one_b\n' span_id:179) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'\tinner_two=$(make_tree \\\n' span_id:181) (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_one \\\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two \\\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two \\\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t\t100644 inner $blob_two\n' span_id:185) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\touter_two=$(make_tree \\\n' span_id:187) (Token id:Id.Lit_Chars val:'\t\t040000 outer $inner_two\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\tgit tag one $outer_one &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tgit tag two $outer_two\n' span_id:191)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree between trees' span_id:198))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:203) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":000000 100644 $_z40 $blob_two A\\touter/inner\\n" &&\n'
            span_id: 204
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":000000 100644 $_z40 $blob_two A\\touter/inner\\n" &&\n'
            span_id: 205
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":000000 100644 $_z40 $blob_two A\\touter/inner\\n" &&\n'
            span_id: 206
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":100644 000000 $blob_two $_z40 D\\touter/inner\\n" &&\n'
            span_id: 207
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":100644 000000 $blob_two $_z40 D\\touter/inner\\n" &&\n'
            span_id: 208
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf ":100644 000000 $blob_two $_z40 D\\touter/inner\\n"\n'
            span_id: 209
          ) (Token id:Id.Lit_Chars val:'\t} >expect &&\n' span_id:210) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -r --no-abbrev one two >actual &&\n'
            span_id: 211
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:212)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree with renames' span_id:219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) 
          (Token
            id: Id.Lit_Chars
            val: '\t# same expectation as above, since we disable rename detection\n'
            span_id: 224
          ) (Token id:Id.Lit_Chars val:'\tgit diff-tree -M -r --no-abbrev one two >actual &&\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:226)
        )
      }
    )
    (C {(test_done)})
  ]
)