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