(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"errors in upload-pack">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:D)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(pwd)})])
                left_token: <Left_CommandSub "$(">
                spids: [16 18]
              )
            }
          spids: [15]
        )
      ]
      spids: [15]
    )
    (FuncDef
      name: corrupt_repo
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:object_sha1)
                      op: Equal
                      rhs: 
                        {
                          (CommandSubPart
                            command_list: 
                              (CommandList
                                children: [(C {(git)} {(rev-parse)} {(DQ ($ VSub_Number "$1"))})]
                              )
                            left_token: <Left_CommandSub "$(">
                            spids: [30 38]
                          )
                        }
                      spids: [29]
                    )
                  ]
                  spids: [29]
                )
                (AndOr
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:ob)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(expr)} {(DQ ($ VSub_Name "$object_sha1"))} {(Lit_Other ":")} 
                                        {
                                          (DQ (EscapedLiteralPart token:<Lit_EscapedChar "\\(">) (..) 
                                            (EscapedLiteralPart
                                              token: <Lit_EscapedChar "\\)">
                                            )
                                          )
                                        }
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [44 58]
                              )
                            }
                          spids: [43]
                        )
                      ]
                      spids: [43]
                    )
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:ject)
                              op: Equal
                              rhs: 
                                {
                                  (CommandSubPart
                                    command_list: 
                                      (CommandList
                                        children: [
                                          (C {(expr)} {(DQ ($ VSub_Name "$object_sha1"))} 
                                            {(Lit_Other ":")} 
                                            {
                                              (DQ (..) 
                                                (EscapedLiteralPart
                                                  token: <Lit_EscapedChar "\\(">
                                                ) ("..*") (EscapedLiteralPart token:<Lit_EscapedChar "\\)">)
                                              )
                                            }
                                          )
                                        ]
                                      )
                                    left_token: <Left_CommandSub "$(">
                                    spids: [64 79]
                                  )
                                }
                              spids: [63]
                            )
                          ]
                          spids: [63]
                        )
                        (C {(rm)} {(-f)} 
                          {(DQ (.git/objects/) ($ VSub_Name "$ob") (/) ($ VSub_Name "$ject"))}
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [26]
        )
      spids: [21 25]
    )
    (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)})
  ]
)