(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"test textconv caching">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(helper)} spids:[16])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {("#!/bin/sh\n") ("sed 's/^/converted: /' \"$@\" >helper.out\n") ("cat helper.out\n")}
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [19]
        )
      ]
    )
    (C {(chmod)} {(Lit_Other "+") (x)} {(helper)})
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <"\n"> <"\techo foo content 1 >foo.bin &&\n"> <"\techo bar content 1 >bar.bin &&\n"> 
          <"\tgit add . &&\n"> <"\tgit commit -m one &&\n"> <"\techo foo content 2 >foo.bin &&\n"> 
          <"\techo bar content 2 >bar.bin &&\n"> <"\tgit commit -a -m two &&\n"> <"\techo \"*.bin diff=magic\" >.gitattributes &&\n"> 
          <"\tgit config diff.magic.textconv ./helper &&\n"> <"\tgit config diff.magic.cachetextconv true\n">
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[55])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ("diff --git a/bar.bin b/bar.bin\n") ("index fcf9166..28283d5 100644\n") 
                ("--- a/bar.bin\n") ("+++ b/bar.bin\n") ("@@ -1 +1 @@\n") ("-converted: bar content 1\n") ("+converted: bar content 2\n") 
                ("diff --git a/foo.bin b/foo.bin\n") ("index d5b9fe3..1345db2 100644\n") ("--- a/foo.bin\n") ("+++ b/foo.bin\n") ("@@ -1 +1 @@\n") 
                ("-converted: foo content 1\n") ("+converted: foo content 2\n")
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [58]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"first textconv works">)} 
      {(SQ <"\n"> <"\tgit diff HEAD^ HEAD >actual &&\n"> <"\ttest_cmp expect actual\n">)}
    )
    (C {(test_expect_success)} {(SQ <"cached textconv produces same output">)} 
      {(SQ <"\n"> <"\tgit diff HEAD^ HEAD >actual &&\n"> <"\ttest_cmp expect actual\n">)}
    )
    (C {(test_expect_success)} {(SQ <"cached textconv does not run helper">)} 
      {
        (SQ <"\n"> <"\trm -f helper.out &&\n"> <"\tgit diff HEAD^ HEAD >actual &&\n"> 
          <"\ttest_cmp expect actual &&\n"> <"\t! test -r helper.out\n">
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[119])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ("diff --git a/bar.bin b/bar.bin\n") ("index fcf9166..28283d5 100644\n") 
                ("--- a/bar.bin\n") ("+++ b/bar.bin\n") ("@@ -1,2 +1,2 @@\n") (" converted: other\n") ("-converted: bar content 1\n") 
                ("+converted: bar content 2\n") ("diff --git a/foo.bin b/foo.bin\n") ("index d5b9fe3..1345db2 100644\n") ("--- a/foo.bin\n") 
                ("+++ b/foo.bin\n") ("@@ -1,2 +1,2 @@\n") (" converted: other\n") ("-converted: foo content 1\n") 
                ("+converted: foo content 2\n")
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [122]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"changing textconv invalidates cache">)} 
      {
        (SQ <"\n"> <"\techo other >other &&\n"> 
          <"\tgit config diff.magic.textconv \"./helper other\" &&\n"> <"\tgit diff HEAD^ HEAD >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[158])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ("diff --git a/bar.bin b/bar.bin\n") ("index fcf9166..28283d5 100644\n") 
                ("--- a/bar.bin\n") ("+++ b/bar.bin\n") ("@@ -1,2 +1,2 @@\n") (" converted: other\n") ("-converted: bar content 1\n") 
                ("+converted: bar content 2\n") ("diff --git a/foo.bin b/foo.bin\n") ("index d5b9fe3..1345db2 100644\n") ("--- a/foo.bin\n") 
                ("+++ b/foo.bin\n") ("@@ -1 +1 @@\n") ("-converted: foo content 1\n") ("+converted: foo content 2\n")
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [161]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"switching diff driver produces correct results">)} 
      {
        (SQ <"\n"> <"\tgit config diff.moremagic.textconv ./helper &&\n"> 
          <"\techo foo.bin diff=moremagic >>.gitattributes &&\n"> <"\tgit diff HEAD^ HEAD >actual &&\n"> <"\ttest_cmp expect actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"log notes cache and still use cache for -p">)} 
      {(SQ <"\n"> <"\tgit log --no-walk -p refs/notes/textconv/magic HEAD\n">)}
    )
    (C {(test_done)})
  ]
)