refs/files: skip creation of "refs/{heads,tags}" for worktrees
[git.git] / t / t5700-protocol-v1.sh
bloba73b4d4ff6a0d26e925ae7f6a0e8e34a1e138836
1 #!/bin/sh
3 test_description='test git wire-protocol transition'
5 TEST_NO_CREATE_REPO=1
7 # This is a protocol-specific test.
8 GIT_TEST_PROTOCOL_VERSION=0
9 export GIT_TEST_PROTOCOL_VERSION
11 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
12 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
14 . ./test-lib.sh
16 # Test protocol v1 with 'git://' transport
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
22 test_expect_success 'create repo to be served by git-daemon' '
23 git init "$daemon_parent" &&
24 test_commit -C "$daemon_parent" one
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 &&
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 &&
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
41 test_expect_success 'fetch with git:// using protocol v1' '
42 test_commit -C "$daemon_parent" two &&
44 GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
45 fetch 2>log &&
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 &&
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
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 &&
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 &&
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
71 test_expect_success 'push with git:// using protocol v1' '
72 test_commit -C daemon_child three &&
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 &&
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 &&
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
89 stop_git_daemon
91 # Test protocol v1 with 'file://' transport
93 test_expect_success 'create repo to be served by file:// transport' '
94 git init file_parent &&
95 test_commit -C file_parent one
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 &&
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 &&
106 # Server responded using protocol v1
107 grep "clone< version 1" log
110 test_expect_success 'fetch with file:// using protocol v1' '
111 test_commit -C file_parent two &&
113 GIT_TRACE_PACKET=1 git -C file_child -c protocol.version=1 \
114 fetch 2>log &&
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 &&
120 # Server responded using protocol v1
121 grep "fetch< version 1" log
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 &&
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 &&
132 # Server responded using protocol v1
133 grep "fetch< version 1" log
136 test_expect_success 'push with file:// using protocol v1' '
137 test_commit -C file_child three &&
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 &&
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 &&
148 # Server responded using protocol v1
149 grep "push< version 1" log
152 test_expect_success 'cloning branchless tagless but not refless remote' '
153 rm -rf server client &&
155 git -c init.defaultbranch=main init server &&
156 echo foo >server/foo.txt &&
157 git -C server add foo.txt &&
158 git -C server commit -m "message" &&
159 git -C server update-ref refs/notbranch/alsonottag HEAD &&
160 git -C server checkout --detach &&
161 git -C server branch -D main &&
162 git -C server symbolic-ref HEAD refs/heads/nonexistentbranch &&
164 git -c protocol.version=1 clone "file://$(pwd)/server" client
167 # Test protocol v1 with 'ssh://' transport
169 test_expect_success 'setup ssh wrapper' '
170 GIT_SSH="$GIT_BUILD_DIR/t/helper/test-fake-ssh" &&
171 export GIT_SSH &&
172 GIT_SSH_VARIANT=ssh &&
173 export GIT_SSH_VARIANT &&
174 export TRASH_DIRECTORY &&
175 >"$TRASH_DIRECTORY"/ssh-output
178 expect_ssh () {
179 test_when_finished '(cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output)' &&
180 echo "ssh: -o SendEnv=GIT_PROTOCOL myhost $1 '$PWD/ssh_parent'" >"$TRASH_DIRECTORY/ssh-expect" &&
181 (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output)
184 test_expect_success 'create repo to be served by ssh:// transport' '
185 git init ssh_parent &&
186 test_commit -C ssh_parent one
189 test_expect_success 'clone with ssh:// using protocol v1' '
190 GIT_TRACE_PACKET=1 git -c protocol.version=1 \
191 clone "ssh://myhost:$(pwd)/ssh_parent" ssh_child 2>log &&
192 expect_ssh git-upload-pack &&
194 git -C ssh_child log -1 --format=%s >actual &&
195 git -C ssh_parent log -1 --format=%s >expect &&
196 test_cmp expect actual &&
198 # Server responded using protocol v1
199 grep "clone< version 1" log
202 test_expect_success 'fetch with ssh:// using protocol v1' '
203 test_commit -C ssh_parent two &&
205 GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
206 fetch 2>log &&
207 expect_ssh git-upload-pack &&
209 git -C ssh_child log -1 --format=%s origin/main >actual &&
210 git -C ssh_parent log -1 --format=%s >expect &&
211 test_cmp expect actual &&
213 # Server responded using protocol v1
214 grep "fetch< version 1" log
217 test_expect_success 'pull with ssh:// using protocol v1' '
218 GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
219 pull 2>log &&
220 expect_ssh git-upload-pack &&
222 git -C ssh_child log -1 --format=%s >actual &&
223 git -C ssh_parent log -1 --format=%s >expect &&
224 test_cmp expect actual &&
226 # Server responded using protocol v1
227 grep "fetch< version 1" log
230 test_expect_success 'push with ssh:// using protocol v1' '
231 test_commit -C ssh_child three &&
233 # Push to another branch, as the target repository has the
234 # main branch checked out and we cannot push into it.
235 GIT_TRACE_PACKET=1 git -C ssh_child -c protocol.version=1 \
236 push origin HEAD:client_branch 2>log &&
237 expect_ssh git-receive-pack &&
239 git -C ssh_child log -1 --format=%s >actual &&
240 git -C ssh_parent log -1 --format=%s client_branch >expect &&
241 test_cmp expect actual &&
243 # Server responded using protocol v1
244 grep "push< version 1" log
247 test_expect_success 'clone propagates object-format from empty repo' '
248 test_when_finished "rm -fr src256 dst256" &&
250 echo sha256 >expect &&
251 git init --object-format=sha256 src256 &&
252 git clone --no-local src256 dst256 &&
253 git -C dst256 rev-parse --show-object-format >actual &&
255 test_cmp expect actual
258 # Test protocol v1 with 'http://' transport
260 . "$TEST_DIRECTORY"/lib-httpd.sh
261 start_httpd
263 test_expect_success 'create repos to be served by http:// transport' '
264 git init "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
265 git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config http.receivepack true &&
266 test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" one &&
267 git init --object-format=sha256 "$HTTPD_DOCUMENT_ROOT_PATH/sha256" &&
268 git -C "$HTTPD_DOCUMENT_ROOT_PATH/sha256" config http.receivepack true
271 test_expect_success 'clone with http:// using protocol v1' '
272 GIT_TRACE_PACKET=1 GIT_TRACE_CURL=1 git -c protocol.version=1 \
273 clone "$HTTPD_URL/smart/http_parent" http_child 2>log &&
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 &&
279 # Client requested to use protocol v1
280 grep "Git-Protocol: version=1" log &&
281 # Server responded using protocol v1
282 grep "git< version 1" log
285 test_expect_success 'clone with http:// using protocol v1 with empty SHA-256 repo' '
286 GIT_TRACE_PACKET=1 GIT_TRACE_CURL=1 git -c protocol.version=1 \
287 clone "$HTTPD_URL/smart/sha256" sha256 2>log &&
289 echo sha256 >expect &&
290 git -C sha256 rev-parse --show-object-format >actual &&
291 test_cmp expect actual &&
293 # Client requested to use protocol v1
294 grep "Git-Protocol: version=1" log &&
295 # Server responded using protocol v1
296 grep "git< version 1" log
299 test_expect_success 'fetch with http:// using protocol v1' '
300 test_commit -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" two &&
302 GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
303 fetch 2>log &&
305 git -C http_child log -1 --format=%s origin/main >actual &&
306 git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect &&
307 test_cmp expect actual &&
309 # Server responded using protocol v1
310 grep "git< version 1" log
313 test_expect_success 'pull with http:// using protocol v1' '
314 GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
315 pull 2>log &&
317 git -C http_child log -1 --format=%s >actual &&
318 git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s >expect &&
319 test_cmp expect actual &&
321 # Server responded using protocol v1
322 grep "git< version 1" log
325 test_expect_success 'push with http:// using protocol v1' '
326 test_commit -C http_child three &&
328 # Push to another branch, as the target repository has the
329 # main branch checked out and we cannot push into it.
330 GIT_TRACE_PACKET=1 git -C http_child -c protocol.version=1 \
331 push origin HEAD:client_branch && #2>log &&
333 git -C http_child log -1 --format=%s >actual &&
334 git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" log -1 --format=%s client_branch >expect &&
335 test_cmp expect actual &&
337 # Server responded using protocol v1
338 grep "git< version 1" log
341 # DO NOT add non-httpd-specific tests here, because the last part of this
342 # test script is only executed when httpd is available and enabled.
344 test_done