(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 cat-file filters support' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup ' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.txt eol=crlf diff=txt" >.gitattributes &&\n'
            span_id: 22
          ) (Token id:Id.Lit_Chars val:'\techo "hello" | append_cr >world.txt &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\tgit add .gitattributes world.txt &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "Initial commit"\n' span_id:26)
        )
      }
    )
    (command.ShFunction
      name: has_cr
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (command.Simple
                  words: [{(tr)} {(SQ (Token id:Id.Lit_Chars val:'\\015' span_id:41))} {(Q)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:46)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                    )
                  ]
                )
                (command.Simple
                  words: [{(grep)} {(Q)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:57)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
              ]
              negated: F
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no filters with `git show`' span_id:66))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:70) 
          (Token id:Id.Lit_Chars val:'\tgit show HEAD:world.txt >actual &&\n' span_id:71) (Token id:Id.Lit_Chars val:'\t! has_cr actual\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\n' span_id:73)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'no filters with cat-file' span_id:80))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:84) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file blob HEAD:world.txt >actual &&\n'
            span_id: 85
          ) (Token id:Id.Lit_Chars val:'\t! has_cr actual\n' span_id:86)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --filters converts to worktree version' span_id:93))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:97) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --filters HEAD:world.txt >actual &&\n'
            span_id: 98
          ) (Token id:Id.Lit_Chars val:'\thas_cr actual\n' span_id:99)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --filters --path=<path> works' span_id:106))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:110) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(git rev-parse -q --verify HEAD:world.txt) &&\n'
            span_id: 111
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --filters --path=world.txt $sha1 >actual &&\n'
            span_id: 112
          ) (Token id:Id.Lit_Chars val:'\thas_cr actual\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv --path=<path> works' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(git rev-parse -q --verify HEAD:world.txt) &&\n'
            span_id: 125
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&\n'
            span_id: 126
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv --path=hello.txt $sha1 >rot13 &&\n'
            span_id: 127
          ) (Token id:Id.Lit_Chars val:'\ttest uryyb = "$(cat rot13 | remove_cr)"\n' span_id:128)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--path=<path> complains without --textconv/--filters'
            span_id: 135
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(git rev-parse -q --verify HEAD:world.txt) &&\n'
            span_id: 140
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cat-file --path=hello.txt blob $sha1 >actual 2>err &&\n'
            span_id: 141
          ) (Token id:Id.Lit_Chars val:'\ttest ! -s actual &&\n' span_id:142) 
          (Token id:Id.Lit_Chars val:'\tgrep "path.*needs.*filters" err\n' span_id:143)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cat-file --textconv --batch works' span_id:150))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:154) 
          (Token
            id: Id.Lit_Chars
            val: '\tsha1=$(git rev-parse -q --verify HEAD:world.txt) &&\n'
            span_id: 155
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&\n'
            span_id: 156
          ) (Token id:Id.Lit_Chars val:'\tprintf "%s hello.txt\\n%s hello\\n" $sha1 $sha1 |\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file --textconv --batch >actual &&\n'
            span_id: 158
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tprintf "%s blob 6\\nuryyb\\r\\n\\n%s blob 6\\nhello\\n\\n" \\\n'
            span_id: 159
          ) (Token id:Id.Lit_Chars val:'\t\t$sha1 $sha1 >expect &&\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:161)
        )
      }
    )
    (C {(test_done)})
  ]
)