(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"git submodule sync\n"> <"\n"> <"These tests exercise the \"git submodule sync\" subcommand.\n"> ) } spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\techo file >file &&\n"> <"\tgit add file &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m upstream &&\n"> <"\tgit clone . super &&\n"> <"\tgit clone super submodule &&\n"> <"\t(\n"> <"\t\tcd submodule &&\n"> <"\t\tgit submodule add ../submodule sub-submodule &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -m \"sub-submodule\"\n"> <"\t) &&\n"> <"\t(\n"> <"\t\tcd super &&\n"> <"\t\tgit submodule add ../submodule submodule &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -m \"submodule\"\n"> <"\t) &&\n"> <"\tgit clone super super-clone &&\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\tgit submodule update --init --recursive\n"> <"\t) &&\n"> <"\tgit clone super empty-clone &&\n"> <"\t(\n"> <"\t\tcd empty-clone &&\n"> <"\t\tgit submodule init\n"> <"\t) &&\n"> <"\tgit clone super top-only-clone &&\n"> <"\tgit clone super relative-clone &&\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit submodule update --init --recursive\n"> <"\t) &&\n"> <"\tgit clone super recursive-clone &&\n"> <"\t(\n"> <"\t\tcd recursive-clone &&\n"> <"\t\tgit submodule update --init --recursive\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"change submodule">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd submodule &&\n"> <"\t\techo second line >>file &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -a -m \"change submodule\"\n"> <"\t)\n"> ) } ) (FuncDef name: reset_submodule_urls body: (BraceGroup children: [ (AndOr children: [ (Subshell child: (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:root) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(pwd)})]) left_token: <Left_CommandSub "$("> spids: [103 105] ) } spids: [102] ) ] spids: [102] ) (AndOr children: [ (C {(cd)} {(super-clone/submodule)}) (C {(git)} {(config)} {(remote.origin.url)} {(DQ ($ VSub_Name "$root") (/submodule))} ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) spids: [99 129] ) (Subshell child: (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:root) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(pwd)})]) left_token: <Left_CommandSub "$("> spids: [138 140] ) } spids: [137] ) ] spids: [137] ) (AndOr children: [ (C {(cd)} {(super-clone/submodule/sub-submodule)}) (C {(git)} {(config)} {(remote.origin.url)} {(DQ ($ VSub_Name "$root") (/submodule))} ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) spids: [134 164] ) ] op_id: Op_DAmp ) ] spids: [96] ) spids: [91 95] ) (C {(test_expect_success)} {(SQ <"change submodule url">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd super &&\n"> <"\t\tcd submodule &&\n"> <"\t\tgit checkout master &&\n"> <"\t\tgit pull\n"> <"\t) &&\n"> <"\tmv submodule moved-submodule &&\n"> <"\t(\n"> <"\t\tcd moved-submodule &&\n"> <"\t\tgit config -f .gitmodules submodule.sub-submodule.url ../moved-submodule &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -a -m moved-sub-submodule\n"> <"\t) &&\n"> <"\t(\n"> <"\t\tcd super &&\n"> <"\t\tgit config -f .gitmodules submodule.submodule.url ../moved-submodule &&\n"> <"\t\ttest_tick &&\n"> <"\t\tgit commit -a -m moved-submodule\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" should update submodule URLs">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\tgit pull --no-recurse-submodules &&\n"> <"\t\tgit submodule sync\n"> <"\t) &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\ttest ! -d \"$(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\t(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit checkout master &&\n"> <"\t\tgit pull\n"> <"\t) &&\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\ttest -d \"$(git config submodule.submodule.url)\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync --recursive\" should update all submodule URLs">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\tgit pull --no-recurse-submodules\n"> <"\t\t) &&\n"> <"\t\tgit submodule sync --recursive\n"> <"\t) &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\t(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit checkout master &&\n"> <"\t\tgit pull\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"reset submodule URLs">)} {(SQ <"\n"> <"\treset_submodule_urls super-clone\n">)} ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" should update submodule URLs - subdirectory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\tgit pull --no-recurse-submodules &&\n"> <"\t\tmkdir -p sub &&\n"> <"\t\tcd sub &&\n"> <"\t\tgit submodule sync >../../output\n"> <"\t) &&\n"> <"\ttest_i18ngrep \"\\\\.\\\\./submodule\" output &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\ttest ! -d \"$(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\t(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit checkout master &&\n"> <"\t\tgit pull\n"> <"\t) &&\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\ttest -d \"$(git config submodule.submodule.url)\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync --recursive\" should update all submodule URLs - subdirectory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd super-clone &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\tgit pull --no-recurse-submodules\n"> <"\t\t) &&\n"> <"\t\tmkdir -p sub &&\n"> <"\t\tcd sub &&\n"> <"\t\tgit submodule sync --recursive >../../output\n"> <"\t) &&\n"> <"\ttest_i18ngrep \"\\\\.\\\\./submodule/sub-submodule\" output &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\ttest -d \"$(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit config remote.origin.url\n"> <"\t)\" &&\n"> <"\t(\n"> <"\t\tcd super-clone/submodule/sub-submodule &&\n"> <"\t\tgit checkout master &&\n"> <"\t\tgit pull\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" should update known submodule URLs">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd empty-clone &&\n"> <"\t\tgit pull &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\ttest -d \"$(git config submodule.submodule.url)\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" should not vivify uninteresting submodule">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top-only-clone &&\n"> <"\t\tgit pull &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\ttest -z \"$(git config submodule.submodule.url)\" &&\n"> <"\t\tgit submodule sync submodule &&\n"> <"\t\ttest -z \"$(git config submodule.submodule.url)\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form foo">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin foo &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual fails with: \"cannot strip off url foo\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form foo/bar">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin foo/bar &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual foo/submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../foo/submodule\"\n"> <"\t\t) &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule/sub-submodule &&\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" != \"../../foo/submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync --recursive\" propagates changes in origin">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd recursive-clone &&\n"> <"\t\tgit remote set-url origin foo/bar &&\n"> <"\t\tgit submodule sync --recursive &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual foo/submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../foo/submodule\"\n"> <"\t\t) &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule/sub-submodule &&\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../../foo/submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form ./foo">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin ./foo &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual ./submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form ./foo/bar">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin ./foo/bar &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual ./foo/submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../foo/submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form ../foo">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin ../foo &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual ../submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../../submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git submodule sync\" handles origin URL of the form ../foo/bar">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin ../foo/bar &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd submodule &&\n"> <"\t\t\t#actual ../foo/submodule\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../../foo/submodule\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} { (SQ < "\"git submodule sync\" handles origin URL of the form ../foo/bar with deeply nested submodule" > ) } { (SQ <"\n"> <"\t(\n"> <"\t\tcd relative-clone &&\n"> <"\t\tgit remote set-url origin ../foo/bar &&\n"> <"\t\tmkdir -p a/b/c &&\n"> <"\t\t(\n"> <"\t\t\tcd a/b/c &&\n"> <"\t\t\tgit init &&\n"> <"\t\t\t>.gitignore &&\n"> <"\t\t\tgit add .gitignore &&\n"> <"\t\t\ttest_tick &&\n"> <"\t\t\tgit commit -m \"initial commit\"\n"> <"\t\t) &&\n"> <"\t\tgit submodule add ../bar/a/b/c ./a/b/c &&\n"> <"\t\tgit submodule sync &&\n"> <"\t\t(\n"> <"\t\t\tcd a/b/c &&\n"> <"\t\t\t#actual ../foo/bar/a/b/c\n"> <"\t\t\ttest \"$(git config remote.origin.url)\" = \"../../../../foo/bar/a/b/c\"\n"> <"\t\t)\n"> <"\t)\n"> ) } ) (C {(test_done)}) ] )