summaryrefslogtreecommitdiff
path: root/t/t7416-submodule-dash-url.sh
blob: d21dc8b009f6d0d8e75368d01a984ac350155ba3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/bin/sh

test_description='check handling of disallowed .gitmodule urls'
. ./test-lib.sh

test_expect_success 'create submodule with protected dash in url' '
	git init upstream &&
	git -C upstream commit --allow-empty -m base &&
	mv upstream ./-upstream &&
	git submodule add ./-upstream sub &&
	git add sub .gitmodules &&
	git commit -m submodule
'

test_expect_success 'clone can recurse submodule' '
	test_when_finished "rm -rf dst" &&
	git clone --recurse-submodules . dst &&
	echo base >expect &&
	git -C dst/sub log -1 --format=%s >actual &&
	test_cmp expect actual
'

test_expect_success 'fsck accepts protected dash' '
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	git push dst HEAD
'

test_expect_success 'remove ./ protection from .gitmodules url' '
	perl -i -pe "s{\./}{}" .gitmodules &&
	git commit -am "drop protection"
'

test_expect_success 'clone rejects unprotected dash' '
	test_when_finished "rm -rf dst" &&
	test_must_fail git clone --recurse-submodules . dst 2>err &&
	test_i18ngrep ignoring err
'

test_expect_success 'fsck rejects unprotected dash' '
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'trailing backslash is handled correctly' '
	git init testmodule &&
	test_commit -C testmodule c &&
	git submodule add ./testmodule &&
	: ensure that the name ends in a double backslash &&
	sed -e "s|\\(submodule \"testmodule\\)\"|\\1\\\\\\\\\"|" \
		-e "s|url = .*|url = \" --should-not-be-an-option\"|" \
		<.gitmodules >.new &&
	mv .new .gitmodules &&
	git commit -am "Add testmodule" &&
	test_must_fail git clone --verbose --recurse-submodules . dolly 2>err &&
	test_i18ngrep ! "unknown option" err
'

test_expect_success 'fsck rejects missing URL scheme' '
	git checkout --orphan missing-scheme &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = http::one.example.com/foo.git
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "gitmodules with missing URL scheme" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects relative URL resolving to missing scheme' '
	git checkout --orphan relative-missing-scheme &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = "..\\../.\\../:one.example.com/foo.git"
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "gitmodules with relative URL that strips off scheme" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects empty URL scheme' '
	git checkout --orphan empty-scheme &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = http::://one.example.com/foo.git
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "gitmodules with empty URL scheme" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects relative URL resolving to empty scheme' '
	git checkout --orphan relative-empty-scheme &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = ../../../:://one.example.com/foo.git
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "relative gitmodules URL resolving to empty scheme" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects empty hostname' '
	git checkout --orphan empty-host &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = http:///one.example.com/foo.git
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "gitmodules with extra slashes" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects relative url that produced empty hostname' '
	git checkout --orphan messy-relative &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = ../../..//one.example.com/foo.git
	EOF
	git add .gitmodules &&
	test_tick &&
	git commit -m "gitmodules abusing relative_path" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck permits embedded newline with unrecognized scheme' '
	git checkout --orphan newscheme &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = "data://acjbkd%0akajfdickajkd"
	EOF
	git add .gitmodules &&
	git commit -m "gitmodules with unrecognized scheme" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	git push dst HEAD
'

test_expect_success 'fsck rejects embedded newline in url' '
	# create an orphan branch to avoid existing .gitmodules objects
	git checkout --orphan newline &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
	url = "https://one.example.com?%0ahost=two.example.com/foo.git"
	EOF
	git add .gitmodules &&
	git commit -m "gitmodules with newline" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects embedded newline in relative url' '
	git checkout --orphan relative-newline &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
		url = "./%0ahost=two.example.com/foo.git"
	EOF
	git add .gitmodules &&
	git commit -m "relative url with newline" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_expect_success 'fsck rejects embedded newline in git url' '
	git checkout --orphan git-newline &&
	cat >.gitmodules <<-\EOF &&
	[submodule "foo"]
	url = "git://example.com:1234/repo%0a.git"
	EOF
	git add .gitmodules &&
	git commit -m "git url with newline" &&
	test_when_finished "rm -rf dst" &&
	git init --bare dst &&
	git -C dst config transfer.fsckObjects true &&
	test_must_fail git push dst HEAD 2>err &&
	grep gitmodulesUrl err
'

test_done