Merge branch 'ak/corrected-commit-date'
[git] / t / t5700-protocol-v1.sh
1 #!/bin/sh
2
3 test_description='test git wire-protocol transition'
4
5 TEST_NO_CREATE_REPO=1
6
7 # This is a protocol-specific test.
8 GIT_TEST_PROTOCOL_VERSION=0
9 export GIT_TEST_PROTOCOL_VERSION
10
11 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
12 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
13
14 . ./test-lib.sh
15
16 # Test protocol v1 with 'git://' transport
17 #
18 . "$TEST_DIRECTORY"/lib-git-daemon.sh
19 start_git_daemon --export-all --enable=receive-pack
20 daemon_parent=$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent
21
22 test_expect_success 'create repo to be served by git-daemon' '
23         git init "$daemon_parent" &&
24         test_commit -C "$daemon_parent" one
25 '
26
27 test_expect_success 'clone with git:// using protocol v1' '
28         GIT_TRACE_PACKET=1 git -c protocol.version=1 \
29                 clone "$GIT_DAEMON_URL/parent" daemon_child 2>log &&
30
31         git -C daemon_child log -1 --format=%s >actual &&
32         git -C "$daemon_parent" log -1 --format=%s >expect &&
33         test_cmp expect actual &&
34
35         # Client requested to use protocol v1
36         grep "clone> .*\\\0\\\0version=1\\\0$" log &&
37         # Server responded using protocol v1
38         grep "clone< version 1" log
39 '
40
41 test_expect_success 'fetch with git:// using protocol v1' '
42         test_commit -C "$daemon_parent" two &&
43
44         GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
45                 fetch 2>log &&
46
47         git -C daemon_child log -1 --format=%s origin/main >actual &&
48         git -C "$daemon_parent" log -1 --format=%s >expect &&
49         test_cmp expect actual &&
50
51         # Client requested to use protocol v1
52         grep "fetch> .*\\\0\\\0version=1\\\0$" log &&
53         # Server responded using protocol v1
54         grep "fetch< version 1" log
55 '
56
57 test_expect_success 'pull with git:// using protocol v1' '
58         GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
59                 pull 2>log &&
60
61         git -C daemon_child log -1 --format=%s >actual &&
62         git -C "$daemon_parent" log -1 --format=%s >expect &&
63         test_cmp expect actual &&
64
65         # Client requested to use protocol v1
66         grep "fetch> .*\\\0\\\0version=1\\\0$" log &&
67         # Server responded using protocol v1
68         grep "fetch< version 1" log
69 '
70
71 test_expect_success 'push with git:// using protocol v1' '
72         test_commit -C daemon_child three &&
73
74         # Push to another branch, as the target repository has the
75         # main branch checked out and we cannot push into it.
76         GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
77                 push origin HEAD:client_branch 2>log &&
78
79         git -C daemon_child log -1 --format=%s >actual &&
80         git -C "$daemon_parent" log -1 --format=%s client_branch >expect &&
81         test_cmp expect actual &&
82
83         # Client requested to use protocol v1
84         grep "push> .*\\\0\\\0version=1\\\0$" log &&
85         # Server responded using protocol v1
86         grep "push< version 1" log
87 '
88
89 stop_git_daemon
90
91 # Test protocol v1 with 'file://' transport
92 #
93 test_expect_success 'create repo to be served by file:// transport' '
94         git init file_parent &&
95         test_commit -C file_parent one
96 '
97
98 test_expect_success 'clone with file:// using protocol v1' '
99         GIT_TRACE_PACKET=1 git -c protocol.version=1 \
100                 clone "file://$(pwd)/file_parent" file_child 2>log &&
101
102         git -C file_child log -1 --format=%s >actual &&
103         git -C file_parent log -1 --format=%s >expect &&
104         test_cmp expect actual &&
105
106         # Server responded using protocol v1
107         grep "clone< version 1" log
108 '
109
110 test_expect_success 'fetch with file:// using protocol v1' '
111         test_commit -C file_parent two &&
112
113         GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \
114                 fetch 2>log &&
115
116         git -C file_child log -1 --format=%s origin/main >actual &&
117         git -C file_parent log -1 --format=%s >expect &&
118         test_cmp expect actual &&
119
120         # Server responded using protocol v1
121         grep "fetch< version 1" log
122 '
123
124 test_expect_success 'pull with file:// using protocol v1' '
125         GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \
126                 pull 2>log &&
127
128         git -C file_child log -1 --format=%s >actual &&
129         git -C file_parent log -1 --format=%s >expect &&
130         test_cmp expect actual &&
131
132         # Server responded using protocol v1
133         grep "fetch< version 1" log
134 '
135
136 test_expect_success 'push with file:// using protocol v1' '
137         test_commit -C file_child three &&
138
139         # Push to another branch, as the target repository has the
140         # main branch checked out and we cannot push into it.
141         GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \
142                 push origin HEAD:client_branch 2>log &&
143
144         git -C file_child log -1 --format=%s >actual &&
145         git -C file_parent log -1 --format=%s client_branch >expect &&
146         test_cmp expect actual &&
147
148         # Server responded using protocol v1
149         grep "push< version 1" log
150 '
151
152 # Test protocol v1 with 'ssh://' transport
153 #
154 test_expect_success 'setup ssh wrapper' '
155         GIT_SSH="$GIT_BUILD_DIR/t/helper/test-fake-ssh" &&
156         export GIT_SSH &&
157         GIT_SSH_VARIANT=ssh &&
158         export GIT_SSH_VARIANT &&
159         export TRASH_DIRECTORY &&
160         >"$TRASH_DIRECTORY"/ssh-output
161 '
162
163 expect_ssh () {
164         test_when_finished '(cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output)' &&
165         echo "ssh: -o SendEnv=GIT_PROTOCOL myhost $1 '$PWD/ssh_parent'" >"$TRASH_DIRECTORY/ssh-expect" &&
166         (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output)
167 }
168
169 test_expect_success 'create repo to be served by ssh:// transport' '
170         git init ssh_parent &&
171         test_commit -C ssh_parent one
172 '
173
174 test_expect_success 'clone with ssh:// using protocol v1' '
175         GIT_TRACE_PACKET=1 git -c protocol.version=1 \
176                 clone "ssh://myhost:$(pwd)/ssh_parent" ssh_child 2>log &&
177         expect_ssh git-upload-pack &&
178
179         git -C ssh_child log -1 --format=%s >actual &&
180         git -C ssh_parent log -1 --format=%s >expect &&
181         test_cmp expect actual &&
182
183         # Server responded using protocol v1
184         grep "clone< version 1" log
185 '
186
187 test_expect_success 'fetch with ssh:// using protocol v1' '
188         test_commit -C ssh_parent two &&
189
190         GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
191                 fetch 2>log &&
192         expect_ssh git-upload-pack &&
193
194         git -C ssh_child log -1 --format=%s origin/main >actual &&
195         git -C ssh_parent log -1 --format=%s >expect &&
196         test_cmp expect actual &&
197
198         # Server responded using protocol v1
199         grep "fetch< version 1" log
200 '
201
202 test_expect_success 'pull with ssh:// using protocol v1' '
203         GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
204                 pull 2>log &&
205         expect_ssh git-upload-pack &&
206
207         git -C ssh_child log -1 --format=%s >actual &&
208         git -C ssh_parent log -1 --format=%s >expect &&
209         test_cmp expect actual &&
210
211         # Server responded using protocol v1
212         grep "fetch< version 1" log
213 '
214
215 test_expect_success 'push with ssh:// using protocol v1' '
216         test_commit -C ssh_child three &&
217
218         # Push to another branch, as the target repository has the
219         # main branch checked out and we cannot push into it.
220         GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
221                 push origin HEAD:client_branch 2>log &&
222         expect_ssh git-receive-pack &&
223
224         git -C ssh_child log -1 --format=%s >actual &&
225         git -C ssh_parent log -1 --format=%s client_branch >expect &&
226         test_cmp expect actual &&
227
228         # Server responded using protocol v1
229         grep "push< version 1" log
230 '
231
232 # Test protocol v1 with 'http://' transport
233 #
234 . "$TEST_DIRECTORY"/lib-httpd.sh
235 start_httpd
236
237 test_expect_success 'create repo to be served by http:// transport' '
238         git init "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
239         git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config http.receivepack true &&
240         test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" one
241 '
242
243 test_expect_success 'clone with http:// using protocol v1' '
244         GIT_TRACE_PACKET=1 GIT_TRACE_CURL=1 git -c protocol.version=1 \
245                 clone "$HTTPD_URL/smart/http_parent" http_child 2>log &&
246
247         git -C http_child log -1 --format=%s >actual &&
248         git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect &&
249         test_cmp expect actual &&
250
251         # Client requested to use protocol v1
252         grep "Git-Protocol: version=1" log &&
253         # Server responded using protocol v1
254         grep "git< version 1" log
255 '
256
257 test_expect_success 'fetch with http:// using protocol v1' '
258         test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" two &&
259
260         GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
261                 fetch 2>log &&
262
263         git -C http_child log -1 --format=%s origin/main >actual &&
264         git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect &&
265         test_cmp expect actual &&
266
267         # Server responded using protocol v1
268         grep "git< version 1" log
269 '
270
271 test_expect_success 'pull with http:// using protocol v1' '
272         GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
273                 pull 2>log &&
274
275         git -C http_child log -1 --format=%s >actual &&
276         git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect &&
277         test_cmp expect actual &&
278
279         # Server responded using protocol v1
280         grep "git< version 1" log
281 '
282
283 test_expect_success 'push with http:// using protocol v1' '
284         test_commit -C http_child three &&
285
286         # Push to another branch, as the target repository has the
287         # main branch checked out and we cannot push into it.
288         GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
289                 push origin HEAD:client_branch && #2>log &&
290
291         git -C http_child log -1 --format=%s >actual &&
292         git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s client_branch >expect &&
293         test_cmp expect actual &&
294
295         # Server responded using protocol v1
296         grep "git< version 1" log
297 '
298
299 # DO NOT add non-httpd-specific tests here, because the last part of this
300 # test script is only executed when httpd is available and enabled.
301
302 test_done