(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:'Recursive "git fetch" for submodules' span_id:9))}
          spids: [7]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:pwd)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:19)
                command_list: (command.CommandList children:[(C {(pwd)})])
              )
            }
          spids: [18]
        )
      ]
    )
    (command.ShFunction
      name: add_upstream_commit
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                          ]
                          children: [
                            (C {(cd)} {(submodule)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:head1)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: 
                                          (Token
                                            id: Id.Left_DollarParen
                                            val: '$('
                                            span_id: 42
                                          )
                                        command_list: 
                                          (command.CommandList
                                            children: [(C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                                          )
                                      )
                                    }
                                  spids: [41]
                                )
                              ]
                            )
                            (command.Simple
                              words: [{(echo)} {(new)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:59)
                                  fd: -1
                                  arg_word: {(subfile)}
                                )
                              ]
                            )
                            (C {(test_tick)})
                            (C {(git)} {(add)} {(subfile)})
                            (C {(git)} {(commit)} {(-m)} {(new)} {(subfile)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:head2)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: 
                                          (Token
                                            id: Id.Left_DollarParen
                                            val: '$('
                                            span_id: 94
                                          )
                                        command_list: 
                                          (command.CommandList
                                            children: [(C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                                          )
                                      )
                                    }
                                  spids: [93]
                                )
                              ]
                            )
                            (command.Simple
                              words: [{(echo)} {(DQ ('Fetching submodule submodule'))}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:113)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('From ') ($ Id.VSub_DollarName '$pwd') (/submodule))}
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:128)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                            (command.Simple
                              words: [
                                {(echo)}
                                {
                                  (DQ ('   ') ($ Id.VSub_DollarName '$head1') (..) 
                                    ($ Id.VSub_DollarName '$head2') ('  master     -> origin/master')
                                  )
                                }
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:145)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                )
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                            Id.Op_DAmp
                          ]
                          children: [
                            (C {(cd)} {(deepsubmodule)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:head1)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: 
                                          (Token
                                            id: Id.Left_DollarParen
                                            val: '$('
                                            span_id: 166
                                          )
                                        command_list: 
                                          (command.CommandList
                                            children: [(C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                                          )
                                      )
                                    }
                                  spids: [165]
                                )
                              ]
                            )
                            (command.Simple
                              words: [{(echo)} {(new)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:183)
                                  fd: -1
                                  arg_word: {(deepsubfile)}
                                )
                              ]
                            )
                            (C {(test_tick)})
                            (C {(git)} {(add)} {(deepsubfile)})
                            (C {(git)} {(commit)} {(-m)} {(new)} {(deepsubfile)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:head2)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: 
                                          (Token
                                            id: Id.Left_DollarParen
                                            val: '$('
                                            span_id: 218
                                          )
                                        command_list: 
                                          (command.CommandList
                                            children: [(C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                                          )
                                      )
                                    }
                                  spids: [217]
                                )
                              ]
                            )
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('Fetching submodule submodule/subdir/deepsubmodule'))}
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:237)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                          ]
                        )
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('From ') ($ Id.VSub_DollarName '$pwd') (/deepsubmodule))}
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:250)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                            (command.Simple
                              words: [
                                {(echo)}
                                {
                                  (DQ ('   ') ($ Id.VSub_DollarName '$head1') (..) 
                                    ($ Id.VSub_DollarName '$head2') ('  master     -> origin/master')
                                  )
                                }
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:267)
                                  fd: -1
                                  arg_word: {(../expect.err)}
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\tmkdir deepsubmodule &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\t(\n' span_id:284) 
          (Token id:Id.Lit_Chars val:'\t\tcd deepsubmodule &&\n' span_id:285) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:286) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo deepsubcontent > deepsubfile &&\n'
            span_id: 287
          ) (Token id:Id.Lit_Chars val:'\t\tgit add deepsubfile &&\n' span_id:288) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m new deepsubfile\n' span_id:289) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\tmkdir submodule &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\t(\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\t\tcd submodule &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t\techo subcontent > subfile &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\t\tgit add subfile &&\n' span_id:296) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add "$pwd/deepsubmodule" subdir/deepsubmodule &&\n'
            span_id: 297
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m new\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\tgit submodule add "$pwd/submodule" submodule &&\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\tgit commit -am initial &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\tgit clone . downstream &&\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:303) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:304) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule update --init --recursive\n'
            span_id: 305
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:306)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('fetch --recurse-submodules recurses into submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\t(\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:320) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 321
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:324)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('fetch --recurse-submodules -j2 has the same output behaviour'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:336) (Token id:Id.Lit_Chars val:'\t(\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:338) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tGIT_TRACE=$(pwd)/../trace.out git fetch --recurse-submodules -j2 2>../actual.err\n'
            span_id: 339
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:340) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:341) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err &&\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\tgrep "2 tasks" trace.out\n' span_id:343)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('fetch alone only fetches superproject'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:354) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\t(\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:360) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:361)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('fetch --no-recurse-submodules only fetches superproject'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:373) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --no-recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:378)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ('using fetchRecurseSubmodules=true in .gitmodules recurses into submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:390) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:391) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit config -f .gitmodules submodule.submodule.fetchRecurseSubmodules true &&\n'
            span_id: 392
          ) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:396)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--no-recurse-submodules overrides .gitmodules config'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:407) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:408) (Token id:Id.Lit_Chars val:'\t(\n' span_id:409) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:410) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --no-recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 411
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:414)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ('using fetchRecurseSubmodules=false in .git/config overrides setting in .gitmodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:426) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:427) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config submodule.submodule.fetchRecurseSubmodules false &&\n'
            span_id: 428
          ) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:430) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:431) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:432)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ('--recurse-submodules overrides fetchRecurseSubmodules setting from .git/config'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:443) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:444) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:445) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules >../actual.out 2>../actual.err &&\n'
            span_id: 446
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit config --unset -f .gitmodules submodule.submodule.fetchRecurseSubmodules &&\n'
            span_id: 447
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config --unset submodule.submodule.fetchRecurseSubmodules\n'
            span_id: 448
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:451)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--quiet propagates to submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:462) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:463) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:464) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules --quiet >../actual.out 2>../actual.err\n'
            span_id: 465
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:466) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:467) (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:468)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--quiet propagates to parallel submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:479) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:480) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:481) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules -j 2 --quiet  >../actual.out 2>../actual.err\n'
            span_id: 482
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:483) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:484) (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:485)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--dry-run propagates to submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:496) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:497) (Token id:Id.Lit_Chars val:'\t(\n' span_id:498) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:499) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules --dry-run >../actual.out 2>../actual.err\n'
            span_id: 500
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:501) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:502) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:503)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('Without --dry-run propagates to submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:514) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:515) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:516) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 517
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:518) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:519) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:520)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('recurseSubmodules=true propagates into submodules'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:531) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:532) (Token id:Id.Lit_Chars val:'\t(\n' span_id:533) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\t\tgit config fetch.recurseSubmodules true\n' span_id:535) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch >../actual.out 2>../actual.err\n'
            span_id: 536
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:537) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:538) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:539)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--recurse-submodules overrides config in submodule'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:551) (Token id:Id.Lit_Chars val:'\t(\n' span_id:552) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:553) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:554) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:555) (Token id:Id.Lit_Chars val:'\t\t\tgit config fetch.recurseSubmodules false\n' span_id:556) 
          (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:557) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 558
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:559) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:560) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:561)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('--no-recurse-submodules overrides config setting'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:572) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:573) (Token id:Id.Lit_Chars val:'\t(\n' span_id:574) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\t\tgit config fetch.recurseSubmodules true\n' span_id:576) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --no-recurse-submodules >../actual.out 2>../actual.err\n'
            span_id: 577
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:579) (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:580)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ("Recursion doesn't happen when no new commits are fetched in the superproject"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:591) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:592) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:593) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:594) (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:595) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tgit config --unset fetch.recurseSubmodules\n'
            span_id: 596
          ) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:597) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config --unset fetch.recurseSubmodules\n'
            span_id: 598
          ) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:599) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:600) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:601) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:602)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('Recursion stops when no new submodule commits are fetched'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:613) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 614
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:615) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:616) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:617) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.sub &&\n'
            span_id: 618
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >>expect.err.sub &&\n'
            span_id: 619
          ) (Token id:Id.Lit_Chars val:'\thead -3 expect.err >> expect.err.sub &&\n' span_id:620) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:621) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:622) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch >../actual.out 2>../actual.err\n'
            span_id: 623
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:624) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect.err.sub actual.err &&\n'
            span_id: 625
          ) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out\n' span_id:626)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ("Recursion doesn't happen when new superproject commits don't change any submodules"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:637) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:638) (Token id:Id.Lit_Chars val:'\thead1=$(git rev-parse --short HEAD) &&\n' span_id:639) 
          (Token id:Id.Lit_Chars val:'\techo a > file &&\n' span_id:640) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:641) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new file" &&\n' span_id:642) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:643) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.file &&\n'
            span_id: 644
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >> expect.err.file &&\n'
            span_id: 645
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:646) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:647) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:648) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:649) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:650) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect.err.file actual.err\n'
            span_id: 651
          )
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('Recursion picks up config in submodule'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:662) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:663) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:664) 
          (Token id:Id.Lit_Chars val:'\t\tgit fetch --recurse-submodules &&\n' span_id:665) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:666) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:667) (Token id:Id.Lit_Chars val:'\t\t\tgit config fetch.recurseSubmodules true\n' span_id:668) 
          (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:669) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:670) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:671) (Token id:Id.Lit_Chars val:'\thead1=$(git rev-parse --short HEAD) &&\n' span_id:672) 
          (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:673) (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:674) 
          (Token
            id: Id.Lit_Chars
            val: '\thead2=$(git rev-parse --short HEAD) &&\n'
            span_id: 675
          ) (Token id:Id.Lit_Chars val:'\techo "From $pwd/." > expect.err.sub &&\n' span_id:676) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >> expect.err.sub &&\n'
            span_id: 677
          ) (Token id:Id.Lit_Chars val:'\tcat expect.err >> expect.err.sub &&\n' span_id:678) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:679) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:680) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch >../actual.out 2>../actual.err &&\n'
            span_id: 681
          ) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:682) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:683) (Token id:Id.Lit_Chars val:'\t\t\tgit config --unset fetch.recurseSubmodules\n' span_id:684) 
          (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:685) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:686) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect.err.sub actual.err &&\n'
            span_id: 687
          ) (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out\n' span_id:688)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('Recursion picks up all submodules when necessary'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:699) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:700) (Token id:Id.Lit_Chars val:'\t(\n' span_id:701) 
          (Token id:Id.Lit_Chars val:'\t\tcd submodule &&\n' span_id:702) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:703) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd subdir/deepsubmodule &&\n' span_id:704) (Token id:Id.Lit_Chars val:'\t\t\tgit fetch &&\n' span_id:705) 
          (Token id:Id.Lit_Chars val:'\t\t\tgit checkout -q FETCH_HEAD\n' span_id:706) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:707) 
          (Token
            id: Id.Lit_Chars
            val: '\t\thead1=$(git rev-parse --short HEAD^) &&\n'
            span_id: 708
          ) (Token id:Id.Lit_Chars val:'\t\tgit add subdir/deepsubmodule &&\n' span_id:709) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "new deepsubmodule"\n' span_id:710) (Token id:Id.Lit_Chars val:'\t\thead2=$(git rev-parse --short HEAD) &&\n' span_id:711) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "Fetching submodule submodule" > ../expect.err.sub &&\n'
            span_id: 712
          ) (Token id:Id.Lit_Chars val:'\t\techo "From $pwd/submodule" >> ../expect.err.sub &&\n' span_id:713) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "   $head1..$head2  master     -> origin/master" >> ../expect.err.sub\n'
            span_id: 714
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:715) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 716
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:717) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:718) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:719) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.2 &&\n'
            span_id: 720
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >> expect.err.2 &&\n'
            span_id: 721
          ) (Token id:Id.Lit_Chars val:'\tcat expect.err.sub >> expect.err.2 &&\n' span_id:722) 
          (Token
            id: Id.Lit_Chars
            val: '\ttail -3 expect.err >> expect.err.2 &&\n'
            span_id: 723
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:724) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:725) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:726) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:727) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err.2 actual.err &&\n' span_id:728) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out\n' span_id:729)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (DQ 
          (
"'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)"
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:740) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:741) (Token id:Id.Lit_Chars val:'\t(\n' span_id:742) 
          (Token id:Id.Lit_Chars val:'\t\tcd submodule &&\n' span_id:743) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:744) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd subdir/deepsubmodule &&\n' span_id:745) (Token id:Id.Lit_Chars val:'\t\t\tgit fetch &&\n' span_id:746) 
          (Token id:Id.Lit_Chars val:'\t\t\tgit checkout -q FETCH_HEAD\n' span_id:747) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:748) 
          (Token
            id: Id.Lit_Chars
            val: '\t\thead1=$(git rev-parse --short HEAD^) &&\n'
            span_id: 749
          ) (Token id:Id.Lit_Chars val:'\t\tgit add subdir/deepsubmodule &&\n' span_id:750) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "new deepsubmodule" &&\n'
            span_id: 751
          ) (Token id:Id.Lit_Chars val:'\t\thead2=$(git rev-parse --short HEAD) &&\n' span_id:752) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Fetching submodule submodule > ../expect.err.sub &&\n'
            span_id: 753
          ) (Token id:Id.Lit_Chars val:'\t\techo "From $pwd/submodule" >> ../expect.err.sub &&\n' span_id:754) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "   $head1..$head2  master     -> origin/master" >> ../expect.err.sub\n'
            span_id: 755
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:756) (Token id:Id.Lit_Chars val:'\t(\n' span_id:757) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:758) (Token id:Id.Lit_Chars val:'\t\tgit config fetch.recurseSubmodules true &&\n' span_id:759) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&\n'
            span_id: 760
          ) (Token id:Id.Lit_Chars val:'\t\tgit config --unset fetch.recurseSubmodules\n' span_id:761) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:762) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:763) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err\n' span_id:764)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ("'--recurse-submodules=on-demand' recurses as deep as necessary (and ignores config)"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:775) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 776
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:777) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:778) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:779) 
          (Token
            id: Id.Lit_Chars
            val: '\ttail -3 expect.err > expect.err.deepsub &&\n'
            span_id: 780
          ) (Token id:Id.Lit_Chars val:'\techo "From $pwd/." > expect.err &&\n' span_id:781) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >>expect.err &&\n'
            span_id: 782
          ) (Token id:Id.Lit_Chars val:'\tcat expect.err.sub >> expect.err &&\n' span_id:783) 
          (Token
            id: Id.Lit_Chars
            val: '\tcat expect.err.deepsub >> expect.err &&\n'
            span_id: 784
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:785) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:786) (Token id:Id.Lit_Chars val:'\t\tgit config fetch.recurseSubmodules false &&\n' span_id:787) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:788) (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:789) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\t\tgit config -f .gitmodules submodule.subdir/deepsubmodule.fetchRecursive false\n'
            span_id: 790
          ) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:791) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&\n'
            span_id: 792
          ) (Token id:Id.Lit_Chars val:'\t\tgit config --unset fetch.recurseSubmodules\n' span_id:793) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:794) (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:795) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\t\tgit config --unset -f .gitmodules submodule.subdir/deepsubmodule.fetchRecursive\n'
            span_id: 796
          ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:797) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:798) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:799) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:800)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (DQ 
          (
"'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)"
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:811) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:812) (Token id:Id.Lit_Chars val:'\thead1=$(git rev-parse --short HEAD) &&\n' span_id:813) 
          (Token id:Id.Lit_Chars val:'\techo a >> file &&\n' span_id:814) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:815) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new file" &&\n' span_id:816) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:817) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.file &&\n'
            span_id: 818
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >> expect.err.file &&\n'
            span_id: 819
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:820) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:821) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err\n'
            span_id: 822
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:823) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:824) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err.file actual.err\n' span_id:825)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ("'fetch.recurseSubmodules=on-demand' overrides global config"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:836) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:837) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:838) 
          (Token id:Id.Lit_Chars val:'\t\tgit fetch --recurse-submodules\n' span_id:839) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:840) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:841) (Token id:Id.Lit_Chars val:'\tgit config --global fetch.recurseSubmodules false &&\n' span_id:842) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 843
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:844) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:845) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:846) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.2 &&\n'
            span_id: 847
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >>expect.err.2 &&\n'
            span_id: 848
          ) (Token id:Id.Lit_Chars val:'\thead -3 expect.err >> expect.err.2 &&\n' span_id:849) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:850) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:851) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config fetch.recurseSubmodules on-demand &&\n'
            span_id: 852
          ) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:853) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:854) (Token id:Id.Lit_Chars val:'\tgit config --global --unset fetch.recurseSubmodules &&\n' span_id:855) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:856) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:857) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config --unset fetch.recurseSubmodules\n'
            span_id: 858
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:859) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:860) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err.2 actual.err\n' span_id:861)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ("'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:872) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:873) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:874) 
          (Token id:Id.Lit_Chars val:'\t\tgit fetch --recurse-submodules\n' span_id:875) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:876) 
          (Token id:Id.Lit_Chars val:'\tadd_upstream_commit &&\n' span_id:877) (Token id:Id.Lit_Chars val:'\tgit config fetch.recurseSubmodules false &&\n' span_id:878) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 879
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:880) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "new submodule" &&\n' span_id:881) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:882) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "From $pwd/." > expect.err.2 &&\n'
            span_id: 883
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >>expect.err.2 &&\n'
            span_id: 884
          ) (Token id:Id.Lit_Chars val:'\thead -3 expect.err >> expect.err.2 &&\n' span_id:885) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:886) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:887) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config submodule.submodule.fetchRecurseSubmodules on-demand &&\n'
            span_id: 888
          ) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:889) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:890) (Token id:Id.Lit_Chars val:'\tgit config --unset fetch.recurseSubmodules &&\n' span_id:891) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:892) (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:893) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config --unset submodule.submodule.fetchRecurseSubmodules\n'
            span_id: 894
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:895) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty actual.out &&\n' span_id:896) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err.2 actual.err\n' span_id:897)
        )
      }
    )
    (C {(test_expect_success)} 
      {(DQ ("don't fetch submodule when newly recorded commits are already present"))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:908) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:909) (Token id:Id.Lit_Chars val:'\t\tcd submodule &&\n' span_id:910) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -q HEAD^^\n' span_id:911) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:912) 
          (Token
            id: Id.Lit_Chars
            val: '\thead1=$(git rev-parse --short HEAD) &&\n'
            span_id: 913
          ) (Token id:Id.Lit_Chars val:'\tgit add submodule &&\n' span_id:914) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "submodule rewound" &&\n'
            span_id: 915
          ) (Token id:Id.Lit_Chars val:'\thead2=$(git rev-parse --short HEAD) &&\n' span_id:916) 
          (Token id:Id.Lit_Chars val:'\techo "From $pwd/." > expect.err &&\n' span_id:917) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "   $head1..$head2  master     -> origin/master" >> expect.err &&\n'
            span_id: 918
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:919) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:920) (Token id:Id.Lit_Chars val:'\t\tgit fetch >../actual.out 2>../actual.err\n' span_id:921) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:922) (Token id:Id.Lit_Chars val:'\t! test -s actual.out &&\n' span_id:923) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect.err actual.err\n' span_id:924)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetching submodules respects parallel settings' span_id:931))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:935) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config fetch.recurseSubmodules true &&\n'
            span_id: 936
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:937) 
          (Token id:Id.Lit_Chars val:'\t\tcd downstream &&\n' span_id:938) (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE=$(pwd)/trace.out git fetch --jobs 7 &&\n' span_id:939) 
          (Token id:Id.Lit_Chars val:'\t\tgrep "7 tasks" trace.out &&\n' span_id:940) (Token id:Id.Lit_Chars val:'\t\tgit config submodule.fetchJobs 8 &&\n' span_id:941) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_TRACE=$(pwd)/trace.out git fetch &&\n'
            span_id: 942
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "8 tasks" trace.out &&\n' span_id:943) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_TRACE=$(pwd)/trace.out git fetch --jobs 9 &&\n'
            span_id: 944
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "9 tasks" trace.out\n' span_id:945) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:946)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetching submodule into a broken repository' span_id:953))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:957) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Prepare src and src/sub nested in it\n'
            span_id: 958
          ) (Token id:Id.Lit_Chars val:'\tgit init src &&\n' span_id:959) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:960) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:961) 
          (Token id:Id.Lit_Chars val:'\t\tgit init sub &&\n' span_id:962) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit -C sub commit --allow-empty -m "initial in sub" &&\n'
            span_id: 963
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule add -- ./sub sub &&\n' span_id:964) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "initial in top"\n' span_id:965) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:966) (Token id:Id.Lit_Chars val:'\n' span_id:967) 
          (Token id:Id.Lit_Chars val:'\t# Clone the old-fashoned way\n' span_id:968) (Token id:Id.Lit_Chars val:'\tgit clone src dst &&\n' span_id:969) 
          (Token id:Id.Lit_Chars val:'\tgit -C dst clone ../src/sub sub &&\n' span_id:970) (Token id:Id.Lit_Chars val:'\n' span_id:971) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Make sure that old-fashoned layout is still supported\n'
            span_id: 972
          ) (Token id:Id.Lit_Chars val:'\tgit -C dst status &&\n' span_id:973) 
          (Token id:Id.Lit_Chars val:'\n' span_id:974) (Token id:Id.Lit_Chars val:'\t# "diff" would find no change\n' span_id:975) 
          (Token id:Id.Lit_Chars val:'\tgit -C dst diff --exit-code &&\n' span_id:976) (Token id:Id.Lit_Chars val:'\n' span_id:977) 
          (Token id:Id.Lit_Chars val:'\t# Recursive-fetch works fine\n' span_id:978) (Token id:Id.Lit_Chars val:'\tgit -C dst fetch --recurse-submodules &&\n' span_id:979) 
          (Token id:Id.Lit_Chars val:'\n' span_id:980) (Token id:Id.Lit_Chars val:'\t# Break the receiving submodule\n' span_id:981) 
          (Token id:Id.Lit_Chars val:'\trm -f dst/sub/.git/HEAD &&\n' span_id:982) (Token id:Id.Lit_Chars val:'\n' span_id:983) 
          (Token
            id: Id.Lit_Chars
            val: '\t# NOTE: without the fix the following tests will recurse forever!\n'
            span_id: 984
          ) (Token id:Id.Lit_Chars val:'\t# They should terminate with an error.\n' span_id:985) 
          (Token id:Id.Lit_Chars val:'\n' span_id:986) (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C dst status &&\n' span_id:987) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C dst diff &&\n' span_id:988) (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C dst fetch --recurse-submodules\n' span_id:989)
        )
      }
    )
    (C {(test_done)})
  ]
)