Merge branch 'ao/diff-populate-filespec-lstat-errorpath-fix'
[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
81 test_expect_success 'absorb the git dir in a nested submodule' '
82         git status >expect.1 &&
83         git -C sub1/nested rev-parse HEAD >expect.2 &&
84         git submodule absorbgitdirs &&
85         test -f sub1/.git &&
86         test -f sub1/nested/.git &&
87         test -d .git/modules/sub1/modules/nested &&
88         git status >actual.1 &&
89         git -C sub1/nested rev-parse HEAD >actual.2 &&
90         test_cmp expect.1 actual.1 &&
91         test_cmp expect.2 actual.2
92 '
93
94 test_expect_success 'setup a gitlink with missing .gitmodules entry' '
95         git init sub2 &&
96         test_commit -C sub2 first &&
97         git add sub2 &&
98         git commit -m superproject
99 '
100
101 test_expect_success 'absorbing the git dir fails for incomplete submodules' '
102         git status >expect.1 &&
103         git -C sub2 rev-parse HEAD >expect.2 &&
104         test_must_fail git submodule absorbgitdirs &&
105         git -C sub2 fsck &&
106         test -d sub2/.git &&
107         git status >actual &&
108         git -C sub2 rev-parse HEAD >actual.2 &&
109         test_cmp expect.1 actual.1 &&
110         test_cmp expect.2 actual.2
111 '
112
113 test_expect_success 'setup a submodule with multiple worktrees' '
114         # first create another unembedded git dir in a new submodule
115         git init sub3 &&
116         test_commit -C sub3 first &&
117         git submodule add ./sub3 &&
118         test_tick &&
119         git commit -m "add another submodule" &&
120         git -C sub3 worktree add ../sub3_second_work_tree
121 '
122
123 test_expect_success 'absorbing fails for a submodule with multiple worktrees' '
124         test_must_fail git submodule absorbgitdirs sub3 2>error &&
125         test_i18ngrep "not supported" error
126 '
127
128 test_done