(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 "git submodule foreach"\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 
'This test verifies that "git submodule foreach" correctly visits all submodules\n'
                  span_id: 17
                ) (Token id:Id.Lit_Chars val:'that are currently checked out.\n' span_id:18)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup a submodule tree' span_id:31))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:35) 
          (Token id:Id.Lit_Chars val:'\techo file > file &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:37) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\tgit commit -m upstream &&\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\tgit clone . super &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit clone super submodule &&\n' span_id:41) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:42) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:43) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add ../submodule sub1 &&\n'
            span_id: 44
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../submodule sub2 &&\n' span_id:45) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add ../submodule sub3 &&\n'
            span_id: 46
          ) (Token id:Id.Lit_Chars val:'\t\tgit config -f .gitmodules --rename-section \\\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\t\t\tsubmodule.sub1 submodule.foo1 &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\t\tgit config -f .gitmodules --rename-section \\\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\t\t\tsubmodule.sub2 submodule.foo2 &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t\tgit config -f .gitmodules --rename-section \\\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\t\t\tsubmodule.sub3 submodule.foo3 &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\t\tgit add .gitmodules &&\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "submodules" &&\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init sub1 &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\t\tgit submodule init sub2 &&\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init sub3\n' span_id:58) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\t(\n' span_id:60) 
          (Token id:Id.Lit_Chars val:'\t\tcd submodule &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t\techo different > file &&\n' span_id:62) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file &&\n' span_id:63) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:64) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "different"\n' span_id:65) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\t(\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd sub3 &&\n' span_id:70) (Token id:Id.Lit_Chars val:'\t\t\tgit pull\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:72) (Token id:Id.Lit_Chars val:'\t\tgit add sub3 &&\n' span_id:73) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:74) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "update sub3"\n' span_id:75) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:76)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub1sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:81)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(super/sub1)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [80]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub3sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:96)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(super/sub3)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [95]
        )
      ]
    )
    (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:112)
                command_list: (command.CommandList children:[(C {(pwd)})])
              )
            }
          spids: [111]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:119)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:123)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 137
          stdin_parts: [
            ("Entering 'sub1'\n")
            ($ Id.VSub_DollarName '$pwd')
            (/clone-foo1-sub1-)
            ($ Id.VSub_DollarName '$sub1sha1')
            ('\n')
            ("Entering 'sub3'\n")
            ($ Id.VSub_DollarName '$pwd')
            (/clone-foo3-sub3-)
            ($ Id.VSub_DollarName '$sub3sha1')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test basic "submodule foreach" usage' span_id:142))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\tgit clone super clone &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\t(\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\t\tgit submodule update --init -- sub1 sub3 &&\n' span_id:150) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit submodule foreach "echo \\$toplevel-\\$name-\\$path-\\$sha1" > ../actual &&\n'
            span_id: 151
          ) (Token id:Id.Lit_Chars val:'\t\tgit config foo.bar zar &&\n' span_id:152) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit submodule foreach "git config --file \\"\\$toplevel/.git/config\\" foo.bar"\n'
            span_id: 153
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:155)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:161)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:164)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 178
          stdin_parts: [
            ("Entering '../sub1'\n")
            ($ Id.VSub_DollarName '$pwd')
            (/clone-foo1-../sub1-)
            ($ Id.VSub_DollarName '$sub1sha1')
            ('\n')
            ("Entering '../sub3'\n")
            ($ Id.VSub_DollarName '$pwd')
            (/clone-foo3-../sub3-)
            ($ Id.VSub_DollarName '$sub3sha1')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test "submodule foreach" from subdirectory' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\tmkdir clone/sub &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\t(\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone/sub &&\n' span_id:190) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit submodule foreach "echo \\$toplevel-\\$name-\\$sm_path-\\$sha1" >../../actual\n'
            span_id: 191
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:193)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup nested submodules' span_id:200))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\tgit clone submodule nested1 &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\tgit clone submodule nested2 &&\n' span_id:206) 
          (Token id:Id.Lit_Chars val:'\tgit clone submodule nested3 &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\t(\n' span_id:208) 
          (Token id:Id.Lit_Chars val:'\t\tcd nested3 &&\n' span_id:209) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../submodule submodule &&\n' span_id:210) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:211) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "submodule" &&\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init submodule\n' span_id:213) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:214) (Token id:Id.Lit_Chars val:'\t(\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\t\tcd nested2 &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../nested3 nested3 &&\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "nested3" &&\n' span_id:219) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init nested3\n' span_id:220) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\t(\n' span_id:222) 
          (Token id:Id.Lit_Chars val:'\t\tcd nested1 &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../nested2 nested2 &&\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:225) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "nested2" &&\n' span_id:226) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init nested2\n' span_id:227) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\t(\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../nested1 nested1 &&\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "nested1" &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init nested1\n' span_id:234) (Token id:Id.Lit_Chars val:'\t)\n' span_id:235)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use "submodule foreach" to checkout 2nd level submodule'
            span_id: 242
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\tgit clone super clone2 &&\n' span_id:247) (Token id:Id.Lit_Chars val:'\t(\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:249) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 250
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub2/.git &&\n'
            span_id: 251
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 252
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir nested1/.git &&\n'
            span_id: 253
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule update --init &&\n' span_id:254) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 255
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir sub2/.git &&\n' span_id:256) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 257
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir nested1/.git &&\n' span_id:258) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 259
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach "git submodule update --init" &&\n'
            span_id: 260
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 261
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir nested1/nested2/nested3/.git\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use "foreach --recursive" to checkout all submodules'
            span_id: 270
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:275) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:276) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach --recursive "git submodule update --init" &&\n'
            span_id: 277
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&\n'
            span_id: 278
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git\n'
            span_id: 279
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:280)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:286)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:290)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 301
          stdin_parts: [
            ("Entering 'nested1'\n")
            ("Entering 'nested1/nested2'\n")
            ("Entering 'nested1/nested2/nested3'\n")
            ("Entering 'nested1/nested2/nested3/submodule'\n")
            ("Entering 'sub1'\n")
            ("Entering 'sub2'\n")
            ("Entering 'sub3'\n")
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test messages from "foreach --recursive"' span_id:306))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:310) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:311) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:312) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach --recursive "true" > ../actual\n'
            span_id: 313
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:315)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:321)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:325)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 336
          stdin_parts: [
            ("Entering '../nested1'\n")
            ("Entering '../nested1/nested2'\n")
            ("Entering '../nested1/nested2/nested3'\n")
            ("Entering '../nested1/nested2/nested3/submodule'\n")
            ("Entering '../sub1'\n")
            ("Entering '../sub2'\n")
            ("Entering '../sub3'\n")
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'test messages from "foreach --recursive" from subdirectory'
            span_id: 341
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:346) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:347) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir untracked &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\t\tcd untracked &&\n' span_id:349) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach --recursive >../../actual\n'
            span_id: 350
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:351) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:352)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:358)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:362)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 373
          stdin_parts: [
            ('nested1-nested1\n')
            ('nested2-nested2\n')
            ('nested3-nested3\n')
            ('submodule-submodule\n')
            ('foo1-sub1\n')
            ('foo2-sub2\n')
            ('foo3-sub3\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test "foreach --quiet --recursive"' span_id:378))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:383) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:384) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach -q --recursive "echo \\$name-\\$path" > ../actual\n'
            span_id: 385
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:387)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use "update --recursive" to checkout all submodules'
            span_id: 394
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\tgit clone super clone3 &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\t(\n' span_id:400) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone3 &&\n' span_id:401) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 402
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub2/.git &&\n'
            span_id: 403
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 404
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir nested1/.git &&\n'
            span_id: 405
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule update --init --recursive &&\n' span_id:406) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 407
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir sub2/.git &&\n' span_id:408) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 409
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir nested1/.git &&\n' span_id:410) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 411
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&\n'
            span_id: 412
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git\n'
            span_id: 413
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:414)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:nested1sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:419)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(clone3/nested1)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [418]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:nested2sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:434)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [
                          (C {(cd)} {(clone3/nested1/nested2)})
                          (C {(git)} {(rev-parse)} {(HEAD)})
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [433]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:nested3sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:449)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [
                          (C {(cd)} {(clone3/nested1/nested2/nested3)})
                          (C {(git)} {(rev-parse)} {(HEAD)})
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [448]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:submodulesha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:464)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [
                          (C {(cd)} {(clone3/nested1/nested2/nested3/submodule)})
                          (C {(git)} {(rev-parse)} {(HEAD)})
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [463]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub1sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:479)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(clone3/sub1)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [478]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub2sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:494)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(clone3/sub2)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [493]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub3sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:509)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(clone3/sub3)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [508]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub1sha1_short)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:524)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [
                          (C {(cd)} {(clone3/sub1)})
                          (C {(git)} {(rev-parse)} {(--short)} {(HEAD)})
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [523]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sub2sha1_short)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:541)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [
                          (C {(cd)} {(clone3/sub2)})
                          (C {(git)} {(rev-parse)} {(--short)} {(HEAD)})
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [540]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:560)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:564)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 593
          stdin_parts: [
            (' ')
            ($ Id.VSub_DollarName '$nested1sha1')
            (' nested1 (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$nested2sha1')
            (' nested1/nested2 (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$nested3sha1')
            (' nested1/nested2/nested3 (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$submodulesha1')
            (' nested1/nested2/nested3/submodule (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$sub1sha1')
            (' sub1 (')
            ($ Id.VSub_DollarName '$sub1sha1_short')
            (')\n')
            (' ')
            ($ Id.VSub_DollarName '$sub2sha1')
            (' sub2 (')
            ($ Id.VSub_DollarName '$sub2sha1_short')
            (')\n')
            (' ')
            ($ Id.VSub_DollarName '$sub3sha1')
            (' sub3 (heads/master)\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test "status --recursive"' span_id:598))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:602) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:603) (Token id:Id.Lit_Chars val:'\t\tcd clone3 &&\n' span_id:604) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule status --recursive > ../actual\n'
            span_id: 605
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:606) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:607)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:613)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:617)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 633
          stdin_parts: [
            (' ')
            ($ Id.VSub_DollarName '$nested1sha1')
            (' nested1 (heads/master)\n')
            ('+')
            ($ Id.VSub_DollarName '$nested2sha1')
            (' nested1/nested2 (file2~1)\n')
            (' ')
            ($ Id.VSub_DollarName '$nested3sha1')
            (' nested1/nested2/nested3 (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$submodulesha1')
            (' nested1/nested2/nested3/submodule (heads/master)\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'ensure "status --cached --recursive" preserves the --cached flag'
            span_id: 638
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:642) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:643) (Token id:Id.Lit_Chars val:'\t\tcd clone3 &&\n' span_id:644) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:645) (Token id:Id.Lit_Chars val:'\t\t\tcd nested1/nested2 &&\n' span_id:646) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_commit file2\n' span_id:647) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:648) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule status --cached --recursive -- nested1 > ../actual\n'
            span_id: 649
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:650) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:651)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:nested2sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:656)
                command_list: 
                  (command.CommandList
                    children: [(C {(git)} {(-C)} {(clone3/nested1/nested2)} {(rev-parse)} {(HEAD)})]
                  )
              )
            }
          spids: [655]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:671)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:675)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 704
          stdin_parts: [
            (' ')
            ($ Id.VSub_DollarName '$nested1sha1')
            (' ../nested1 (heads/master)\n')
            ('+')
            ($ Id.VSub_DollarName '$nested2sha1')
            (' ../nested1/nested2 (file2)\n')
            (' ')
            ($ Id.VSub_DollarName '$nested3sha1')
            (' ../nested1/nested2/nested3 (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$submodulesha1')
            (' ../nested1/nested2/nested3/submodule (heads/master)\n')
            (' ')
            ($ Id.VSub_DollarName '$sub1sha1')
            (' ../sub1 (')
            ($ Id.VSub_DollarName '$sub1sha1_short')
            (')\n')
            (' ')
            ($ Id.VSub_DollarName '$sub2sha1')
            (' ../sub2 (')
            ($ Id.VSub_DollarName '$sub2sha1_short')
            (')\n')
            (' ')
            ($ Id.VSub_DollarName '$sub3sha1')
            (' ../sub3 (heads/master)\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test "status --recursive" from sub directory' span_id:709))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:713) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:714) (Token id:Id.Lit_Chars val:'\t\tcd clone3 &&\n' span_id:715) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir tmp && cd tmp &&\n' span_id:716) (Token id:Id.Lit_Chars val:'\t\tgit submodule status --recursive > ../../actual\n' span_id:717) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:718) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:719)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use "git clone --recursive" to checkout all submodules'
            span_id: 726
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:730) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --recursive super clone4 &&\n'
            span_id: 731
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:732) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone4 &&\n' span_id:733) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir .git &&\n' span_id:734) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 735
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir sub2/.git &&\n' span_id:736) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 737
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir nested1/.git &&\n' span_id:738) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 739
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&\n'
            span_id: 740
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git\n'
            span_id: 741
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:742)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'test "update --recursive" with a flag with spaces'
            span_id: 749
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:753) 
          (Token id:Id.Lit_Chars val:'\tgit clone super "common objects" &&\n' span_id:754) (Token id:Id.Lit_Chars val:'\tgit clone super clone5 &&\n' span_id:755) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:756) (Token id:Id.Lit_Chars val:'\t\tcd clone5 &&\n' span_id:757) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir d nested1/.git &&\n'
            span_id: 758
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&\n'
            span_id: 759
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir nested1/.git &&\n' span_id:760) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 761
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&\n'
            span_id: 762
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest -f .git/modules/nested1/objects/info/alternates &&\n'
            span_id: 763
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest -f .git/modules/nested1/modules/nested2/objects/info/alternates &&\n'
            span_id: 764
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest -f .git/modules/nested1/modules/nested2/modules/nested3/objects/info/alternates\n'
            span_id: 765
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:766)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use "update --recursive nested1" to checkout all submodules rooted in nested1'
            span_id: 773
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:777) 
          (Token id:Id.Lit_Chars val:'\tgit clone super clone6 &&\n' span_id:778) (Token id:Id.Lit_Chars val:'\t(\n' span_id:779) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone6 &&\n' span_id:780) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 781
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub2/.git &&\n'
            span_id: 782
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 783
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir nested1/.git &&\n'
            span_id: 784
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule update --init --recursive -- nested1 &&\n' span_id:785) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub1/.git &&\n'
            span_id: 786
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub2/.git &&\n'
            span_id: 787
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir sub3/.git &&\n'
            span_id: 788
          ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --resolve-git-dir nested1/.git &&\n' span_id:789) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/.git &&\n'
            span_id: 790
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&\n'
            span_id: 791
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git\n'
            span_id: 792
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:793)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'command passed to foreach retains notion of stdin'
            span_id: 800
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:804) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:805) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:806) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach echo success >../expected &&\n'
            span_id: 807
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tyes | git submodule foreach "read y && test \\"x\\$y\\" = xy && echo success" >../actual\n'
            span_id: 808
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:809) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:810)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'command passed to foreach --recursive retains notion of stdin'
            span_id: 817
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:821) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:822) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:823) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach --recursive echo success >../expected &&\n'
            span_id: 824
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tyes | git submodule foreach --recursive "read y && test \\"x\\$y\\" = xy && echo success" >../actual\n'
            span_id: 825
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:826) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:827)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'multi-argument command passed to foreach is not shell-evaluated twice'
            span_id: 834
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:838) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:839) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:840) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule foreach "echo \\\\\\"quoted\\\\\\"" > ../expected &&\n'
            span_id: 841
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule foreach echo \\"quoted\\" > ../actual\n' span_id:842) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:843) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:844)
        )
      }
    )
    (C {(test_done)})
  ]
)