]> git.ipfire.org Git - thirdparty/git.git/blame - t/t5545-push-options.sh
The third batch
[thirdparty/git.git] / t / t5545-push-options.sh
CommitLineData
3ac87030
SB
1#!/bin/sh
2
3test_description='pushing to a repository using push options'
4
028cb644 5GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
334afbc7
JS
6export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
13a2f620
JT
8GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1
9export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB
10
3ac87030
SB
11. ./test-lib.sh
12
13mk_repo_pair () {
14 rm -rf workbench upstream &&
15 test_create_repo upstream &&
16 test_create_repo workbench &&
17 (
18 cd upstream &&
19 git config receive.denyCurrentBranch warn &&
20 mkdir -p .git/hooks &&
21 cat >.git/hooks/pre-receive <<-'EOF' &&
22 #!/bin/sh
23 if test -n "$GIT_PUSH_OPTION_COUNT"; then
24 i=0
25 >hooks/pre-receive.push_options
26 while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do
27 eval "value=\$GIT_PUSH_OPTION_$i"
28 echo $value >>hooks/pre-receive.push_options
29 i=$((i + 1))
30 done
31 fi
32 EOF
33 chmod u+x .git/hooks/pre-receive
34
35 cat >.git/hooks/post-receive <<-'EOF' &&
36 #!/bin/sh
37 if test -n "$GIT_PUSH_OPTION_COUNT"; then
38 i=0
39 >hooks/post-receive.push_options
40 while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do
41 eval "value=\$GIT_PUSH_OPTION_$i"
42 echo $value >>hooks/post-receive.push_options
43 i=$((i + 1))
44 done
45 fi
46 EOF
47 chmod u+x .git/hooks/post-receive
48 ) &&
49 (
50 cd workbench &&
51 git remote add up ../upstream
52 )
53}
54
55# Compare the ref ($1) in upstream with a ref value from workbench ($2)
56# i.e. test_refs second HEAD@{2}
57test_refs () {
58 test $# = 2 &&
59 git -C upstream rev-parse --verify "$1" >expect &&
60 git -C workbench rev-parse --verify "$2" >actual &&
61 test_cmp expect actual
62}
63
64test_expect_success 'one push option works for a single branch' '
65 mk_repo_pair &&
66 git -C upstream config receive.advertisePushOptions true &&
67 (
68 cd workbench &&
69 test_commit one &&
70 git push --mirror up &&
71 test_commit two &&
028cb644 72 git push --push-option=asdf up main
3ac87030 73 ) &&
028cb644 74 test_refs main main &&
3ac87030
SB
75 echo "asdf" >expect &&
76 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
77 test_cmp expect upstream/.git/hooks/post-receive.push_options
78'
79
80test_expect_success 'push option denied by remote' '
81 mk_repo_pair &&
82 git -C upstream config receive.advertisePushOptions false &&
83 (
84 cd workbench &&
85 test_commit one &&
86 git push --mirror up &&
87 test_commit two &&
028cb644 88 test_must_fail git push --push-option=asdf up main
3ac87030 89 ) &&
028cb644 90 test_refs main HEAD@{1}
3ac87030
SB
91'
92
93test_expect_success 'two push options work' '
94 mk_repo_pair &&
95 git -C upstream config receive.advertisePushOptions true &&
96 (
97 cd workbench &&
98 test_commit one &&
99 git push --mirror up &&
100 test_commit two &&
028cb644 101 git push --push-option=asdf --push-option="more structured text" up main
3ac87030 102 ) &&
028cb644 103 test_refs main main &&
3ac87030
SB
104 printf "asdf\nmore structured text\n" >expect &&
105 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
106 test_cmp expect upstream/.git/hooks/post-receive.push_options
107'
108
2a90556d
BW
109test_expect_success 'push options and submodules' '
110 test_when_finished "rm -rf parent" &&
111 test_when_finished "rm -rf parent_upstream" &&
112 mk_repo_pair &&
113 git -C upstream config receive.advertisePushOptions true &&
114 cp -r upstream parent_upstream &&
115 test_commit -C upstream one &&
116
117 test_create_repo parent &&
118 git -C parent remote add up ../parent_upstream &&
119 test_commit -C parent one &&
120 git -C parent push --mirror up &&
121
225d2d50 122 test_config_global protocol.file.allow always &&
2a90556d
BW
123 git -C parent submodule add ../upstream workbench &&
124 git -C parent/workbench remote add up ../../upstream &&
aa74be31 125 git -C parent commit -m "add submodule" &&
2a90556d
BW
126
127 test_commit -C parent/workbench two &&
128 git -C parent add workbench &&
129 git -C parent commit -m "update workbench" &&
130
131 git -C parent push \
132 --push-option=asdf --push-option="more structured text" \
028cb644 133 --recurse-submodules=on-demand up main &&
2a90556d 134
028cb644
JS
135 git -C upstream rev-parse --verify main >expect &&
136 git -C parent/workbench rev-parse --verify main >actual &&
2a90556d
BW
137 test_cmp expect actual &&
138
028cb644
JS
139 git -C parent_upstream rev-parse --verify main >expect &&
140 git -C parent rev-parse --verify main >actual &&
2a90556d
BW
141 test_cmp expect actual &&
142
143 printf "asdf\nmore structured text\n" >expect &&
144 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
145 test_cmp expect upstream/.git/hooks/post-receive.push_options &&
146 test_cmp expect parent_upstream/.git/hooks/pre-receive.push_options &&
147 test_cmp expect parent_upstream/.git/hooks/post-receive.push_options
148'
149
d8052750
MP
150test_expect_success 'default push option' '
151 mk_repo_pair &&
152 git -C upstream config receive.advertisePushOptions true &&
153 (
154 cd workbench &&
155 test_commit one &&
156 git push --mirror up &&
157 test_commit two &&
028cb644 158 git -c push.pushOption=default push up main
d8052750 159 ) &&
028cb644 160 test_refs main main &&
d8052750
MP
161 echo "default" >expect &&
162 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
163 test_cmp expect upstream/.git/hooks/post-receive.push_options
164'
165
166test_expect_success 'two default push options' '
167 mk_repo_pair &&
168 git -C upstream config receive.advertisePushOptions true &&
169 (
170 cd workbench &&
171 test_commit one &&
172 git push --mirror up &&
173 test_commit two &&
028cb644 174 git -c push.pushOption=default1 -c push.pushOption=default2 push up main
d8052750 175 ) &&
028cb644 176 test_refs main main &&
d8052750
MP
177 printf "default1\ndefault2\n" >expect &&
178 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
179 test_cmp expect upstream/.git/hooks/post-receive.push_options
180'
181
182test_expect_success 'push option from command line overrides from-config push option' '
183 mk_repo_pair &&
184 git -C upstream config receive.advertisePushOptions true &&
185 (
186 cd workbench &&
187 test_commit one &&
188 git push --mirror up &&
189 test_commit two &&
028cb644 190 git -c push.pushOption=default push --push-option=manual up main
d8052750 191 ) &&
028cb644 192 test_refs main main &&
d8052750
MP
193 echo "manual" >expect &&
194 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
195 test_cmp expect upstream/.git/hooks/post-receive.push_options
196'
197
198test_expect_success 'empty value of push.pushOption in config clears the list' '
199 mk_repo_pair &&
200 git -C upstream config receive.advertisePushOptions true &&
201 (
202 cd workbench &&
203 test_commit one &&
204 git push --mirror up &&
205 test_commit two &&
028cb644 206 git -c push.pushOption=default1 -c push.pushOption= -c push.pushOption=default2 push up main
d8052750 207 ) &&
028cb644 208 test_refs main main &&
d8052750
MP
209 echo "default2" >expect &&
210 test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
211 test_cmp expect upstream/.git/hooks/post-receive.push_options
212'
213
214test_expect_success 'invalid push option in config' '
215 mk_repo_pair &&
216 git -C upstream config receive.advertisePushOptions true &&
217 (
218 cd workbench &&
219 test_commit one &&
220 git push --mirror up &&
221 test_commit two &&
028cb644 222 test_must_fail git -c push.pushOption push up main
d8052750 223 ) &&
028cb644 224 test_refs main HEAD@{1}
d8052750
MP
225'
226
90dce21e
JK
227test_expect_success 'push options keep quoted characters intact (direct)' '
228 mk_repo_pair &&
229 git -C upstream config receive.advertisePushOptions true &&
230 test_commit -C workbench one &&
028cb644 231 git -C workbench push --push-option="\"embedded quotes\"" up main &&
90dce21e
JK
232 echo "\"embedded quotes\"" >expect &&
233 test_cmp expect upstream/.git/hooks/pre-receive.push_options
234'
235
2e397e4d
SB
236. "$TEST_DIRECTORY"/lib-httpd.sh
237start_httpd
238
6cdffd06
JK
239# set up http repository for fetching/pushing, with push options config
240# bool set to $1
241mk_http_pair () {
2e397e4d 242 test_when_finished "rm -rf test_http_clone" &&
6cdffd06 243 test_when_finished 'rm -rf "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git' &&
2e397e4d 244 mk_repo_pair &&
6cdffd06 245 git -C upstream config receive.advertisePushOptions "$1" &&
2e397e4d
SB
246 git -C upstream config http.receivepack true &&
247 cp -R upstream/.git "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git &&
6cdffd06
JK
248 git clone "$HTTPD_URL"/smart/upstream test_http_clone
249}
250
251test_expect_success 'push option denied properly by http server' '
252 mk_http_pair false &&
2e397e4d 253 test_commit -C test_http_clone one &&
028cb644 254 test_must_fail git -C test_http_clone push --push-option=asdf origin main 2>actual &&
6789275d 255 test_grep "the receiving end does not support push options" actual &&
028cb644 256 git -C test_http_clone push origin main
2e397e4d
SB
257'
258
259test_expect_success 'push options work properly across http' '
6cdffd06 260 mk_http_pair true &&
2e397e4d
SB
261
262 test_commit -C test_http_clone one &&
028cb644
JS
263 git -C test_http_clone push origin main &&
264 git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify main >expect &&
265 git -C test_http_clone rev-parse --verify main >actual &&
2e397e4d
SB
266 test_cmp expect actual &&
267
268 test_commit -C test_http_clone two &&
028cb644 269 git -C test_http_clone push --push-option=asdf --push-option="more structured text" origin main &&
2e397e4d
SB
270 printf "asdf\nmore structured text\n" >expect &&
271 test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/pre-receive.push_options &&
272 test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/post-receive.push_options &&
273
028cb644
JS
274 git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify main >expect &&
275 git -C test_http_clone rev-parse --verify main >actual &&
2e397e4d
SB
276 test_cmp expect actual
277'
278
90dce21e
JK
279test_expect_success 'push options keep quoted characters intact (http)' '
280 mk_http_pair true &&
281
282 test_commit -C test_http_clone one &&
028cb644 283 git -C test_http_clone push --push-option="\"embedded quotes\"" origin main &&
90dce21e
JK
284 echo "\"embedded quotes\"" >expect &&
285 test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/pre-receive.push_options
286'
287
decfe05b
SG
288# DO NOT add non-httpd-specific tests here, because the last part of this
289# test script is only executed when httpd is available and enabled.
290
3ac87030 291test_done