(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:'git ls-files --others --exclude\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This test runs git ls-files --others and tests --exclude patterns.\n'
                  span_id: 17
                )
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(rm)} {(-fr)} {(one)} {(three)})
    (command.ForEach
      iter_name: dir
      iter_words: [{(.)} {(one)} {(one/two)} {(three)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(mkdir)} {(-p)} {($ Id.VSub_DollarName '$dir')})
                (command.ForEach
                  iter_name: i
                  iter_words: [{(1)} {(2)} {(3)} {(4)} {(5)} {(6)} {(7)} {(8)}]
                  do_arg_iter: F
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Simple
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:86)
                              fd: -1
                              arg_word: 
                                {($ Id.VSub_DollarName '$dir') (/a.) ($ Id.VSub_DollarName '$i')}
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (command.Simple
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:96)
          fd: -1
          arg_word: {(DQ ('#ignore1'))}
        )
      ]
    )
    (command.Simple
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:101)
          fd: -1
          arg_word: {(DQ ('#ignore2'))}
        )
      ]
    )
    (command.Simple
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:106)
          fd: -1
          arg_word: {(DQ ('#hidden'))}
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:114)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:117)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 139
          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')
          ]
        )
      ]
    )
    (command.Simple
      words: [
        {(echo)}
        {
          (SQ (Token id:Id.Lit_Chars val:'.gitignore\n' span_id:144) 
            (Token id:Id.Lit_Chars val:'\\#ignore1\n' span_id:145) (Token id:Id.Lit_Chars val:'\\#ignore2*\n' span_id:146) 
            (Token id:Id.Lit_Chars val:'\\#hid*n\n' span_id:147) (Token id:Id.Lit_Chars val:'output\n' span_id:148) (Token id:Id.Lit_Chars val:'expect\n' span_id:149) 
            (Token id:Id.Lit_Chars val:'.gitignore\n' span_id:150) (Token id:Id.Lit_Chars val:'*.7\n' span_id:151) (Token id:Id.Lit_Chars val:'!*.8' span_id:152)
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:155)
          fd: -1
          arg_word: {(.git/ignore)}
        )
      ]
    )
    (command.Simple
      words: [
        {(echo)}
        {
          (SQ (Token id:Id.Lit_Chars val:'*.1\n' span_id:162) 
            (Token id:Id.Lit_Chars val:'/*.3\n' span_id:163) (Token id:Id.Lit_Chars val:'!*.6' span_id:164)
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:167)
          fd: -1
          arg_word: {(.gitignore)}
        )
      ]
    )
    (command.Simple
      words: [
        {(echo)}
        {
          (SQ (Token id:Id.Lit_Chars val:'*.2\n' span_id:173) 
            (Token id:Id.Lit_Chars val:'two/*.4\n' span_id:174) (Token id:Id.Lit_Chars val:'!*.7\n' span_id:175) (Token id:Id.Lit_Chars val:'*.8' span_id:176)
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:179)
          fd: -1
          arg_word: {(one/.gitignore)}
        )
      ]
    )
    (command.Simple
      words: [
        {(echo)}
        {
          (SQ (Token id:Id.Lit_Chars val:'!*.2\n' span_id:185) 
            (Token id:Id.Lit_Chars val:'!*.8' span_id:186)
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:189)
          fd: -1
          arg_word: {(one/two/.gitignore)}
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:allignores)
          op: assign_op.Equal
          rhs: 
            {
              (SQ 
                (Token
                  id: Id.Lit_Chars
                  val: '.gitignore one/.gitignore one/two/.gitignore'
                  span_id: 195
                )
              )
            }
          spids: [193]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git ls-files --others with various exclude options.'
            span_id: 204
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git ls-files --others \\\n' span_id:210) 
          (Token id:Id.Lit_Chars val:'       --exclude=\\*.6 \\\n' span_id:211) (Token id:Id.Lit_Chars val:'       --exclude-per-directory=.gitignore \\\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'       --exclude-from=.git/ignore \\\n' span_id:213) (Token id:Id.Lit_Chars val:'       >output &&\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'     test_cmp expect output' span_id:215)
        )
      }
    )
    (command.Simple
      words: [{(printf)} {(SQ (Token id:Id.Lit_Chars val:'*.1\\r\\n/*.3\\r\\n!*.6\\r\\n' span_id:225))}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:228)
          fd: -1
          arg_word: {(.gitignore)}
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git ls-files --others with \\r\\n line endings.' span_id:237))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git ls-files --others \\\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'       --exclude=\\*.6 \\\n' span_id:244) (Token id:Id.Lit_Chars val:'       --exclude-per-directory=.gitignore \\\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'       --exclude-from=.git/ignore \\\n' span_id:246) (Token id:Id.Lit_Chars val:'       >output &&\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'     test_cmp expect output' span_id:248)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup skip-worktree gitignore' span_id:255))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\tgit add $allignores &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\tgit update-index --skip-worktree $allignores &&\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\trm $allignores\n' span_id:262)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git ls-files --others with various exclude options.'
            span_id: 271
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git ls-files --others \\\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'       --exclude=\\*.6 \\\n' span_id:278) (Token id:Id.Lit_Chars val:'       --exclude-per-directory=.gitignore \\\n' span_id:279) 
          (Token id:Id.Lit_Chars val:'       --exclude-from=.git/ignore \\\n' span_id:280) (Token id:Id.Lit_Chars val:'       >output &&\n' span_id:281) 
          (Token id:Id.Lit_Chars val:'     test_cmp expect output' span_id:282)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'restore gitignore' span_id:289))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:293) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout --ignore-skip-worktree-bits $allignores &&\n'
            span_id: 294
          ) (Token id:Id.Lit_Chars val:'\trm .git/index\n' span_id:295)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:301)
          fd: -1
          arg_word: {(excludes-file)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:305)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:306)) 
              (OF)
            }
          here_end_span_id: 312
          stdin_parts: [('*.[1-8]\n') ('e*\n') ('\\#*\n')]
        )
      ]
    )
    (C {(git)} {(config)} {(core.excludesFile)} {(excludes-file)})
    (command.Pipeline
      children: [
        (C {(git)} {(-c)} {(status.displayCommentPrefix) (Id.Lit_Equals '=') (true)} {(status)})
        (command.Simple
          words: [{(grep)} {(DQ ('^#\t'))}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:341)
              fd: -1
              arg_word: {(output)}
            )
          ]
        )
      ]
      negated: F
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:348)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:352)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 362
          stdin_parts: [('#\t.gitignore\n') ('#\ta.6\n') ('#\tone/\n') ('#\toutput\n') ('#\tthree/\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git status honors core.excludesfile' span_id:367))} {(SQ (Token id:Id.Lit_Chars val:'test_cmp expect output' span_id:373))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'trailing slash in exclude allows directory match(1)'
            span_id: 380
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:384) (Token id:Id.Lit_Chars val:'\n' span_id:385) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude=one/ >output &&\n'
            span_id: 386
          ) (Token id:Id.Lit_Chars val:'\tif grep "^one/" output\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:388) (Token id:Id.Lit_Chars val:'\t\techo Ooops\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:390) (Token id:Id.Lit_Chars val:'\telse\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\t\t: happy\n' span_id:392) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:393) (Token id:Id.Lit_Chars val:'\n' span_id:394)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'trailing slash in exclude allows directory match (2)'
            span_id: 401
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:405) (Token id:Id.Lit_Chars val:'\n' span_id:406) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude=one/two/ >output &&\n'
            span_id: 407
          ) (Token id:Id.Lit_Chars val:'\tif grep "^one/two/" output\n' span_id:408) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:409) (Token id:Id.Lit_Chars val:'\t\techo Ooops\n' span_id:410) 
          (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:411) (Token id:Id.Lit_Chars val:'\telse\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\t\t: happy\n' span_id:413) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:414) (Token id:Id.Lit_Chars val:'\n' span_id:415)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'trailing slash in exclude forces directory match (1)'
            span_id: 422
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:426) (Token id:Id.Lit_Chars val:'\n' span_id:427) 
          (Token id:Id.Lit_Chars val:'\t>two &&\n' span_id:428) (Token id:Id.Lit_Chars val:'\tgit ls-files --others --exclude=two/ >output &&\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\tgrep "^two" output\n' span_id:430) (Token id:Id.Lit_Chars val:'\n' span_id:431)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'trailing slash in exclude forces directory match (2)'
            span_id: 438
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:442) (Token id:Id.Lit_Chars val:'\n' span_id:443) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude=one/a.1/ >output &&\n'
            span_id: 444
          ) (Token id:Id.Lit_Chars val:'\tgrep "^one/a.1" output\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\n' span_id:446)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'negated exclude matches can override previous ones'
            span_id: 453
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) (Token id:Id.Lit_Chars val:'\n' span_id:458) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude="a.*" --exclude="!a.1" >output &&\n'
            span_id: 459
          ) (Token id:Id.Lit_Chars val:'\tgrep "^a.1" output\n' span_id:460)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'excluded directory overrides content patterns' span_id:467))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:471) (Token id:Id.Lit_Chars val:'\n' span_id:472) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude="one" --exclude="!one/a.1" >output &&\n'
            span_id: 473
          ) (Token id:Id.Lit_Chars val:'\tif grep "^one/a.1" output\n' span_id:474) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:475) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:476) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:477)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'negated directory doesn' span_id:484)) 
        (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:486)) (SQ (Token id:Id.Lit_Chars val:'t affect content patterns' span_id:488))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:492) (Token id:Id.Lit_Chars val:'\n' span_id:493) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --others --exclude="!one" --exclude="one/a.1" >output &&\n'
            span_id: 494
          ) (Token id:Id.Lit_Chars val:'\tif grep "^one/a.1" output\n' span_id:495) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:496) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:497) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:498)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'subdirectory ignore (setup)' span_id:505))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:509) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p top/l1/l2 &&\n' span_id:510) (Token id:Id.Lit_Chars val:'\t(\n' span_id:511) 
          (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:512) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:513) 
          (Token id:Id.Lit_Chars val:'\t\techo /.gitignore >.gitignore &&\n' span_id:514) (Token id:Id.Lit_Chars val:'\t\techo l1 >>.gitignore &&\n' span_id:515) 
          (Token id:Id.Lit_Chars val:'\t\techo l2 >l1/.gitignore &&\n' span_id:516) (Token id:Id.Lit_Chars val:'\t\t>l1/l2/l1\n' span_id:517) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:518)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'subdirectory ignore (toplevel)' span_id:525))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:529) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:530) (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:531) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o --exclude-standard\n'
            span_id: 532
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:533) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:535)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'subdirectory ignore (l1/l2)' span_id:542))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:546) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:547) (Token id:Id.Lit_Chars val:'\t\tcd top/l1/l2 &&\n' span_id:548) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o --exclude-standard\n'
            span_id: 549
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:551) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:552)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'subdirectory ignore (l1)' span_id:559))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:563) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:564) (Token id:Id.Lit_Chars val:'\t\tcd top/l1 &&\n' span_id:565) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o --exclude-standard\n'
            span_id: 566
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:567) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:568) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:569)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show/hide empty ignored directory (setup)' span_id:576))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:580) 
          (Token id:Id.Lit_Chars val:'\trm top/l1/l2/l1 &&\n' span_id:581) (Token id:Id.Lit_Chars val:'\trm top/l1/.gitignore\n' span_id:582)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show empty ignored directory with --directory' span_id:589))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:593) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:594) (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:595) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o -i --exclude l1 --directory\n'
            span_id: 596
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:597) 
          (Token id:Id.Lit_Chars val:'\techo l1/ >expect &&\n' span_id:598) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:599)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'hide empty ignored directory with --no-empty-directory'
            span_id: 606
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:611) (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:612) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n'
            span_id: 613
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:614) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:615) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:616)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show/hide empty ignored sub-directory (setup)' span_id:623))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:627) 
          (Token id:Id.Lit_Chars val:'\t> top/l1/tracked &&\n' span_id:628) (Token id:Id.Lit_Chars val:'\t(\n' span_id:629) 
          (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:630) (Token id:Id.Lit_Chars val:'\t\tgit add -f l1/tracked\n' span_id:631) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:632)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'show empty ignored sub-directory with --directory'
            span_id: 639
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:643) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:644) (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:645) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o -i --exclude l1 --directory\n'
            span_id: 646
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:647) 
          (Token id:Id.Lit_Chars val:'\techo l1/l2/ >expect &&\n' span_id:648) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:649)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'hide empty ignored sub-directory with --no-empty-directory'
            span_id: 656
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:660) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:661) (Token id:Id.Lit_Chars val:'\t\tcd top &&\n' span_id:662) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n'
            span_id: 663
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:664) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:665) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:666)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'pattern matches prefix completely' span_id:673))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:677) 
          (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:678) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -i -o --exclude "/three/a.3[abc]" >actual &&\n'
            span_id: 679
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:680)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ls-files with "**" patterns' span_id:687))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:691) 
          (Token id:Id.Lit_Chars val:'\tcat <<\\EOF >expect &&\n' span_id:692) (Token id:Id.Lit_Chars val:'a.1\n' span_id:693) (Token id:Id.Lit_Chars val:'one/a.1\n' span_id:694) 
          (Token id:Id.Lit_Chars val:'one/two/a.1\n' span_id:695) (Token id:Id.Lit_Chars val:'three/a.1\n' span_id:696) (Token id:Id.Lit_Chars val:'EOF\n' span_id:697) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -o -i --exclude "**/a.1" >actual &&\n'
            span_id: 698
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:699)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ls-files with "**" patterns and no slashes' span_id:707))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:711) 
          (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:712) (Token id:Id.Lit_Chars val:'\tgit ls-files -o -i --exclude "one**a.1" >actual &&\n' span_id:713) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:714)
        )
      }
    )
    (C {(test_done)})
  ]
)