(List (= scope= flags=0 words=[] bindings=[('test_description', {[SQ ]})]) (Com {[LIT_CHARS .]} {[LIT_CHARS ./test-lib.sh]}) (= scope= flags=0 words=[] bindings=[('pwd', {[ComSub (Com {[LIT_CHARS pwd]})]})]) (FunctionDef add_upstream_commit [] (AndOr OP_AND_IF (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[LIT_CHARS submodule]}) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('head1', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[LIT_CHARS HEAD]})]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS echo]} {[LIT_CHARS new]} < (FilenameRedirectNode filename={[LIT_CHARS subfile]} >"> 1), > ) (AndOr OP_AND_IF (Com {[LIT_CHARS test_tick]}) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS add]} {[LIT_CHARS subfile]}) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS commit]} {[LIT_CHARS -m]} {[LIT_CHARS new]} {[LIT_CHARS subfile]}) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('head2', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[LIT_CHARS HEAD]})]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Fetching submodule submodule"]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} "> 1), > ) (AndOr OP_AND_IF (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "From "][VarSub pwd][LIT_CHARS /submodule]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} >"> 1), > ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " "][VarSub head1][LIT_CHARS ..][VarSub head2][LIT_CHARS " master -> origin/master"]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} >"> 1), > ) ) ) ) ) ) ) ) ) ) ) (Subshell (List (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[LIT_CHARS deepsubmodule]}) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('head1', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[LIT_CHARS HEAD]})]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS echo]} {[LIT_CHARS new]} < (FilenameRedirectNode filename={[LIT_CHARS deepsubfile]} >"> 1), > ) (AndOr OP_AND_IF (Com {[LIT_CHARS test_tick]}) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS add]} {[LIT_CHARS deepsubfile]}) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS commit]} {[LIT_CHARS -m]} {[LIT_CHARS new]} {[LIT_CHARS deepsubfile]}) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('head2', {[ComSub (Com {[LIT_CHARS git]} {[LIT_CHARS rev-parse]} {[LIT_CHARS --short]} {[LIT_CHARS HEAD]})]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Fetching submodule submodule/subdir/deepsubmodule"]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} >"> 1), > ) ) ) ) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "From "][VarSub pwd][LIT_CHARS /deepsubmodule]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} >"> 1), > ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " "][VarSub head1][LIT_CHARS ..][VarSub head2][LIT_CHARS " master -> origin/master"]]} < (FilenameRedirectNode filename={[LIT_CHARS ../expect.err]} >"> 1), > ) ) ) ) ) ) (Com {[LIT_CHARS test_expect_success]} {[LIT_CHARS setup]} {[SQ deepsubfile &&\n"> subfile &&\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "fetch --recurse-submodules recurses into submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "fetch --recurse-submodules -j2 has the same output behaviour"]]} {[SQ ../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "fetch alone only fetches superproject"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "fetch --no-recurse-submodules only fetches superproject"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "using fetchRecurseSubmodules=true in .gitmodules recurses into submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--no-recurse-submodules overrides .gitmodules config"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "using fetchRecurseSubmodules=false in .git/config overrides setting in .gitmodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--recurse-submodules overrides fetchRecurseSubmodules setting from .git/config"]]} {[SQ ../actual.out 2>../actual.err &&\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--quiet propagates to submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--quiet propagates to parallel submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--dry-run propagates to submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Without --dry-run propagates to submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "recurseSubmodules=true propagates into submodules"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--recurse-submodules overrides config in submodule"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "--no-recurse-submodules overrides config setting"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Recursion doesn't happen when no new commits are fetched in the superproject"]]} {[SQ ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Recursion stops when no new submodule commits are fetched"]]} {[SQ expect.err.sub &&\n"> origin/master\" >>expect.err.sub &&\n"> > expect.err.sub &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Recursion doesn't happen when new superproject commits don't change any submodules"]]} {[SQ file &&\n"> expect.err.file &&\n"> origin/master\" >> expect.err.file &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Recursion picks up config in submodule"]]} {[SQ expect.err.sub &&\n"> origin/master\" >> expect.err.sub &&\n"> > expect.err.sub &&\n"> ../actual.out 2>../actual.err &&\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "Recursion picks up all submodules when necessary"]]} {[SQ ../expect.err.sub &&\n"> > ../expect.err.sub &&\n"> origin/master\" >> ../expect.err.sub\n"> expect.err.2 &&\n"> origin/master\" >> expect.err.2 &&\n"> > expect.err.2 &&\n"> > expect.err.2 &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)"]]} {[SQ ../expect.err.sub &&\n"> > ../expect.err.sub &&\n"> origin/master\" >> ../expect.err.sub\n"> ../actual.out 2>../actual.err &&\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "'--recurse-submodules=on-demand' recurses as deep as necessary (and ignores config)"]]} {[SQ expect.err.deepsub &&\n"> expect.err &&\n"> origin/master\" >>expect.err &&\n"> > expect.err &&\n"> > expect.err &&\n"> ../actual.out 2>../actual.err &&\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)"]]} {[SQ > file &&\n"> expect.err.file &&\n"> origin/master\" >> expect.err.file &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "'fetch.recurseSubmodules=on-demand' overrides global config"]]} {[SQ expect.err.2 &&\n"> origin/master\" >>expect.err.2 &&\n"> > expect.err.2 &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "'submodule..fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules"]]} {[SQ expect.err.2 &&\n"> origin/master\" >>expect.err.2 &&\n"> > expect.err.2 &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "don't fetch submodule when newly recorded commits are already present"]]} {[SQ expect.err &&\n"> origin/master\" >> expect.err &&\n"> ../actual.out 2>../actual.err\n"> ]}) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]}) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]}) (Com {[LIT_CHARS test_done]}) )