| #!/bin/sh | |
| test_description='Test submodule absorbgitdirs | |
| This test verifies that `git submodue absorbgitdirs` moves a submodules git | |
| directory into the superproject. | |
| ' | |
| . ./test-lib.sh | |
| test_expect_success 'setup a real submodule' ' | |
| cwd="$(pwd)" && | |
| git init sub1 && | |
| test_commit -C sub1 first && | |
| git submodule add ./sub1 && | |
| test_tick && | |
| git commit -m superproject | |
| ' | |
| test_expect_success 'absorb the git dir' ' | |
| >expect && | |
| >actual && | |
| >expect.1 && | |
| >expect.2 && | |
| >actual.1 && | |
| >actual.2 && | |
| git status >expect.1 && | |
| git -C sub1 rev-parse HEAD >expect.2 && | |
| cat >expect <<-EOF && | |
| Migrating git directory of '\''sub1'\'' from | |
| '\''$cwd/sub1/.git'\'' to | |
| '\''$cwd/.git/modules/sub1'\'' | |
| EOF | |
| git submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual && | |
| git fsck && | |
| test -f sub1/.git && | |
| test -d .git/modules/sub1 && | |
| git status >actual.1 && | |
| git -C sub1 rev-parse HEAD >actual.2 && | |
| test_cmp expect.1 actual.1 && | |
| test_cmp expect.2 actual.2 | |
| ' | |
| test_expect_success 'absorbing does not fail for deinitialized submodules' ' | |
| test_when_finished "git submodule update --init" && | |
| git submodule deinit --all && | |
| git submodule absorbgitdirs 2>err && | |
| test_must_be_empty err && | |
| test -d .git/modules/sub1 && | |
| test -d sub1 && | |
| ! test -e sub1/.git | |
| ' | |
| test_expect_success 'setup nested submodule' ' | |
| git init sub1/nested && | |
| test_commit -C sub1/nested first_nested && | |
| git -C sub1 submodule add ./nested && | |
| test_tick && | |
| git -C sub1 commit -m "add nested" && | |
| git add sub1 && | |
| git commit -m "sub1 to include nested submodule" | |
| ' | |
| test_expect_success 'absorb the git dir in a nested submodule' ' | |
| git status >expect.1 && | |
| git -C sub1/nested rev-parse HEAD >expect.2 && | |
| cat >expect <<-EOF && | |
| Migrating git directory of '\''sub1/nested'\'' from | |
| '\''$cwd/sub1/nested/.git'\'' to | |
| '\''$cwd/.git/modules/sub1/modules/nested'\'' | |
| EOF | |
| git submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual && | |
| test -f sub1/nested/.git && | |
| test -d .git/modules/sub1/modules/nested && | |
| git status >actual.1 && | |
| git -C sub1/nested rev-parse HEAD >actual.2 && | |
| test_cmp expect.1 actual.1 && | |
| test_cmp expect.2 actual.2 | |
| ' | |
| test_expect_success 're-setup nested submodule' ' | |
| # un-absorb the direct submodule, to test if the nested submodule | |
| # is still correct (needs a rewrite of the gitfile only) | |
| rm -rf sub1/.git && | |
| mv .git/modules/sub1 sub1/.git && | |
| GIT_WORK_TREE=. git -C sub1 config --unset core.worktree && | |
| # fixup the nested submodule | |
| echo "gitdir: ../.git/modules/nested" >sub1/nested/.git && | |
| GIT_WORK_TREE=../../../nested git -C sub1/.git/modules/nested config \ | |
| core.worktree "../../../nested" && | |
| # make sure this re-setup is correct | |
| git status --ignore-submodules=none && | |
| # also make sure this old setup does not regress | |
| git submodule update --init --recursive >out 2>err && | |
| test_must_be_empty out && | |
| test_must_be_empty err | |
| ' | |
| test_expect_success 'absorb the git dir in a nested submodule' ' | |
| git status >expect.1 && | |
| git -C sub1/nested rev-parse HEAD >expect.2 && | |
| cat >expect <<-EOF && | |
| Migrating git directory of '\''sub1'\'' from | |
| '\''$cwd/sub1/.git'\'' to | |
| '\''$cwd/.git/modules/sub1'\'' | |
| EOF | |
| git submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual && | |
| test -f sub1/.git && | |
| test -f sub1/nested/.git && | |
| test -d .git/modules/sub1/modules/nested && | |
| git status >actual.1 && | |
| git -C sub1/nested rev-parse HEAD >actual.2 && | |
| test_cmp expect.1 actual.1 && | |
| test_cmp expect.2 actual.2 | |
| ' | |
| test_expect_success 'absorb the git dir outside of primary worktree' ' | |
| test_when_finished "rm -rf repo-bare.git" && | |
| git clone --bare . repo-bare.git && | |
| test_when_finished "rm -rf repo-wt" && | |
| git -C repo-bare.git worktree add ../repo-wt && | |
| test_when_finished "rm -f .gitconfig" && | |
| test_config_global protocol.file.allow always && | |
| git -C repo-wt submodule update --init && | |
| git init repo-wt/sub2 && | |
| test_commit -C repo-wt/sub2 A && | |
| git -C repo-wt submodule add ./sub2 sub2 && | |
| cat >expect <<-EOF && | |
| Migrating git directory of '\''sub2'\'' from | |
| '\''$cwd/repo-wt/sub2/.git'\'' to | |
| '\''$cwd/repo-bare.git/worktrees/repo-wt/modules/sub2'\'' | |
| EOF | |
| git -C repo-wt submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual | |
| ' | |
| test_expect_success 'setup a gitlink with missing .gitmodules entry' ' | |
| git init sub2 && | |
| test_commit -C sub2 first && | |
| git add sub2 && | |
| git commit -m superproject | |
| ' | |
| test_expect_success 'absorbing the git dir fails for incomplete submodules' ' | |
| git status >expect.1 && | |
| git -C sub2 rev-parse HEAD >expect.2 && | |
| cat >expect <<-\EOF && | |
| fatal: could not lookup name for submodule '\''sub2'\'' | |
| EOF | |
| test_must_fail git submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual && | |
| git -C sub2 fsck && | |
| test -d sub2/.git && | |
| git status >actual && | |
| git -C sub2 rev-parse HEAD >actual.2 && | |
| test_cmp expect.1 actual.1 && | |
| test_cmp expect.2 actual.2 | |
| ' | |
| test_expect_success 'setup a submodule with multiple worktrees' ' | |
| # first create another unembedded git dir in a new submodule | |
| git init sub3 && | |
| test_commit -C sub3 first && | |
| git submodule add ./sub3 && | |
| test_tick && | |
| git commit -m "add another submodule" && | |
| git -C sub3 worktree add ../sub3_second_work_tree | |
| ' | |
| test_expect_success 'absorbing fails for a submodule with multiple worktrees' ' | |
| cat >expect <<-\EOF && | |
| fatal: could not lookup name for submodule '\''sub2'\'' | |
| EOF | |
| test_must_fail git submodule absorbgitdirs 2>actual && | |
| test_cmp expect actual | |
| ' | |
| test_done |