(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)}) ] )