(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 case exclude pathspec' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:18))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do\n'
            span_id: 23
          ) (Token id:Id.Lit_Chars val:'\t\tif echo $p | grep /; then\n' span_id:24) 
          (Token id:Id.Lit_Chars val:'\t\t\tmkdir -p $(dirname $p)\n' span_id:25) (Token id:Id.Lit_Chars val:'\t\tfi &&\n' span_id:26) 
          (Token id:Id.Lit_Chars val:'\t\t: >$p &&\n' span_id:27) (Token id:Id.Lit_Chars val:'\t\tgit add $p &&\n' span_id:28) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m $p\n' span_id:29) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:30) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s >actual &&\n'
            span_id: 31
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:33) (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:35) (Token id:Id.Lit_Chars val:'sub/sub/file\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'sub/file\n' span_id:37) (Token id:Id.Lit_Chars val:'file\n' span_id:38) (Token id:Id.Lit_Chars val:'EOF\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:40)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'exclude only should error out' span_id:47))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:51) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git log --oneline --format=%s -- ":(exclude)sub"\n'
            span_id: 52
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude sub' span_id:59))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:63) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":(exclude)sub" >actual &&\n'
            span_id: 64
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:66) (Token id:Id.Lit_Chars val:'file\n' span_id:67) (Token id:Id.Lit_Chars val:'EOF\n' span_id:68) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:69)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude sub/sub/file' span_id:76))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:80) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual &&\n'
            span_id: 81
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:82) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:83) (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:84) 
          (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:85) (Token id:Id.Lit_Chars val:'sub/file\n' span_id:86) (Token id:Id.Lit_Chars val:'file\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:88) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:89)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude sub using mnemonic' span_id:96))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:100) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":!sub" >actual &&\n'
            span_id: 101
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:103) (Token id:Id.Lit_Chars val:'file\n' span_id:104) (Token id:Id.Lit_Chars val:'EOF\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:106)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude :(icase)SUB' span_id:113))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:117) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual &&\n'
            span_id: 118
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:120) (Token id:Id.Lit_Chars val:'file\n' span_id:121) (Token id:Id.Lit_Chars val:'EOF\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:123)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude sub2 from sub' span_id:130))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:135) (Token id:Id.Lit_Chars val:'\tcd sub &&\n' span_id:136) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- :/ ":/!sub2" >actual &&\n'
            span_id: 137
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:139) (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:140) 
          (Token id:Id.Lit_Chars val:'sub/sub/file\n' span_id:141) (Token id:Id.Lit_Chars val:'sub/file\n' span_id:142) (Token id:Id.Lit_Chars val:'file\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:144) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:146)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude sub/*file' span_id:153))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":(exclude)sub/*file" >actual &&\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:160) (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:161) (Token id:Id.Lit_Chars val:'file\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:163) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:164)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'t_e_i() exclude :(glob)sub/*/file' span_id:171))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:175) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual &&\n'
            span_id: 176
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:178) (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:180) (Token id:Id.Lit_Chars val:'sub/file\n' span_id:181) (Token id:Id.Lit_Chars val:'file\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:183) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:184)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude sub' span_id:191))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:195) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":(exclude)sub" >actual &&\n'
            span_id: 196
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:198) (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:199) (Token id:Id.Lit_Chars val:'EOF\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:201)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude sub/sub/file' span_id:208))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:212) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":(exclude)sub/sub/file" >actual &&\n'
            span_id: 213
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:215) (Token id:Id.Lit_Chars val:'sub/file\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:217) (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:219) (Token id:Id.Lit_Chars val:'EOF\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:221)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude sub using mnemonic' span_id:228))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:232) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":!sub" >actual &&\n'
            span_id: 233
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:235) (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:236) (Token id:Id.Lit_Chars val:'EOF\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:238)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude :(icase)SUB' span_id:245))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:249) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":(exclude,icase)SUB" >actual &&\n'
            span_id: 250
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:252) (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:253) (Token id:Id.Lit_Chars val:'EOF\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:255)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude sub2 from sub' span_id:262))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:267) (Token id:Id.Lit_Chars val:'\tcd sub &&\n' span_id:268) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- :/ ":/!sub2" >actual &&\n'
            span_id: 269
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:270) 
          (Token id:Id.Lit_Chars val:'../file\n' span_id:271) (Token id:Id.Lit_Chars val:'file\n' span_id:272) (Token id:Id.Lit_Chars val:'file2\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'sub/file\n' span_id:274) (Token id:Id.Lit_Chars val:'sub/sub/file\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:276) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:278)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude sub/*file' span_id:285))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":(exclude)sub/*file" >actual &&\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:292) (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:294) (Token id:Id.Lit_Chars val:'EOF\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:296)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'m_p_d() exclude :(glob)sub/*/file' span_id:303))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:307) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -- . ":(exclude,glob)sub/*/file" >actual &&\n'
            span_id: 308
          ) (Token id:Id.Lit_Chars val:'\tcat <<EOF >expect &&\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'file\n' span_id:310) (Token id:Id.Lit_Chars val:'sub/file\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'sub/file2\n' span_id:312) (Token id:Id.Lit_Chars val:'sub/sub/sub/file\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'sub2/file\n' span_id:314) (Token id:Id.Lit_Chars val:'EOF\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:316)
        )
      }
    )
    (C {(test_done)})
  ]
)