(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)}) ] )