(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: 'see how we handle various forms of corruption'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: obj_to_file
      body: 
        (command.BraceGroup
          children: [
            (C {(echo)} 
              {
                (DQ 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:27)
                    command_list: 
                      (command.CommandList
                        children: [(C {(git)} {(rev-parse)} {(--git-dir)})]
                      )
                  ) (/objects/) 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:35)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.Pipeline
                            children: [
                              (C {(git)} {(rev-parse)} {(DQ ($ Id.VSub_Number '$1'))})
                              (C {(sed)} {(SQ (Token id:Id.Lit_Chars val:'s,..,&/,' span_id:49))})
                            ]
                            negated: F
                          )
                        ]
                      )
                  )
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: corrupt_byte
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:obj_file)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:68)
                            command_list: 
                              (command.CommandList
                                children: [(C {(obj_to_file)} {(DQ ($ Id.VSub_Number '$1'))})]
                              )
                          )
                        }
                      spids: [67]
                    )
                  ]
                )
                (C {(chmod)} {(Id.Lit_Other '+') (w)} {(DQ ($ Id.VSub_DollarName '$obj_file'))})
                (command.Pipeline
                  children: [
                    (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\0' span_id:94))})
                    (C {(dd)} {(Id.Lit_VarLike 'of=') (DQ ($ Id.VSub_DollarName '$obj_file'))} 
                      {(Id.Lit_VarLike 'bs=') (1)} {(Id.Lit_VarLike 'seek=') (DQ ($ Id.VSub_Number '$2'))} {(Id.Lit_VarLike 'conv=') (notrunc)}
                    )
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup corrupt repo' span_id:123))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\tgit init bit-error &&\n' span_id:128) (Token id:Id.Lit_Chars val:'\t(\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\t\tcorrupt_byte HEAD:content.t 10\n' span_id:132) (Token id:Id.Lit_Chars val:'\t)\n' span_id:133)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup repo with missing object' span_id:140))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:144) 
          (Token id:Id.Lit_Chars val:'\tgit init missing &&\n' span_id:145) (Token id:Id.Lit_Chars val:'\t(\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\t\tcd missing &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:148) 
          (Token
            id: Id.Lit_Chars
            val: '\t\trm -f "$(obj_to_file HEAD:content.t)"\n'
            span_id: 149
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:150)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup repo with misnamed object' span_id:157))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\tgit init misnamed &&\n' span_id:162) (Token id:Id.Lit_Chars val:'\t(\n' span_id:163) 
          (Token id:Id.Lit_Chars val:'\t\tcd misnamed &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:165) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgood=$(obj_to_file HEAD:content.t) &&\n'
            span_id: 166
          ) (Token id:Id.Lit_Chars val:'\t\tblob=$(echo corrupt | git hash-object -w --stdin) &&\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\t\tbad=$(obj_to_file $blob) &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\t\trm -f "$good" &&\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\t\tmv "$bad" "$good"\n' span_id:170) (Token id:Id.Lit_Chars val:'\t)\n' span_id:171)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'streaming a corrupt blob fails' span_id:178))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:184) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git cat-file blob HEAD:content.t\n'
            span_id: 185
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:186)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'read-tree -u detects bit-errors in blobs' span_id:193))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:198) (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\t\trm -f content.t &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git read-tree --reset -u HEAD\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:202)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'read-tree -u detects missing objects' span_id:209))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:214) (Token id:Id.Lit_Chars val:'\t\tcd missing &&\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\t\trm -f content.t &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git read-tree --reset -u HEAD\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:218)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects corruption' span_id:231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --no-local --bare bit-error corrupt-transport\n'
            span_id: 236
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects missing object' span_id:243))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:247) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --no-local --bare missing missing-transport\n'
            span_id: 248
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects misnamed object' span_id:255))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --no-local --bare misnamed misnamed-transport\n'
            span_id: 260
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --local detects corruption' span_id:273))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:277) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --local bit-error corrupt-checkout\n'
            span_id: 278
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'error detected during checkout leaves repo intact'
            span_id: 285
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_dir corrupt-checkout/.git\n'
            span_id: 290
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --local detects missing objects' span_id:297))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:301) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --local missing missing-checkout\n'
            span_id: 302
          )
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone --local detects misnamed objects' span_id:309))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:313) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --local misnamed misnamed-checkout\n'
            span_id: 314
          )
        )
      }
    )
    (C {(test_done)})
  ]
)