(command.CommandList
  children: [
    (command.ShAssignment
      left: <Id.Lit_VarLike 'test_description='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'test_description='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git ls-files --others --exclude\n'> <'\n'> 
                <'This test runs git ls-files --others and tests --exclude patterns.\n'>
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <.>
      more_env: []
      words: [{<.>} {<'./test-lib.sh'>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <rm>
      more_env: []
      words: [{<rm>} {<-fr>} {<one>} {<three>}]
      redirects: []
      do_fork: T
    )
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [dir]
      iterable: (for_iter.Words words:[{<.>} {<one>} {<'one/two'>} {<three>}])
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <mkdir>
                  more_env: []
                  words: [{<mkdir>} {<-p>} {($ Id.VSub_DollarName dir)}]
                  redirects: []
                  do_fork: T
                )
                (command.ForEach
                  keyword: <Id.KW_For for>
                  iter_names: [i]
                  iterable: (for_iter.Words words:[{<1>} {<2>} {<3>} {<4>} {<5>} {<6>} {<7>} {<8>}])
                  body: 
                    (command.DoGroup
                      left: <Id.KW_Do do>
                      children: [
                        (command.Simple
                          blame_tok: <Id.Redir_Great '>'>
                          more_env: []
                          words: []
                          redirects: [
                            (Redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {($ Id.VSub_DollarName dir) <'/a.'> ($ Id.VSub_DollarName i)}
                            )
                          ]
                          do_fork: F
                        )
                      ]
                      right: <Id.KW_Done done>
                    )
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
          ]
          right: <Id.KW_Done done>
        )
      redirects: []
    )
    (command.Simple
      blame_tok: <Id.Redir_Great '>'>
      more_env: []
      words: []
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{(DQ <'#ignore1'>)})]
      do_fork: F
    )
    (command.Simple
      blame_tok: <Id.Redir_Great '>'>
      more_env: []
      words: []
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{(DQ <'#ignore2'>)})]
      do_fork: F
    )
    (command.Simple
      blame_tok: <Id.Redir_Great '>'>
      more_env: []
      words: []
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{(DQ <'#hidden'>)})]
      do_fork: F
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      words: [{<cat>}]
      redirects: [
        (Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (Redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'a.2\n'>
                <'a.4\n'>
                <'a.5\n'>
                <'a.8\n'>
                <'one/a.3\n'>
                <'one/a.4\n'>
                <'one/a.5\n'>
                <'one/a.7\n'>
                <'one/two/a.2\n'>
                <'one/two/a.3\n'>
                <'one/two/a.5\n'>
                <'one/two/a.7\n'>
                <'one/two/a.8\n'>
                <'three/a.2\n'>
                <'three/a.3\n'>
                <'three/a.4\n'>
                <'three/a.5\n'>
                <'three/a.8\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [
        {<echo>}
        {
          (SQ <'.gitignore\n'> <'\\#ignore1\n'> <'\\#ignore2*\n'> <'\\#hid*n\n'> <'output\n'> <'expect\n'> 
            <'.gitignore\n'> <'*.7\n'> <'!*.8'>
          )
        }
      ]
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'.git/ignore'>})]
      do_fork: T
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [{<echo>} {(SQ <'*.1\n'> <'/*.3\n'> <'!*.6'>)}]
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.gitignore>})]
      do_fork: T
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [{<echo>} {(SQ <'*.2\n'> <'two/*.4\n'> <'!*.7\n'> <'*.8'>)}]
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'one/.gitignore'>})]
      do_fork: T
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [{<echo>} {(SQ <'!*.2\n'> <'!*.8'>)}]
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'one/two/.gitignore'>})]
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'allignores='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'allignores='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'allignores='> name:allignores)
          op: assign_op.Equal
          rhs: {(SQ <'.gitignore one/.gitignore one/two/.gitignore'>)}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'git ls-files --others with various exclude options.'>)}
        {
          (SQ <'git ls-files --others \\\n'> <'       --exclude=\\*.6 \\\n'> 
            <'       --exclude-per-directory=.gitignore \\\n'> <'       --exclude-from=.git/ignore \\\n'> <'       >output &&\n'> <'     test_cmp expect output'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <printf>
      more_env: []
      words: [{<printf>} {(SQ <'*.1\\r\\n/*.3\\r\\n!*.6\\r\\n'>)}]
      redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.gitignore>})]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'git ls-files --others with \\r\\n line endings.'>)}
        {
          (SQ <'git ls-files --others \\\n'> <'       --exclude=\\*.6 \\\n'> 
            <'       --exclude-per-directory=.gitignore \\\n'> <'       --exclude-from=.git/ignore \\\n'> <'       >output &&\n'> <'     test_cmp expect output'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'setup skip-worktree gitignore'>)}
        {
          (SQ <'\n'> <'\tgit add $allignores &&\n'> 
            <'\tgit update-index --skip-worktree $allignores &&\n'> <'\trm $allignores\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'git ls-files --others with various exclude options.'>)}
        {
          (SQ <'git ls-files --others \\\n'> <'       --exclude=\\*.6 \\\n'> 
            <'       --exclude-per-directory=.gitignore \\\n'> <'       --exclude-from=.git/ignore \\\n'> <'       >output &&\n'> <'     test_cmp expect output'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'restore gitignore'>)}
        {
          (SQ <'\n'> <'\tgit checkout --ignore-skip-worktree-bits $allignores &&\n'> 
            <'\trm .git/index\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      words: [{<cat>}]
      redirects: [
        (Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<excludes-file>})
        (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'> ch:E) <OF>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [<'*.[1-8]\n'> <'e*\n'> <'\\#*\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <git>
      more_env: []
      words: [{<git>} {<config>} {<core.excludesFile>} {<excludes-file>}]
      redirects: []
      do_fork: T
    )
    (command.Pipeline
      children: [
        (command.Simple
          blame_tok: <git>
          more_env: []
          words: [{<git>} {<-c>} {<status.displayCommentPrefix> <Id.Lit_Equals '='> <true>} {<status>}]
          redirects: []
          do_fork: T
        )
        (command.Simple
          blame_tok: <grep>
          more_env: []
          words: [{<grep>} {(DQ <'^#\t'>)}]
          redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<output>})]
          do_fork: T
        )
      ]
      ops: [<Id.Op_Pipe _>]
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      words: [{<cat>}]
      redirects: [
        (Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (Redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'#\t.gitignore\n'>
                <'#\ta.6\n'>
                <'#\tone/\n'>
                <'#\toutput\n'>
                <'#\tthree/\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'git status honors core.excludesfile'>)}
        {(SQ <'test_cmp expect output'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'trailing slash in exclude allows directory match(1)'>)}
        {
          (SQ <'\n'> <'\n'> <'\tgit ls-files --others --exclude=one/ >output &&\n'> 
            <'\tif grep "^one/" output\n'> <'\tthen\n'> <'\t\techo Ooops\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> <'\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'trailing slash in exclude allows directory match (2)'>)}
        {
          (SQ <'\n'> <'\n'> <'\tgit ls-files --others --exclude=one/two/ >output &&\n'> 
            <'\tif grep "^one/two/" output\n'> <'\tthen\n'> <'\t\techo Ooops\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> <'\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'trailing slash in exclude forces directory match (1)'>)}
        {
          (SQ <'\n'> <'\n'> <'\t>two &&\n'> <'\tgit ls-files --others --exclude=two/ >output &&\n'> 
            <'\tgrep "^two" output\n'> <'\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'trailing slash in exclude forces directory match (2)'>)}
        {
          (SQ <'\n'> <'\n'> <'\tgit ls-files --others --exclude=one/a.1/ >output &&\n'> 
            <'\tgrep "^one/a.1" output\n'> <'\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'negated exclude matches can override previous ones'>)}
        {
          (SQ <'\n'> <'\n'> <'\tgit ls-files --others --exclude="a.*" --exclude="!a.1" >output &&\n'> 
            <'\tgrep "^a.1" output\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'excluded directory overrides content patterns'>)}
        {
          (SQ <'\n'> <'\n'> 
            <'\tgit ls-files --others --exclude="one" --exclude="!one/a.1" >output &&\n'> <'\tif grep "^one/a.1" output\n'> <'\tthen\n'> <'\t\tfalse\n'> <'\tfi\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'negated directory doesn'>) 
          (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''> ch:'\'') (SQ <'t affect content patterns'>)
        }
        {
          (SQ <'\n'> <'\n'> 
            <'\tgit ls-files --others --exclude="!one" --exclude="one/a.1" >output &&\n'> <'\tif grep "^one/a.1" output\n'> <'\tthen\n'> <'\t\tfalse\n'> <'\tfi\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'subdirectory ignore (setup)'>)}
        {
          (SQ <'\n'> <'\tmkdir -p top/l1/l2 &&\n'> <'\t(\n'> <'\t\tcd top &&\n'> <'\t\tgit init &&\n'> 
            <'\t\techo /.gitignore >.gitignore &&\n'> <'\t\techo l1 >>.gitignore &&\n'> <'\t\techo l2 >l1/.gitignore &&\n'> <'\t\t>l1/l2/l1\n'> <'\t)\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'subdirectory ignore (toplevel)'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top &&\n'> <'\t\tgit ls-files -o --exclude-standard\n'> 
            <'\t) >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'subdirectory ignore (l1/l2)'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top/l1/l2 &&\n'> <'\t\tgit ls-files -o --exclude-standard\n'> 
            <'\t) >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'subdirectory ignore (l1)'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top/l1 &&\n'> <'\t\tgit ls-files -o --exclude-standard\n'> 
            <'\t) >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'show/hide empty ignored directory (setup)'>)}
        {(SQ <'\n'> <'\trm top/l1/l2/l1 &&\n'> <'\trm top/l1/.gitignore\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'show empty ignored directory with --directory'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top &&\n'> <'\t\tgit ls-files -o -i --exclude l1 --directory\n'> 
            <'\t) >actual &&\n'> <'\techo l1/ >expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hide empty ignored directory with --no-empty-directory'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top &&\n'> 
            <'\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n'> <'\t) >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'show/hide empty ignored sub-directory (setup)'>)}
        {
          (SQ <'\n'> <'\t> top/l1/tracked &&\n'> <'\t(\n'> <'\t\tcd top &&\n'> 
            <'\t\tgit add -f l1/tracked\n'> <'\t)\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'show empty ignored sub-directory with --directory'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top &&\n'> <'\t\tgit ls-files -o -i --exclude l1 --directory\n'> 
            <'\t) >actual &&\n'> <'\techo l1/l2/ >expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hide empty ignored sub-directory with --no-empty-directory'>)}
        {
          (SQ <'\n'> <'\t(\n'> <'\t\tcd top &&\n'> 
            <'\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n'> <'\t) >actual &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'pattern matches prefix completely'>)}
        {
          (SQ <'\n'> <'\t: >expect &&\n'> 
            <'\tgit ls-files -i -o --exclude "/three/a.3[abc]" >actual &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'ls-files with "**" patterns'>)}
        {
          (SQ <'\n'> <'\tcat <<\\EOF >expect &&\n'> <'a.1\n'> <'one/a.1\n'> <'one/two/a.1\n'> 
            <'three/a.1\n'> <'EOF\n'> <'\tgit ls-files -o -i --exclude "**/a.1" >actual &&\n'> <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'ls-files with "**" patterns and no slashes'>)}
        {
          (SQ <'\n'> <'\t: >expect &&\n'> <'\tgit ls-files -o -i --exclude "one**a.1" >actual &&\n'> 
            <'\ttest_cmp expect actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_done>
      more_env: []
      words: [{<test_done>}]
      redirects: []
      do_fork: T
    )
  ]
)