Merge branch 'en/rebase-backend'
[git] / t / t7412-submodule-absorbgitdirs.sh
1 #!/bin/sh
2
3 test_description='Test submodule absorbgitdirs
4
5 This test verifies that `git submodue absorbgitdirs` moves a submodules git
6 directory into the superproject.
7 '
8
9 . ./test-lib.sh
10
11 test_expect_success 'setup a real submodule' '
12         git init sub1 &&
13         test_commit -C sub1 first &&
14         git submodule add ./sub1 &&
15         test_tick &&
16         git commit -m superproject
17 '
18
19 test_expect_success 'absorb the git dir' '
20         >expect.1 &&
21         >expect.2 &&
22         >actual.1 &&
23         >actual.2 &&
24         git status >expect.1 &&
25         git -C sub1 rev-parse HEAD >expect.2 &&
26         git submodule absorbgitdirs &&
27         git fsck &&
28         test -f sub1/.git &&
29         test -d .git/modules/sub1 &&
30         git status >actual.1 &&
31         git -C sub1 rev-parse HEAD >actual.2 &&
32         test_cmp expect.1 actual.1 &&
33         test_cmp expect.2 actual.2
34 '
35
36 test_expect_success 'absorbing does not fail for deinitialized submodules' '
37         test_when_finished "git submodule update --init" &&
38         git submodule deinit --all &&
39         git submodule absorbgitdirs &&
40         test -d .git/modules/sub1 &&
41         test -d sub1 &&
42         ! test -e sub1/.git
43 '
44
45 test_expect_success 'setup nested submodule' '
46         git init sub1/nested &&
47         test_commit -C sub1/nested first_nested &&
48         git -C sub1 submodule add ./nested &&
49         test_tick &&
50         git -C sub1 commit -m "add nested" &&
51         git add sub1 &&
52         git commit -m "sub1 to include nested submodule"
53 '
54
55 test_expect_success 'absorb the git dir in a nested submodule' '
56         git status >expect.1 &&
57         git -C sub1/nested rev-parse HEAD >expect.2 &&
58         git submodule absorbgitdirs &&
59         test -f sub1/nested/.git &&
60         test -d .git/modules/sub1/modules/nested &&
61         git status >actual.1 &&
62         git -C sub1/nested rev-parse HEAD >actual.2 &&
63         test_cmp expect.1 actual.1 &&
64         test_cmp expect.2 actual.2
65 '
66
67 test_expect_success 're-setup nested submodule' '
68         # un-absorb the direct submodule, to test if the nested submodule
69         # is still correct (needs a rewrite of the gitfile only)
70         rm -rf sub1/.git &&
71         mv .git/modules/sub1 sub1/.git &&
72         GIT_WORK_TREE=. git -C sub1 config --unset core.worktree &&
73         # fixup the nested submodule
74         echo "gitdir: ../.git/modules/nested" >sub1/nested/.git &&
75         GIT_WORK_TREE=../../../nested git -C sub1/.git/modules/nested config \
76                 core.worktree "../../../nested" &&
77         # make sure this re-setup is correct
78         git status --ignore-submodules=none &&
79
80         # also make sure this old setup does not regress
81         git submodule update --init --recursive >out 2>err &&
82         test_must_be_empty out &&
83         test_must_be_empty err
84 '
85
86 test_expect_success 'absorb the git dir in a nested submodule' '
87         git status >expect.1 &&
88         git -C sub1/nested rev-parse HEAD >expect.2 &&
89         git submodule absorbgitdirs &&
90         test -f sub1/.git &&
91         test -f sub1/nested/.git &&
92         test -d .git/modules/sub1/modules/nested &&
93         git status >actual.1 &&
94         git -C sub1/nested rev-parse HEAD >actual.2 &&
95         test_cmp expect.1 actual.1 &&
96         test_cmp expect.2 actual.2
97 '
98
99 test_expect_success 'setup a gitlink with missing .gitmodules entry' '
100         git init sub2 &&
101         test_commit -C sub2 first &&
102         git add sub2 &&
103         git commit -m superproject
104 '
105
106 test_expect_success 'absorbing the git dir fails for incomplete submodules' '
107         git status >expect.1 &&
108         git -C sub2 rev-parse HEAD >expect.2 &&
109         test_must_fail git submodule absorbgitdirs &&
110         git -C sub2 fsck &&
111         test -d sub2/.git &&
112         git status >actual &&
113         git -C sub2 rev-parse HEAD >actual.2 &&
114         test_cmp expect.1 actual.1 &&
115         test_cmp expect.2 actual.2
116 '
117
118 test_expect_success 'setup a submodule with multiple worktrees' '
119         # first create another unembedded git dir in a new submodule
120         git init sub3 &&
121         test_commit -C sub3 first &&
122         git submodule add ./sub3 &&
123         test_tick &&
124         git commit -m "add another submodule" &&
125         git -C sub3 worktree add ../sub3_second_work_tree
126 '
127
128 test_expect_success 'absorbing fails for a submodule with multiple worktrees' '
129         test_must_fail git submodule absorbgitdirs sub3 2>error &&
130         test_i18ngrep "not supported" error
131 '
132
133 test_done