(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:'blob conversion via gitattributes' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:17)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 32
          stdin_parts: [
            ('#!')
            ($ Id.VSub_DollarName '$SHELL_PATH')
            ('\n')
            ('tr ')
            ("  'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ")
            ("  'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'\n")
          ]
        )
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:20)
          fd: -1
          arg_word: {(rot13.sh)}
        )
      ]
    )
    (C {(chmod)} {(Id.Lit_Other '+') (x)} {(rot13.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:46) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.rot13.smudge ./rot13.sh &&\n'
            span_id: 47
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.rot13.clean ./rot13.sh &&\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\n' span_id:49) (Token id:Id.Lit_Chars val:'\t{\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\t    echo "*.t filter=rot13"\n' span_id:51) (Token id:Id.Lit_Chars val:'\t    echo "*.i ident"\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t} >.gitattributes &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\n' span_id:54) (Token id:Id.Lit_Chars val:'\t{\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\t    echo a b c d e f g h i j k l m\n' span_id:56) (Token id:Id.Lit_Chars val:'\t    echo n o p q r s t u v w x y z\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\t    echo ' span_id:58)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:60)) 
        (SQ (Token id:Id.Lit_Chars val:'$Id$' span_id:62)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:64)) 
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:66) 
          (Token id:Id.Lit_Chars val:'\t} >test &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\tcat test >test.t &&\n' span_id:68) 
          (Token id:Id.Lit_Chars val:'\tcat test >test.o &&\n' span_id:69) (Token id:Id.Lit_Chars val:'\tcat test >test.i &&\n' span_id:70) 
          (Token id:Id.Lit_Chars val:'\tgit add test test.t test.i &&\n' span_id:71) (Token id:Id.Lit_Chars val:'\trm -f test test.t test.i &&\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -- test test.t test.i\n' span_id:73)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:script)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'s/^\\$Id: \\([0-9a-f]*\\) \\$/\\1/p' span_id:79))}
          spids: [77]
        )
      ]
    )
    (C {(test_expect_success)} {(check)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:88) (Token id:Id.Lit_Chars val:'\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\tcmp test.o test &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\tcmp test.o test.t &&\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'\n' span_id:92) (Token id:Id.Lit_Chars val:'\t# ident should be stripped in the repository\n' span_id:93) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --raw --exit-code :test :test.i &&\n'
            span_id: 94
          ) (Token id:Id.Lit_Chars val:'\tid=$(git rev-parse --verify :test) &&\n' span_id:95) 
          (Token
            id: Id.Lit_Chars
            val: '\tembedded=$(sed -ne "$script" test.i) &&\n'
            span_id: 96
          ) (Token id:Id.Lit_Chars val:'\ttest "z$id" = "z$embedded" &&\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\n' span_id:98) (Token id:Id.Lit_Chars val:'\tgit cat-file blob :test.t > test.r &&\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\n' span_id:100) (Token id:Id.Lit_Chars val:'\t./rot13.sh < test.o > test.t &&\n' span_id:101) 
          (Token id:Id.Lit_Chars val:'\tcmp test.r test.t\n' span_id:102)
        )
      }
    )
    (C {(test_expect_success)} {(expanded_in_repo)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:117) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:118) (Token id:Id.Lit_Chars val:'\t\techo "File with expanded keywords"\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id\\$"\n' span_id:120) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id:\\$"\n' span_id:121) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "\\$Id: 0000000000000000000000000000000000000000 \\$"\n'
            span_id: 122
          ) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: NoSpaceAtEnd\\$"\n' span_id:123) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id:NoSpaceAtFront \\$"\n' span_id:124) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id:NoSpaceAtEitherEnd\\$"\n' span_id:125) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: NoTerminatingSymbol"\n' span_id:126) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: Foreign Commit With Spaces \\$"\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\t} >expanded-keywords.0 &&\n' span_id:128) (Token id:Id.Lit_Chars val:'\n' span_id:129) (Token id:Id.Lit_Chars val:'\t{\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t\tcat expanded-keywords.0 &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\tprintf "\\$Id: NoTerminatingSymbolAtEOF"\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\t} >expanded-keywords &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\tcat expanded-keywords >expanded-keywords-crlf &&\n' span_id:134) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit add expanded-keywords expanded-keywords-crlf &&\n'
            span_id: 135
          ) (Token id:Id.Lit_Chars val:'\tgit commit -m "File with keywords expanded" &&\n' span_id:136) 
          (Token
            id: Id.Lit_Chars
            val: '\tid=$(git rev-parse --verify :expanded-keywords) &&\n'
            span_id: 137
          ) (Token id:Id.Lit_Chars val:'\n' span_id:138) (Token id:Id.Lit_Chars val:'\t{\n' span_id:139) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "File with expanded keywords"\n'
            span_id: 140
          ) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:142) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:144) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: $id \\$"\n' span_id:146) (Token id:Id.Lit_Chars val:'\t\techo "\\$Id: NoTerminatingSymbol"\n' span_id:147) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "\\$Id: Foreign Commit With Spaces \\$"\n'
            span_id: 148
          ) (Token id:Id.Lit_Chars val:'\t} >expected-output.0 &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:150) (Token id:Id.Lit_Chars val:'\t\tcat expected-output.0 &&\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "\\$Id: NoTerminatingSymbolAtEOF"\n'
            span_id: 152
          ) (Token id:Id.Lit_Chars val:'\t} >expected-output &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tappend_cr <expected-output.0 &&\n' span_id:155) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "\\$Id: NoTerminatingSymbolAtEOF"\n'
            span_id: 156
          ) (Token id:Id.Lit_Chars val:'\t} >expected-output-crlf &&\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:158) (Token id:Id.Lit_Chars val:'\t\techo "expanded-keywords ident"\n' span_id:159) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "expanded-keywords-crlf ident text eol=crlf"\n'
            span_id: 160
          ) (Token id:Id.Lit_Chars val:'\t} >>.gitattributes &&\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\n' span_id:162) (Token id:Id.Lit_Chars val:'\trm -f expanded-keywords expanded-keywords-crlf &&\n' span_id:163) 
          (Token id:Id.Lit_Chars val:'\n' span_id:164) (Token id:Id.Lit_Chars val:'\tgit checkout -- expanded-keywords &&\n' span_id:165) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expanded-keywords expected-output &&\n'
            span_id: 166
          ) (Token id:Id.Lit_Chars val:'\n' span_id:167) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -- expanded-keywords-crlf &&\n'
            span_id: 168
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expanded-keywords-crlf expected-output-crlf\n' span_id:169)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'filter shell-escaped filenames' span_id:188))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\tcat >argc.sh <<-EOF &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\t#!$SHELL_PATH\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\tcat >/dev/null\n' span_id:195) (Token id:Id.Lit_Chars val:'\techo argc: \\$# "\\$@"\n' span_id:196) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:197) (Token id:Id.Lit_Chars val:'\tnormal=name-no-magic &&\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\tspecial="name  with ' span_id:199)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:201)) 
        (SQ (Token id:Id.Lit_Chars val:sq span_id:203)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:205)) 
        (SQ (Token id:Id.Lit_Chars val:' and \\$x" &&\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\techo some test text >"$normal" &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\techo some test text >"$special" &&\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\tgit add "$normal" "$special" &&\n' span_id:210) (Token id:Id.Lit_Chars val:'\tgit commit -q -m "add files" &&\n' span_id:211) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "name* filter=argc" >.gitattributes &&\n'
            span_id: 212
          ) (Token id:Id.Lit_Chars val:'\n' span_id:213) 
          (Token
            id: Id.Lit_Chars
            val: '\t# delete the files and check them out again, using a smudge filter\n'
            span_id: 214
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# that will count the args and echo the command-line back to us\n'
            span_id: 215
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.argc.smudge "sh ./argc.sh %f" &&\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\trm "$normal" "$special" &&\n' span_id:217) (Token id:Id.Lit_Chars val:'\tgit checkout -- "$normal" "$special" &&\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\n' span_id:219) (Token id:Id.Lit_Chars val:'\t# make sure argc.sh counted the right number of args\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\techo "argc: 1 $normal" >expect &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\ttest_cmp expect "$normal" &&\n' span_id:222) 
          (Token id:Id.Lit_Chars val:'\techo "argc: 1 $special" >expect &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\ttest_cmp expect "$special" &&\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\n' span_id:225) 
          (Token
            id: Id.Lit_Chars
            val: '\t# do the same thing, but with more args in the filter expression\n'
            span_id: 226
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.argc.smudge "sh ./argc.sh %f --my-extra-arg" &&\n'
            span_id: 227
          ) (Token id:Id.Lit_Chars val:'\trm "$normal" "$special" &&\n' span_id:228) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -- "$normal" "$special" &&\n'
            span_id: 229
          ) (Token id:Id.Lit_Chars val:'\n' span_id:230) 
          (Token
            id: Id.Lit_Chars
            val: '\t# make sure argc.sh counted the right number of args\n'
            span_id: 231
          ) (Token id:Id.Lit_Chars val:'\techo "argc: 2 $normal --my-extra-arg" >expect &&\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect "$normal" &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\techo "argc: 2 $special --my-extra-arg" >expect &&\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect "$special" &&\n' span_id:235) (Token id:Id.Lit_Chars val:'\t:\n' span_id:236)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'required filter should filter data' span_id:243))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:247) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.required.smudge ./rot13.sh &&\n'
            span_id: 248
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.required.clean ./rot13.sh &&\n' span_id:249) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.required.required true &&\n'
            span_id: 250
          ) (Token id:Id.Lit_Chars val:'\n' span_id:251) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.r filter=required" >.gitattributes &&\n'
            span_id: 252
          ) (Token id:Id.Lit_Chars val:'\n' span_id:253) 
          (Token id:Id.Lit_Chars val:'\tcat test.o >test.r &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\tgit add test.r &&\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'\n' span_id:256) (Token id:Id.Lit_Chars val:'\trm -f test.r &&\n' span_id:257) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -- test.r &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\tcmp test.o test.r &&\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\n' span_id:260) (Token id:Id.Lit_Chars val:'\t./rot13.sh <test.o >expected &&\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file blob :test.r >actual &&\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\tcmp expected actual\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'required filter smudge failure' span_id:270))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.failsmudge.smudge false &&\n'
            span_id: 275
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.failsmudge.clean cat &&\n' span_id:276) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.failsmudge.required true &&\n'
            span_id: 277
          ) (Token id:Id.Lit_Chars val:'\n' span_id:278) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.fs filter=failsmudge" >.gitattributes &&\n'
            span_id: 279
          ) (Token id:Id.Lit_Chars val:'\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\techo test >test.fs &&\n' span_id:281) (Token id:Id.Lit_Chars val:'\tgit add test.fs &&\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\trm -f test.fs &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\ttest_must_fail git checkout -- test.fs\n' span_id:284)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'required filter clean failure' span_id:291))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:295) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.failclean.smudge cat &&\n'
            span_id: 296
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.failclean.clean false &&\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.failclean.required true &&\n'
            span_id: 298
          ) (Token id:Id.Lit_Chars val:'\n' span_id:299) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.fc filter=failclean" >.gitattributes &&\n'
            span_id: 300
          ) (Token id:Id.Lit_Chars val:'\n' span_id:301) 
          (Token id:Id.Lit_Chars val:'\techo test >test.fc &&\n' span_id:302) (Token id:Id.Lit_Chars val:'\ttest_must_fail git add test.fc\n' span_id:303)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'filtering large input to small output should use little memory'
            span_id: 310
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:314) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.devnull.clean "cat >/dev/null" &&\n'
            span_id: 315
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.devnull.required true &&\n' span_id:316) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor i in $(test_seq 1 30); do printf "%1048576d" 1; done >30MB &&\n'
            span_id: 317
          ) (Token id:Id.Lit_Chars val:'\techo "30MB filter=devnull" >.gitattributes &&\n' span_id:318) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_MMAP_LIMIT=1m GIT_ALLOC_LIMIT=1m git add 30MB\n'
            span_id: 319
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'filter that does not read is fine' span_id:326))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:330) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-genrandom foo $((128 * 1024 + 1)) >big &&\n'
            span_id: 331
          ) (Token id:Id.Lit_Chars val:'\techo "big filter=epipe" >.gitattributes &&\n' span_id:332) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.epipe.clean "echo xyzzy" &&\n'
            span_id: 333
          ) (Token id:Id.Lit_Chars val:'\tgit add big &&\n' span_id:334) 
          (Token id:Id.Lit_Chars val:'\tgit cat-file blob :big >actual &&\n' span_id:335) (Token id:Id.Lit_Chars val:'\techo xyzzy >expect &&\n' span_id:336) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:337)
        )
      }
    )
    (C {(test_expect_success)} {(EXPENSIVE)} 
      {(SQ (Token id:Id.Lit_Chars val:'filter large file' span_id:346))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:350) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.largefile.smudge cat &&\n'
            span_id: 351
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.largefile.clean cat &&\n' span_id:352) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor i in $(test_seq 1 2048); do printf "%1048576d" 1; done >2GB &&\n'
            span_id: 353
          ) (Token id:Id.Lit_Chars val:'\techo "2GB filter=largefile" >.gitattributes &&\n' span_id:354) 
          (Token id:Id.Lit_Chars val:'\tgit add 2GB 2>err &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\t! test -s err &&\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\trm -f 2GB &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\tgit checkout -- 2GB 2>err &&\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\t! test -s err\n' span_id:359)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('filter: clean empty file'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.in-repo-header.clean  "echo cleaned && cat" &&\n'
            span_id: 371
          ) (Token id:Id.Lit_Chars val:'\tgit config filter.in-repo-header.smudge "sed 1d" &&\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\n' span_id:373) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "empty-in-worktree    filter=in-repo-header" >>.gitattributes &&\n'
            span_id: 374
          ) (Token id:Id.Lit_Chars val:'\t>empty-in-worktree &&\n' span_id:375) 
          (Token id:Id.Lit_Chars val:'\n' span_id:376) (Token id:Id.Lit_Chars val:'\techo cleaned >expected &&\n' span_id:377) 
          (Token id:Id.Lit_Chars val:'\tgit add empty-in-worktree &&\n' span_id:378) (Token id:Id.Lit_Chars val:'\tgit show :empty-in-worktree >actual &&\n' span_id:379) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:380)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('filter: smudge empty file'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:391) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.empty-in-repo.clean "cat >/dev/null" &&\n'
            span_id: 392
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config filter.empty-in-repo.smudge "echo smudged && cat" &&\n'
            span_id: 393
          ) (Token id:Id.Lit_Chars val:'\n' span_id:394) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "empty-in-repo filter=empty-in-repo" >>.gitattributes &&\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\techo dead data walking >empty-in-repo &&\n' span_id:396) 
          (Token id:Id.Lit_Chars val:'\tgit add empty-in-repo &&\n' span_id:397) (Token id:Id.Lit_Chars val:'\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\techo smudged >expected &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\tgit checkout-index --prefix=filtered- empty-in-repo &&\n' span_id:400) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected filtered-empty-in-repo\n'
            span_id: 401
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'disable filter with empty override' span_id:408))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config_global filter.disable.smudge false &&\n'
            span_id: 413
          ) (Token id:Id.Lit_Chars val:'\ttest_config_global filter.disable.clean false &&\n' span_id:414) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config filter.disable.smudge false &&\n'
            span_id: 415
          ) (Token id:Id.Lit_Chars val:'\ttest_config filter.disable.clean false &&\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\n' span_id:417) (Token id:Id.Lit_Chars val:'\techo "*.disable filter=disable" >.gitattributes &&\n' span_id:418) 
          (Token id:Id.Lit_Chars val:'\n' span_id:419) (Token id:Id.Lit_Chars val:'\techo test >test.disable &&\n' span_id:420) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c filter.disable.clean= add test.disable 2>err &&\n'
            span_id: 421
          ) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty err &&\n' span_id:422) 
          (Token id:Id.Lit_Chars val:'\trm -f test.disable &&\n' span_id:423) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c filter.disable.smudge= checkout -- test.disable 2>err &&\n'
            span_id: 424
          ) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty err\n' span_id:425)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'diff does not reuse worktree files that need cleaning'
            span_id: 432
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:436) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config filter.counter.clean "echo . >>count; sed s/^/clean:/" &&\n'
            span_id: 437
          ) (Token id:Id.Lit_Chars val:'\techo "file filter=counter" >.gitattributes &&\n' span_id:438) 
          (Token id:Id.Lit_Chars val:'\ttest_commit one file &&\n' span_id:439) (Token id:Id.Lit_Chars val:'\ttest_commit two file &&\n' span_id:440) 
          (Token id:Id.Lit_Chars val:'\n' span_id:441) (Token id:Id.Lit_Chars val:'\t>count &&\n' span_id:442) 
          (Token id:Id.Lit_Chars val:'\tgit diff-tree -p HEAD &&\n' span_id:443) (Token id:Id.Lit_Chars val:'\ttest_line_count = 0 count\n' span_id:444)
        )
      }
    )
    (C {(test_done)})
  ]
)