(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'errors in upload-pack'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:D)
          op: assign_op.Equal
          rhs: {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<pwd>}))}
          spids: [15]
        )
      ]
    )
    (command.ShFunction
      name: corrupt_repo
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:object_sha1)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: (C {<git>} {<rev-parse>} {(DQ ($ Id.VSub_Number '$1'))})
                          )
                        }
                      spids: [29]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ob)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (C {<expr>} {(DQ ($ Id.VSub_DollarName '$object_sha1'))} 
                                {<Id.Lit_Colon ':'>} {(DQ <Id.Lit_BadBackslash '\\'> <'(..'> <Id.Lit_BadBackslash '\\'> <')'>)}
                              )
                          )
                        }
                      spids: [43]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ject)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (C {<expr>} {(DQ ($ Id.VSub_DollarName '$object_sha1'))} 
                                {<Id.Lit_Colon ':'>} {(DQ <..> <Id.Lit_BadBackslash '\\'> <'(..*'> <Id.Lit_BadBackslash '\\'> <')'>)}
                              )
                          )
                        }
                      spids: [64]
                    )
                  ]
                )
                (C {<rm>} {<-f>} 
                  {
                    (DQ <'.git/objects/'> ($ Id.VSub_DollarName '$ob') <'/'> 
                      ($ Id.VSub_DollarName '$ject')
                    )
                  }
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'setup and corrupt repository'>)} 
      {
        (SQ <'\n'> <'\n'> <'\techo file >file &&\n'> <'\tgit add file &&\n'> 
          <'\tgit rev-parse :file &&\n'> <'\tgit commit -a -m original &&\n'> <'\ttest_tick &&\n'> <'\techo changed >file &&\n'> 
          <'\tgit commit -a -m changed &&\n'> <'\tcorrupt_repo HEAD:file\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fsck fails'>)} {(SQ <'\n'> <'\ttest_must_fail git fsck\n'>)})
    (C {<test_expect_success>} {(SQ <'upload-pack fails due to error in pack-objects packing'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tprintf "0032want %s\\n00000009done\\n0000" \\\n'> 
          <'\t\t$(git rev-parse HEAD) >input &&\n'> <'\ttest_must_fail git upload-pack . <input >/dev/null 2>output.err &&\n'> 
          <'\ttest_i18ngrep "unable to read" output.err &&\n'> <'\ttest_i18ngrep "pack-objects died" output.err\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'corrupt repo differently'>)} 
      {(SQ <'\n'> <'\n'> <'\tgit hash-object -w file &&\n'> <'\tcorrupt_repo HEAD^^{tree}\n'> <'\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'fsck fails'>)} {(SQ <'\n'> <'\ttest_must_fail git fsck\n'>)})
    (C {<test_expect_success>} {(SQ <'upload-pack fails due to error in rev-list'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tprintf "0032want %s\\n0034shallow %s00000009done\\n0000" \\\n'> 
          <'\t\t$(git rev-parse HEAD) $(git rev-parse HEAD^) >input &&\n'> <'\ttest_must_fail git upload-pack . <input >/dev/null 2>output.err &&\n'> 
          <'\tgrep "bad tree object" output.err\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'upload-pack error message when bad ref requested'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tprintf "0045want %s multi_ack_detailed\\n00000009done\\n0000" \\\n'> 
          <'\t\t"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" >input &&\n'> <'\ttest_must_fail git upload-pack . <input >output 2>output.err &&\n'> 
          <'\tgrep -q "not our ref" output.err &&\n'> <'\t! grep -q multi_ack_detailed output.err\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'upload-pack fails due to error in pack-objects enumeration'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tprintf "0032want %s\\n00000009done\\n0000" \\\n'> 
          <'\t\t$(git rev-parse HEAD) >input &&\n'> <'\ttest_must_fail git upload-pack . <input >/dev/null 2>output.err &&\n'> 
          <'\tgrep "bad tree object" output.err &&\n'> <'\tgrep "pack-objects died" output.err\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'create empty repository'>)} 
      {(SQ <'\n'> <'\n'> <'\tmkdir foo &&\n'> <'\tcd foo &&\n'> <'\tgit init\n'> <'\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'fetch fails'>)} 
      {(SQ <'\n'> <'\n'> <'\ttest_must_fail git fetch .. master\n'> <'\n'>)}
    )
    (C {<test_done>})
  ]
)