#!/bin/sh global test_description := ''Combination of submodules and multiple workdirs'' source ./test-lib.sh global base_path := $[pwd -P] test_expect_success 'setup: make origin' \ 'mkdir -p origin/sub && ( cd origin/sub && git init && echo file1 >file1 && git add file1 && git commit -m file1 ) && mkdir -p origin/main && ( cd origin/main && git init && git submodule add ../sub && git commit -m "add sub" ) && ( cd origin/sub && echo file1updated >file1 && git add file1 && git commit -m "file1 updated" ) && ( cd origin/main/sub && git pull ) && ( cd origin/main && git add sub && git commit -m "sub updated" )' test_expect_success 'setup: clone' \ 'mkdir clone && ( cd clone && git clone --recursive "$base_path/origin/main")' global rev1_hash_main := $[git --git-dir=origin/main/.git show --pretty=format:%h -q "HEAD~1] global rev1_hash_sub := $[git --git-dir=origin/sub/.git show --pretty=format:%h -q "HEAD~1] test_expect_success 'checkout main' \ 'mkdir default_checkout && (cd clone/main && git worktree add "$base_path/default_checkout/main" "$rev1_hash_main")' test_expect_failure 'can see submodule diffs just after checkout' \ '(cd default_checkout/main && git diff --submodule master"^!" | grep "file1 updated")' test_expect_success 'checkout main and initialize independed clones' \ 'mkdir fully_cloned_submodule && (cd clone/main && git worktree add "$base_path/fully_cloned_submodule/main" "$rev1_hash_main") && (cd fully_cloned_submodule/main && git submodule update)' test_expect_success 'can see submodule diffs after independed cloning' \ '(cd fully_cloned_submodule/main && git diff --submodule master"^!" | grep "file1 updated")' test_expect_success 'checkout sub manually' \ 'mkdir linked_submodule && (cd clone/main && git worktree add "$base_path/linked_submodule/main" "$rev1_hash_main") && (cd clone/main/sub && git worktree add "$base_path/linked_submodule/main/sub" "$rev1_hash_sub")' test_expect_success 'can see submodule diffs after manual checkout of linked submodule' \ '(cd linked_submodule/main && git diff --submodule master"^!" | grep "file1 updated")' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Combination of submodules and multiple workdirs">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:base_path) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(pwd)} {(-P)})]) left_token: spids: [16 20] ) } spids: [15] ) ] spids: [15] ) (C {(test_expect_success)} {(SQ <"setup: make origin">)} { (SQ <"mkdir -p origin/sub && ( cd origin/sub && git init &&\n"> <"\techo file1 >file1 &&\n"> <"\tgit add file1 &&\n"> <"\tgit commit -m file1 ) &&\n"> <" mkdir -p origin/main && ( cd origin/main && git init &&\n"> <"\tgit submodule add ../sub &&\n"> <"\tgit commit -m \"add sub\" ) &&\n"> <" ( cd origin/sub &&\n"> <"\techo file1updated >file1 &&\n"> <"\tgit add file1 &&\n"> <"\tgit commit -m \"file1 updated\" ) &&\n"> <" ( cd origin/main/sub && git pull ) &&\n"> <" ( cd origin/main &&\n"> <"\tgit add sub &&\n"> <"\tgit commit -m \"sub updated\" )"> ) } ) (C {(test_expect_success)} {(SQ <"setup: clone">)} { (SQ <"mkdir clone && ( cd clone &&\n"> <"\tgit clone --recursive \"$base_path/origin/main\")">) } ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:rev1_hash_main) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (C {(git)} {(--git-dir) (Lit_Other "=") (origin/main/.git)} {(show)} {(--pretty) (Lit_Other "=") (format) (Lit_Other ":") (Lit_Other "%") (h)} {(-q)} {(DQ ("HEAD~1"))} ) ] ) left_token: spids: [65 86] ) } spids: [64] ) ] spids: [64] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:rev1_hash_sub) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (C {(git)} {(--git-dir) (Lit_Other "=") (origin/sub/.git)} {(show)} {(--pretty) (Lit_Other "=") (format) (Lit_Other ":") (Lit_Other "%") (h)} {(-q)} {(DQ ("HEAD~1"))} ) ] ) left_token: spids: [89 110] ) } spids: [88] ) ] spids: [88] ) (C {(test_expect_success)} {(SQ <"checkout main">)} { (SQ <"mkdir default_checkout &&\n"> <" (cd clone/main &&\n"> <"\tgit worktree add \"$base_path/default_checkout/main\" \"$rev1_hash_main\")"> ) } ) (C {(test_expect_failure)} {(SQ <"can see submodule diffs just after checkout">)} { (SQ < "(cd default_checkout/main && git diff --submodule master\"^!\" | grep \"file1 updated\")" > ) } ) (C {(test_expect_success)} {(SQ <"checkout main and initialize independed clones">)} { (SQ <"mkdir fully_cloned_submodule &&\n"> <" (cd clone/main &&\n"> < "\tgit worktree add \"$base_path/fully_cloned_submodule/main\" \"$rev1_hash_main\") &&\n" > <" (cd fully_cloned_submodule/main && git submodule update)"> ) } ) (C {(test_expect_success)} {(SQ <"can see submodule diffs after independed cloning">)} { (SQ < "(cd fully_cloned_submodule/main && git diff --submodule master\"^!\" | grep \"file1 updated\")" > ) } ) (C {(test_expect_success)} {(SQ <"checkout sub manually">)} { (SQ <"mkdir linked_submodule &&\n"> <" (cd clone/main &&\n"> <"\tgit worktree add \"$base_path/linked_submodule/main\" \"$rev1_hash_main\") &&\n"> <" (cd clone/main/sub &&\n"> <"\tgit worktree add \"$base_path/linked_submodule/main/sub\" \"$rev1_hash_sub\")"> ) } ) (C {(test_expect_success)} {(SQ <"can see submodule diffs after manual checkout of linked submodule">)} {(SQ <"(cd linked_submodule/main && git diff --submodule master\"^!\" | grep \"file1 updated\")">)} ) (C {(test_done)}) ] )