(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:'test clone --reference' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:base_dir)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:24)
                command_list: (command.CommandList children:[(C {(pwd)})])
              )
            }
          spids: [23]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:U)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$base_dir') (/UPLOAD_LOG)}
          spids: [29]
        )
      ]
    )
    (command.ShFunction
      name: commit_in
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (C {(cd)} {(DQ ($ Id.VSub_Number '$1'))})
                        (command.Simple
                          words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:63)
                              fd: -1
                              arg_word: {(DQ ($ Id.VSub_Number '$2'))}
                            )
                          ]
                        )
                        (C {(git)} {(add)} {(DQ ($ Id.VSub_Number '$2'))})
                        (C {(git)} {(commit)} {(-m)} {(DQ ($ Id.VSub_Number '$2'))})
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: test_objcount
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(echo)} {(DQ ($ Id.VSub_Number '$2'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:115)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(git)} {(-C)} {(DQ ($ Id.VSub_Number '$1'))} {(count-objects)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:131)
                      fd: -1
                      arg_word: {(actual.raw)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(cut)} {(-d) (SQ (Token id:Id.Lit_Chars val:' ' span_id:141))} {(-f1)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:146)
                      fd: -1
                      arg_word: {(actual.raw)}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:149)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'preparing first repository' span_id:167))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:171) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo A &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tcommit_in A file1\n' span_id:173)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'preparing second repository' span_id:180))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\tgit clone A B &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tcommit_in B file2 &&\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\tgit -C B repack -ad &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\tgit -C B prune\n' span_id:188)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cloning with reference (-l -s)' span_id:195))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\tgit clone -l -s --reference B A C\n' span_id:200)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'existence of info/alternates' span_id:207))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:211) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_line_count = 2 C/.git/objects/info/alternates\n'
            span_id: 212
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pulling from reference' span_id:219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\tgit -C C pull ../B master\n' span_id:224)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'that reference gets used' span_id:231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token id:Id.Lit_Chars val:'\ttest_objcount C 0\n' span_id:236)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cloning with reference (no -l -s)' span_id:243))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:247) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_TRACE_PACKET=$U.D git clone --reference B "file://$(pwd)/A" D\n'
            span_id: 248
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fetched no objects' span_id:255))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\ttest -s "$U.D" &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\t! grep " want" "$U.D"\n' span_id:261)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'existence of info/alternates' span_id:268))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:272) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_line_count = 1 D/.git/objects/info/alternates\n'
            span_id: 273
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pulling from reference' span_id:280))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:284) 
          (Token id:Id.Lit_Chars val:'\tgit -C D pull ../B master\n' span_id:285)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'that reference gets used' span_id:292))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\ttest_objcount D 0\n' span_id:297)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'updating origin' span_id:304))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:308) 
          (Token id:Id.Lit_Chars val:'\tcommit_in A file3 &&\n' span_id:309) (Token id:Id.Lit_Chars val:'\tgit -C A repack -ad &&\n' span_id:310) 
          (Token id:Id.Lit_Chars val:'\tgit -C A prune\n' span_id:311)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'pulling changes from origin' span_id:318))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\tgit -C C pull origin\n' span_id:323)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'that alternate to origin gets used' span_id:333))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\ttest_objcount C 2\n' span_id:338)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'pulling changes from origin' span_id:345))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\tgit -C D pull origin\n' span_id:350)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'check objects expected to exist locally' span_id:363))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:367) 
          (Token id:Id.Lit_Chars val:'\ttest_objcount D 5\n' span_id:368)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'preparing alternate repository #1' span_id:375))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:379) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo F &&\n' span_id:380) (Token id:Id.Lit_Chars val:'\tcommit_in F file1\n' span_id:381)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cloning alternate repo #2 and adding changes to repo #1'
            span_id: 388
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:392) 
          (Token id:Id.Lit_Chars val:'\tgit clone F G &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\tcommit_in F file2\n' span_id:394)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cloning alternate repo #1, using #2 as reference'
            span_id: 401
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\tgit clone --reference G F H\n' span_id:406)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cloning with reference being subset of source (-l -s)'
            span_id: 413
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\tgit clone -l -s --reference A B E\n' span_id:418)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cloning with multiple references drops duplicates'
            span_id: 425
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:429) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone -s --reference B --reference A --reference B A dups &&\n'
            span_id: 430
          ) (Token id:Id.Lit_Chars val:'\ttest_line_count = 2 dups/.git/objects/info/alternates\n' span_id:431)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone with reference from a tagged repository' span_id:438))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:442) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:443) (Token id:Id.Lit_Chars val:'\t\tcd A && git tag -a -m tagged HEAD\n' span_id:444) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:445) (Token id:Id.Lit_Chars val:'\tgit clone --reference=A A I\n' span_id:446)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prepare branched repository' span_id:453))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) 
          (Token id:Id.Lit_Chars val:'\tgit clone A J &&\n' span_id:458) (Token id:Id.Lit_Chars val:'\t(\n' span_id:459) 
          (Token id:Id.Lit_Chars val:'\t\tcd J &&\n' span_id:460) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b other master^ &&\n' span_id:461) 
          (Token id:Id.Lit_Chars val:'\t\techo other >otherfile &&\n' span_id:462) (Token id:Id.Lit_Chars val:'\t\tgit add otherfile &&\n' span_id:463) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m other &&\n' span_id:464) (Token id:Id.Lit_Chars val:'\t\tgit checkout master\n' span_id:465) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:466)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetch with incomplete alternates' span_id:473))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:477) 
          (Token id:Id.Lit_Chars val:'\tgit init K &&\n' span_id:478) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "$base_dir/A/.git/objects" >K/.git/objects/info/alternates &&\n'
            span_id: 479
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:480) 
          (Token id:Id.Lit_Chars val:'\t\tcd K &&\n' span_id:481) (Token id:Id.Lit_Chars val:'\t\tgit remote add J "file://$base_dir/J" &&\n' span_id:482) 
          (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE_PACKET=$U.K git fetch J\n' span_id:483) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:484) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tmaster_object=$(cd A && git for-each-ref --format="%(objectname)" refs/heads/master) &&\n'
            span_id: 485
          ) (Token id:Id.Lit_Chars val:'\ttest -s "$U.K" &&\n' span_id:486) 
          (Token
            id: Id.Lit_Chars
            val: '\t! grep " want $master_object" "$U.K" &&\n'
            span_id: 487
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttag_object=$(cd A && git for-each-ref --format="%(objectname)" refs/tags/HEAD) &&\n'
            span_id: 488
          ) (Token id:Id.Lit_Chars val:'\t! grep " want $tag_object" "$U.K"\n' span_id:489)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone using repo with gitfile as a reference' span_id:496))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:500) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --separate-git-dir=L A M &&\n'
            span_id: 501
          ) (Token id:Id.Lit_Chars val:'\tgit clone --reference=M A N &&\n' span_id:502) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "$base_dir/L/objects" >expected &&\n'
            span_id: 503
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected "$base_dir/N/.git/objects/info/alternates"\n'
            span_id: 504
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'clone using repo pointed at by gitfile as reference'
            span_id: 511
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:515) 
          (Token id:Id.Lit_Chars val:'\tgit clone --reference=M/.git A O &&\n' span_id:516) (Token id:Id.Lit_Chars val:'\techo "$base_dir/L/objects" >expected &&\n' span_id:517) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected "$base_dir/O/.git/objects/info/alternates"\n'
            span_id: 518
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone and dissociate from reference' span_id:525))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:529) 
          (Token id:Id.Lit_Chars val:'\tgit init P &&\n' span_id:530) (Token id:Id.Lit_Chars val:'\t(\n' span_id:531) 
          (Token id:Id.Lit_Chars val:'\t\tcd P &&\ttest_commit one\n' span_id:532) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:533) 
          (Token id:Id.Lit_Chars val:'\tgit clone P Q &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\t(\n' span_id:535) 
          (Token id:Id.Lit_Chars val:'\t\tcd Q && test_commit two\n' span_id:536) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:537) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --no-local --reference=P Q R &&\n'
            span_id: 538
          ) (Token id:Id.Lit_Chars val:'\tgit clone --no-local --reference=P --dissociate Q S &&\n' span_id:539) 
          (Token
            id: Id.Lit_Chars
            val: '\t# removing the reference P would corrupt R but not S\n'
            span_id: 540
          ) (Token id:Id.Lit_Chars val:'\trm -fr P &&\n' span_id:541) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C R fsck &&\n' span_id:542) (Token id:Id.Lit_Chars val:'\tgit -C S fsck\n' span_id:543)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'clone, dissociate from partial reference and repack'
            span_id: 549
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:553) 
          (Token id:Id.Lit_Chars val:'\trm -fr P Q R &&\n' span_id:554) (Token id:Id.Lit_Chars val:'\tgit init P &&\n' span_id:555) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:556) (Token id:Id.Lit_Chars val:'\t\tcd P &&\n' span_id:557) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:558) (Token id:Id.Lit_Chars val:'\t\tgit repack &&\n' span_id:559) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:560) (Token id:Id.Lit_Chars val:'\t\tgit repack\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:562) (Token id:Id.Lit_Chars val:'\tgit clone --bare P Q &&\n' span_id:563) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:564) (Token id:Id.Lit_Chars val:'\t\tcd P &&\n' span_id:565) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second &&\n' span_id:566) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:567) 
          (Token id:Id.Lit_Chars val:'\t\tgit repack\n' span_id:568) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:569) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --bare --dissociate --reference=P Q R &&\n'
            span_id: 570
          ) (Token id:Id.Lit_Chars val:'\tls R/objects/pack/*.pack >packs.txt &&\n' span_id:571) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 packs.txt\n' span_id:572)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone, dissociate from alternates' span_id:579))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:583) 
          (Token id:Id.Lit_Chars val:'\trm -fr A B C &&\n' span_id:584) (Token id:Id.Lit_Chars val:'\ttest_create_repo A &&\n' span_id:585) 
          (Token id:Id.Lit_Chars val:'\tcommit_in A file1 &&\n' span_id:586) (Token id:Id.Lit_Chars val:'\tgit clone --reference=A A B &&\n' span_id:587) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_line_count = 1 B/.git/objects/info/alternates &&\n'
            span_id: 588
          ) (Token id:Id.Lit_Chars val:'\tgit clone --local --dissociate B C &&\n' span_id:589) 
          (Token
            id: Id.Lit_Chars
            val: '\t! test -f C/.git/objects/info/alternates &&\n'
            span_id: 590
          ) (Token id:Id.Lit_Chars val:'\t( cd C && git fsck )\n' span_id:591)
        )
      }
    )
    (C {(test_done)})
  ]
)