(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: 'filter-branch removal of trees with null sha1'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: base commits' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\ttest_commit three\n' span_id:24)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'setup: a commit with a bogus null sha1 in the tree'
            span_id: 31
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:35) (Token id:Id.Lit_Chars val:'\t{\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\t\tgit ls-tree HEAD &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\t\tprintf "160000 commit $_z40\\\\tbroken\\\\n"\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\t} >broken-tree &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\techo "add broken entry" >msg &&\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\n' span_id:41) (Token id:Id.Lit_Chars val:'\ttree=$(git mktree <broken-tree) &&\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tcommit=$(git commit-tree $tree -p HEAD <msg) &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\tgit update-ref HEAD "$commit"\n' span_id:45)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup: bring HEAD and index in sync' span_id:64))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:68) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:69) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "back to normal"\n' span_id:70)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'filter commands are still checked' span_id:77))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git filter-branch \\\n' span_id:82) (Token id:Id.Lit_Chars val:'\t\t--force --prune-empty \\\n' span_id:83) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t--index-filter "git rm --cached --ignore-unmatch three.t"\n'
            span_id: 84
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'removing the broken entry works' span_id:91))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:95) 
          (Token id:Id.Lit_Chars val:'\techo three >expect &&\n' span_id:96) (Token id:Id.Lit_Chars val:'\tgit filter-branch \\\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\t\t--force --prune-empty \\\n' span_id:98) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t--index-filter "git rm --cached --ignore-unmatch broken" &&\n'
            span_id: 99
          ) (Token id:Id.Lit_Chars val:'\tgit log -1 --format=%s >actual &&\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:101)
        )
      }
    )
    (C {(test_done)})
  ]
)