mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Stefan Beller](/assets/img/avatar_default.png)
Consider having a submodule 'sub' and a nested submodule at 'sub/nested'. When nested is already absorbed into sub, but sub is not absorbed into its superproject, then we need to fixup the gitfile and core.worktree setting for 'nested' when absorbing 'sub', but we do not need to move its git dir around. Previously 'nested's gitfile contained "gitdir: ../.git/modules/nested"; it has to be corrected to "gitdir: ../../.git/modules/sub1/modules/nested". An alternative I considered to do this work lazily, i.e. when resolving "../.git/modules/nested", we would notice the ".git" being a gitfile linking to another path. That seemed to be robuster by design, but harder to get the implementation right. Maybe we have to do that anyway once we try to have submodules and worktrees working nicely together, but for now just produce 'correct' (i.e. direct) pointers. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
129 lines
3.6 KiB
Bash
Executable file
129 lines
3.6 KiB
Bash
Executable file
#!/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' '
|
|
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.1 &&
|
|
>expect.2 &&
|
|
>actual.1 &&
|
|
>actual.2 &&
|
|
git status >expect.1 &&
|
|
git -C sub1 rev-parse HEAD >expect.2 &&
|
|
git submodule absorbgitdirs &&
|
|
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 deinitalized submodules' '
|
|
test_when_finished "git submodule update --init" &&
|
|
git submodule deinit --all &&
|
|
git submodule absorbgitdirs &&
|
|
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 &&
|
|
git submodule absorbgitdirs &&
|
|
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
|
|
'
|
|
|
|
test_expect_success 'absorb the git dir in a nested submodule' '
|
|
git status >expect.1 &&
|
|
git -C sub1/nested rev-parse HEAD >expect.2 &&
|
|
git submodule absorbgitdirs &&
|
|
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 '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 &&
|
|
test_must_fail git submodule absorbgitdirs &&
|
|
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' '
|
|
test_must_fail git submodule absorbgitdirs sub3 2>error &&
|
|
test_i18ngrep "not supported" error
|
|
'
|
|
|
|
test_done
|