(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <'git ls-tree directory and filenames handling.\n'> <'\n'> 
                <'This test runs git ls-tree with the following in a tree.\n'> <'\n'> <'    1.txt              - a file\n'> <'    2.txt              - a file\n'> 
                <'    path0/a/b/c/1.txt  - a file in a directory\n'> <'    path1/b/c/1.txt    - a file in a directory\n'> 
                <'    path2/1.txt        - a file in a directory\n'> <'    path3/1.txt        - a file in a directory\n'> 
                <'    path3/2.txt        - a file in a directory\n'> <'\n'> <'Test the handling of multiple directories which have matching file\n'> 
                <'entries.  Also test odd filename and missing entries handling.\n'>
              )
            }
          spids: [16]
        )
      ]
      spids: [16]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <'\n'> <'\techo 111 >1.txt &&\n'> <'\techo 222 >2.txt &&\n'> 
          <'\tmkdir path0 path0/a path0/a/b path0/a/b/c &&\n'> <'\techo 111 >path0/a/b/c/1.txt &&\n'> <'\tmkdir path1 path1/b path1/b/c &&\n'> 
          <'\techo 111 >path1/b/c/1.txt &&\n'> <'\tmkdir path2 &&\n'> <'\techo 111 >path2/1.txt &&\n'> <'\tmkdir path3 &&\n'> 
          <'\techo 111 >path3/1.txt &&\n'> <'\techo 222 >path3/2.txt &&\n'> <'\tfind *.txt path* \\( -type f -o -type l \\) -print |\n'> 
          <'\txargs git update-index --add &&\n'> <'\ttree=$(git write-tree) &&\n'> <'\techo $tree\n'>
        )
      }
    )
    (FuncDef
      name: test_output
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (SimpleCommand
                  words: [{(sed)} {(-e)} {(DQ ('s/ ') ($ VSub_Name '$_x40') ('\t/ X\t/'))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Less
                      fd: -1
                      arg_word: {(current)}
                      spids: [83]
                    )
                    (Redir op_id:Redir_Great fd:-1 arg_word:{(check)} spids:[86])
                  ]
                )
                (C {(test_cmp)} {(expected)} {(check)})
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [70]
        )
      spids: [65 69]
    )
    (C {(test_expect_success)} {(SQ <'ls-tree plain'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> 
          <'100644 blob X\t1.txt\n'> <'100644 blob X\t2.txt\n'> <'040000 tree X\tpath0\n'> <'040000 tree X\tpath1\n'> 
          <'040000 tree X\tpath2\n'> <'040000 tree X\tpath3\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree recursive'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree -r $tree >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> 
          <'100644 blob X\t1.txt\n'> <'100644 blob X\t2.txt\n'> <'100644 blob X\tpath0/a/b/c/1.txt\n'> <'100644 blob X\tpath1/b/c/1.txt\n'> 
          <'100644 blob X\tpath2/1.txt\n'> <'100644 blob X\tpath3/1.txt\n'> <'100644 blob X\tpath3/2.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter 1.txt'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree 1.txt >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> 
          <'100644 blob X\t1.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter path1/b/c/1.txt'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree path1/b/c/1.txt >current &&\n'> 
          <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\tpath1/b/c/1.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter all 1.txt files'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree 1.txt path0/a/b/c/1.txt \\\n'> 
          <'\t\tpath1/b/c/1.txt path2/1.txt path3/1.txt >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\t1.txt\n'> <'100644 blob X\tpath0/a/b/c/1.txt\n'> 
          <'100644 blob X\tpath1/b/c/1.txt\n'> <'100644 blob X\tpath2/1.txt\n'> <'100644 blob X\tpath3/1.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter directories'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree path3 path2 path0/a/b/c path1/b/c path0/a >current &&\n'> 
          <'\tcat >expected <<\\EOF &&\n'> <'040000 tree X\tpath0/a/b/c\n'> <'040000 tree X\tpath1/b/c\n'> <'040000 tree X\tpath2\n'> 
          <'040000 tree X\tpath3\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter odd names'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree 1.txt ./1.txt .//1.txt \\\n'> 
          <'\t\tpath3/1.txt path3/./1.txt path3 path3// >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\t1.txt\n'> <'100644 blob X\tpath3/1.txt\n'> 
          <'100644 blob X\tpath3/2.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter missing files and extra slashes'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree 1.txt/ abc.txt \\\n'> 
          <'\t\tpath3//23.txt path3/2.txt/// >current &&\n'> <'\t>expected &&\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree filter is leading path match'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree $tree pa path3/a >current &&\n'> <'\t>expected &&\n'> 
          <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --full-name'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd path0 &&\n'> <'\t\tgit ls-tree --full-name $tree a\n'> 
          <'\t) >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'040000 tree X\tpath0/a\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --full-tree'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd path1/b/c &&\n'> <'\t\tgit ls-tree --full-tree $tree\n'> 
          <'\t) >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\t1.txt\n'> <'100644 blob X\t2.txt\n'> 
          <'040000 tree X\tpath0\n'> <'040000 tree X\tpath1\n'> <'040000 tree X\tpath2\n'> <'040000 tree X\tpath3\n'> <'EOF\n'> 
          <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --full-tree -r'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd path3/ &&\n'> <'\t\tgit ls-tree --full-tree -r $tree\n'> 
          <'\t) >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\t1.txt\n'> <'100644 blob X\t2.txt\n'> 
          <'100644 blob X\tpath0/a/b/c/1.txt\n'> <'100644 blob X\tpath1/b/c/1.txt\n'> <'100644 blob X\tpath2/1.txt\n'> <'100644 blob X\tpath3/1.txt\n'> 
          <'100644 blob X\tpath3/2.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --abbrev=5'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree --abbrev=5 $tree >current &&\n'> 
          <'\tsed -e "s/ $_x05[0-9a-f]*\t/ X\t/" <current >check &&\n'> <'\tcat >expected <<\\EOF &&\n'> <'100644 blob X\t1.txt\n'> <'100644 blob X\t2.txt\n'> 
          <'040000 tree X\tpath0\n'> <'040000 tree X\tpath1\n'> <'040000 tree X\tpath2\n'> <'040000 tree X\tpath3\n'> <'EOF\n'> 
          <'\ttest_cmp expected check\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --name-only'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree --name-only $tree >current &&\n'> <'\tcat >expected <<\\EOF &&\n'> 
          <'1.txt\n'> <'2.txt\n'> <'path0\n'> <'path1\n'> <'path2\n'> <'path3\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'ls-tree --name-only -r'>)} 
      {
        (SQ <'\n'> <'\tgit ls-tree --name-only -r $tree >current &&\n'> 
          <'\tcat >expected <<\\EOF &&\n'> <'1.txt\n'> <'2.txt\n'> <'path0/a/b/c/1.txt\n'> <'path1/b/c/1.txt\n'> <'path2/1.txt\n'> <'path3/1.txt\n'> 
          <'path3/2.txt\n'> <'EOF\n'> <'\ttest_output\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)