(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.ShFunction
      name: test_alternate_is_used
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:alternates_file)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [37]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:working_dir)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$2'))}
                      spids: [45]
                    )
                  ]
                )
                (C {(test_line_count)} {(Id.Lit_Equals '=')} {(1)} 
                  {(DQ ($ Id.VSub_DollarName '$alternates_file'))}
                )
                (command.Simple
                  words: [{(echo)} {(DQ ('0 objects, 0 kilobytes'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:72)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(git)} {(-C)} {(DQ ($ Id.VSub_DollarName '$working_dir'))} {(count-objects)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:88)
                      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:106))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo A &&\n' span_id:111) (Token id:Id.Lit_Chars val:'\t(\n' span_id:112) 
          (Token id:Id.Lit_Chars val:'\t\tcd A &&\n' span_id:113) (Token id:Id.Lit_Chars val:'\t\techo first >file1 &&\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file1 &&\n' span_id:115) (Token id:Id.Lit_Chars val:'\t\tgit commit -m A-initial\n' span_id:116) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:117)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'preparing second repository' span_id:124))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\tgit clone A B &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\t(\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t\tcd B &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\techo second >file2 &&\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file2 &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\t\tgit commit -m B-addition &&\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\t\tgit repack -a -d &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\t\tgit prune\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:137)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'preparing superproject' span_id:144))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo super &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\t(\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\t\techo file >file &&\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\t\tgit commit -m B-super-initial\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:155)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add --reference uses alternates' span_id:162))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:167) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:168) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add --reference ../B "file://$base_dir/A" sub &&\n'
            span_id: 169
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit -m B-super-added &&\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t\tgit repack -ad\n' span_id:171) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:172) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_alternate_is_used super/.git/modules/sub/objects/info/alternates super/sub\n'
            span_id: 173
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'that reference gets used with add' span_id:180))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:185) (Token id:Id.Lit_Chars val:'\t\tcd super/sub &&\n' span_id:186) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "0 objects, 0 kilobytes" >expected &&\n'
            span_id: 187
          ) (Token id:Id.Lit_Chars val:'\t\tgit count-objects >current &&\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\t\tdiff expected current\n' span_id:189) (Token id:Id.Lit_Chars val:'\t)\n' span_id:190)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'updating superproject keeps alternates' span_id:216))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:220) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf super-clone" &&\n'
            span_id: 221
          ) (Token id:Id.Lit_Chars val:'\tgit clone super super-clone &&\n' span_id:222) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -C super-clone submodule update --init --reference ../B &&\n'
            span_id: 223
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_alternate_is_used super-clone/.git/modules/sub/objects/info/alternates super-clone/sub\n'
            span_id: 224
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodules use alternates when cloning a superproject'
            span_id: 231
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf super-clone" &&\n'
            span_id: 236
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --reference super --recursive super super-clone &&\n'
            span_id: 237
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:238) 
          (Token id:Id.Lit_Chars val:'\t\tcd super-clone &&\n' span_id:239) (Token id:Id.Lit_Chars val:'\t\t# test superproject has alternates setup correctly\n' span_id:240) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_alternate_is_used .git/objects/info/alternates . &&\n'
            span_id: 241
          ) (Token id:Id.Lit_Chars val:'\t\t# test submodule has correct setup\n' span_id:242) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_alternate_is_used .git/modules/sub/objects/info/alternates sub\n'
            span_id: 243
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:244)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'missing submodule alternate fails clone and submodule update'
            span_id: 251
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:255) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf super-clone" &&\n'
            span_id: 256
          ) (Token id:Id.Lit_Chars val:'\tgit clone super super2 &&\n' span_id:257) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --recursive --reference super2 super2 super-clone &&\n'
            span_id: 258
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:259) 
          (Token id:Id.Lit_Chars val:'\t\tcd super-clone &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\t\t# test superproject has alternates setup correctly\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_alternate_is_used .git/objects/info/alternates . &&\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\t\t# update of the submodule succeeds\n' span_id:263) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git submodule update --init &&\n'
            span_id: 264
          ) (Token id:Id.Lit_Chars val:'\t\t# and we have no alternates:\n' span_id:265) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest_must_fail test_alternate_is_used .git/modules/sub/objects/info/alternates sub &&\n'
            span_id: 266
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail test_path_is_file sub/file1\n' span_id:267) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:268)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'ignoring missing submodule alternates passes clone and submodule update'
            span_id: 275
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:279) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf super-clone" &&\n'
            span_id: 280
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --reference-if-able super2 --recursive super2 super-clone &&\n'
            span_id: 281
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\t\tcd super-clone &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\t\t# test superproject has alternates setup correctly\n' span_id:284) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_alternate_is_used .git/objects/info/alternates . &&\n'
            span_id: 285
          ) (Token id:Id.Lit_Chars val:'\t\t# update of the submodule succeeds\n' span_id:286) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule update --init &&\n' span_id:287) (Token id:Id.Lit_Chars val:'\t\t# and we have no alternates:\n' span_id:288) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest_must_fail test_alternate_is_used .git/modules/sub/objects/info/alternates sub &&\n'
            span_id: 289
          ) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file sub/file1\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:291)
        )
      }
    )
    (C {(test_done)})
  ]
)