t7403: modernize style
[git] / t / t7403-submodule-sync.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2008 David Aguilar
4 #
5
6 test_description='git submodule sync
7
8 These tests exercise the "git submodule sync" subcommand.
9 '
10
11 . ./test-lib.sh
12
13 test_expect_success setup '
14         echo file >file &&
15         git add file &&
16         test_tick &&
17         git commit -m upstream &&
18         git clone . super &&
19         git clone super submodule &&
20         (
21                 cd submodule &&
22                 git submodule add ../submodule sub-submodule &&
23                 test_tick &&
24                 git commit -m "sub-submodule"
25         ) &&
26         (
27                 cd super &&
28                 git submodule add ../submodule submodule &&
29                 test_tick &&
30                 git commit -m "submodule"
31         ) &&
32         git clone super super-clone &&
33         (
34                 cd super-clone &&
35                 git submodule update --init --recursive
36         ) &&
37         git clone super empty-clone &&
38         (
39                 cd empty-clone &&
40                 git submodule init
41         ) &&
42         git clone super top-only-clone &&
43         git clone super relative-clone &&
44         (
45                 cd relative-clone &&
46                 git submodule update --init --recursive
47         ) &&
48         git clone super recursive-clone &&
49         (
50                 cd recursive-clone &&
51                 git submodule update --init --recursive
52         )
53 '
54
55 test_expect_success 'change submodule' '
56         (
57                 cd submodule &&
58                 echo second line >>file &&
59                 test_tick &&
60                 git commit -a -m "change submodule"
61         )
62 '
63
64 test_expect_success 'change submodule url' '
65         (
66                 cd super &&
67                 cd submodule &&
68                 git checkout master &&
69                 git pull
70         ) &&
71         mv submodule moved-submodule &&
72         (
73                 cd moved-submodule &&
74                 git config -f .gitmodules submodule.sub-submodule.url ../moved-submodule &&
75                 test_tick &&
76                 git commit -a -m moved-sub-submodule
77         ) &&
78         (
79                 cd super &&
80                 git config -f .gitmodules submodule.submodule.url ../moved-submodule &&
81                 test_tick &&
82                 git commit -a -m moved-submodule
83         )
84 '
85
86 test_expect_success '"git submodule sync" should update submodule URLs' '
87         (
88                 cd super-clone &&
89                 git pull --no-recurse-submodules &&
90                 git submodule sync
91         ) &&
92         test -d "$(
93                 cd super-clone/submodule &&
94                 git config remote.origin.url
95         )" &&
96         test ! -d "$(
97                 cd super-clone/submodule/sub-submodule &&
98                 git config remote.origin.url
99         )" &&
100         (
101                 cd super-clone/submodule &&
102                 git checkout master &&
103                 git pull
104         ) &&
105         (
106                 cd super-clone &&
107                 test -d "$(git config submodule.submodule.url)"
108         )
109 '
110
111 test_expect_success '"git submodule sync --recursive" should update all submodule URLs' '
112         (
113                 cd super-clone &&
114                 (
115                         cd submodule &&
116                         git pull --no-recurse-submodules
117                 ) &&
118                 git submodule sync --recursive
119         ) &&
120         test -d "$(
121                 cd super-clone/submodule &&
122                 git config remote.origin.url
123         )" &&
124         test -d "$(
125                 cd super-clone/submodule/sub-submodule &&
126                 git config remote.origin.url
127         )" &&
128         (
129                 cd super-clone/submodule/sub-submodule &&
130                 git checkout master &&
131                 git pull
132         )
133 '
134
135 test_expect_success '"git submodule sync" should update known submodule URLs' '
136         (
137                 cd empty-clone &&
138                 git pull &&
139                 git submodule sync &&
140                 test -d "$(git config submodule.submodule.url)"
141         )
142 '
143
144 test_expect_success '"git submodule sync" should not vivify uninteresting submodule' '
145         (
146                 cd top-only-clone &&
147                 git pull &&
148                 git submodule sync &&
149                 test -z "$(git config submodule.submodule.url)" &&
150                 git submodule sync submodule &&
151                 test -z "$(git config submodule.submodule.url)"
152         )
153 '
154
155 test_expect_success '"git submodule sync" handles origin URL of the form foo' '
156         (
157                 cd relative-clone &&
158                 git remote set-url origin foo &&
159                 git submodule sync &&
160                 (
161                         cd submodule &&
162                         #actual fails with: "cannot strip off url foo
163                         test "$(git config remote.origin.url)" = "../submodule"
164                 )
165         )
166 '
167
168 test_expect_success '"git submodule sync" handles origin URL of the form foo/bar' '
169         (
170                 cd relative-clone &&
171                 git remote set-url origin foo/bar &&
172                 git submodule sync &&
173                 (
174                         cd submodule &&
175                         #actual foo/submodule
176                         test "$(git config remote.origin.url)" = "../foo/submodule"
177                 )
178                 (
179                         cd submodule/sub-submodule &&
180                         test "$(git config remote.origin.url)" != "../../foo/submodule"
181                 )
182         )
183 '
184
185 test_expect_success '"git submodule sync --recursive" propagates changes in origin' '
186         (
187                 cd recursive-clone &&
188                 git remote set-url origin foo/bar &&
189                 git submodule sync --recursive &&
190                 (
191                         cd submodule &&
192                         #actual foo/submodule
193                         test "$(git config remote.origin.url)" = "../foo/submodule"
194                 )
195                 (
196                         cd submodule/sub-submodule &&
197                         test "$(git config remote.origin.url)" = "../../foo/submodule"
198                 )
199         )
200 '
201
202 test_expect_success '"git submodule sync" handles origin URL of the form ./foo' '
203         (
204                 cd relative-clone &&
205                 git remote set-url origin ./foo &&
206                 git submodule sync &&
207                 (
208                         cd submodule &&
209                         #actual ./submodule
210                         test "$(git config remote.origin.url)" = "../submodule"
211                 )
212         )
213 '
214
215 test_expect_success '"git submodule sync" handles origin URL of the form ./foo/bar' '
216         (
217                 cd relative-clone &&
218                 git remote set-url origin ./foo/bar &&
219                 git submodule sync &&
220                 (
221                         cd submodule &&
222                         #actual ./foo/submodule
223                         test "$(git config remote.origin.url)" = "../foo/submodule"
224                 )
225         )
226 '
227
228 test_expect_success '"git submodule sync" handles origin URL of the form ../foo' '
229         (
230                 cd relative-clone &&
231                 git remote set-url origin ../foo &&
232                 git submodule sync &&
233                 (
234                         cd submodule &&
235                         #actual ../submodule
236                         test "$(git config remote.origin.url)" = "../../submodule"
237                 )
238         )
239 '
240
241 test_expect_success '"git submodule sync" handles origin URL of the form ../foo/bar' '
242         (
243                 cd relative-clone &&
244                 git remote set-url origin ../foo/bar &&
245                 git submodule sync &&
246                 (
247                         cd submodule &&
248                         #actual ../foo/submodule
249                         test "$(git config remote.origin.url)" = "../../foo/submodule"
250                 )
251         )
252 '
253
254 test_expect_success '"git submodule sync" handles origin URL of the form ../foo/bar with deeply nested submodule' '
255         (
256                 cd relative-clone &&
257                 git remote set-url origin ../foo/bar &&
258                 mkdir -p a/b/c &&
259                 (
260                         cd a/b/c &&
261                         git init &&
262                         >.gitignore &&
263                         git add .gitignore &&
264                         test_tick &&
265                         git commit -m "initial commit"
266                 ) &&
267                 git submodule add ../bar/a/b/c ./a/b/c &&
268                 git submodule sync &&
269                 (
270                         cd a/b/c &&
271                         #actual ../foo/bar/a/b/c
272                         test "$(git config remote.origin.url)" = "../../../../foo/bar/a/b/c"
273                 )
274         )
275 '
276
277
278 test_done