1test_expect_success "setup proc-receive hook (unknown version, $PROTOCOL/porcelain)" ' 2 write_script "$upstream/hooks/proc-receive" <<-EOF 3 printf >&2 "# proc-receive hook\n" 4 test-tool proc-receive -v --version 2 5 EOF 6' 7 8# Refs of upstream : main(A) 9# Refs of workbench: main(A) tags/v123 10# git push : refs/for/main/topic(A) 11test_expect_success "proc-receive: bad protocol (unknown version, $PROTOCOL/porcelain)" ' 12 test_must_fail git -C workbench push --porcelain origin \ 13 HEAD:refs/for/main/topic \ 14 >out-$test_count 2>&1 && 15 make_user_friendly_and_stable_output <out-$test_count >actual && 16 17 # Check status report for git-push 18 sed -n \ 19 -e "/^To / { p; n; p; n; p; }" \ 20 <actual >actual-report && 21 cat >expect <<-EOF && 22 To <URL/of/upstream.git> 23 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 24 Done 25 EOF 26 test_cmp expect actual-report && 27 28 # Check error message from "receive-pack", but ignore unstable fatal error 29 # message ("remote: fatal: the remote end hung up unexpectedly") which 30 # is different from the remote HTTP server with different locale settings. 31 grep "^remote: error:" <actual >actual-error && 32 format_and_save_expect <<-EOF && 33 > remote: error: proc-receive version "2" is not supported Z 34 EOF 35 test_cmp expect actual-error && 36 37 test_cmp_refs -C "$upstream" <<-EOF 38 <COMMIT-A> refs/heads/main 39 EOF 40' 41 42test_expect_success "setup proc-receive hook (hook --die-read-version, $PROTOCOL/porcelain)" ' 43 write_script "$upstream/hooks/proc-receive" <<-EOF 44 printf >&2 "# proc-receive hook\n" 45 test-tool proc-receive -v --die-read-version 46 EOF 47' 48 49# Refs of upstream : main(A) 50# Refs of workbench: main(A) tags/v123 51# git push : refs/for/main/topic(A) 52test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTOCOL/porcelain)" ' 53 test_must_fail git -C workbench push --porcelain origin \ 54 HEAD:refs/for/main/topic \ 55 >out-$test_count 2>&1 && 56 filter_out_user_friendly_and_stable_output \ 57 -e "/^To / { p; n; p; n; p; }" \ 58 <out-$test_count >actual && 59 cat >expect <<-EOF && 60 To <URL/of/upstream.git> 61 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 62 Done 63 EOF 64 test_cmp expect actual && 65 grep "remote: fatal: die with the --die-read-version option" out-$test_count && 66 grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && 67 68 test_cmp_refs -C "$upstream" <<-EOF 69 <COMMIT-A> refs/heads/main 70 EOF 71' 72 73test_expect_success "setup proc-receive hook (hook --die-write-version, $PROTOCOL/porcelain)" ' 74 write_script "$upstream/hooks/proc-receive" <<-EOF 75 printf >&2 "# proc-receive hook\n" 76 test-tool proc-receive -v --die-write-version 77 EOF 78' 79 80# Refs of upstream : main(A) 81# Refs of workbench: main(A) tags/v123 82# git push : refs/for/main/topic(A) 83test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROTOCOL/porcelain)" ' 84 test_must_fail git -C workbench push --porcelain origin \ 85 HEAD:refs/for/main/topic \ 86 >out-$test_count 2>&1 && 87 filter_out_user_friendly_and_stable_output \ 88 -e "/^To / { p; n; p; n; p; }" \ 89 <out-$test_count >actual && 90 cat >expect <<-EOF && 91 To <URL/of/upstream.git> 92 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 93 Done 94 EOF 95 test_cmp expect actual && 96 grep "remote: fatal: die with the --die-write-version option" out-$test_count && 97 grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && 98 99 test_cmp_refs -C "$upstream" <<-EOF 100 <COMMIT-A> refs/heads/main 101 EOF 102' 103 104test_expect_success "setup proc-receive hook (hook --die-read-commands, $PROTOCOL/porcelain)" ' 105 write_script "$upstream/hooks/proc-receive" <<-EOF 106 printf >&2 "# proc-receive hook\n" 107 test-tool proc-receive -v --die-read-commands 108 EOF 109' 110 111# Refs of upstream : main(A) 112# Refs of workbench: main(A) tags/v123 113# git push : refs/for/main/topic(A) 114test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROTOCOL/porcelain)" ' 115 test_must_fail git -C workbench push --porcelain origin \ 116 HEAD:refs/for/main/topic \ 117 >out-$test_count 2>&1 && 118 filter_out_user_friendly_and_stable_output \ 119 -e "/^To / { p; n; p; n; p; }" \ 120 <out-$test_count >actual && 121 cat >expect <<-EOF && 122 To <URL/of/upstream.git> 123 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 124 Done 125 EOF 126 test_cmp expect actual && 127 grep "remote: fatal: die with the --die-read-commands option" out-$test_count && 128 129 test_cmp_refs -C "$upstream" <<-EOF 130 <COMMIT-A> refs/heads/main 131 EOF 132' 133 134test_expect_success "setup proc-receive hook (hook --die-read-push-options, $PROTOCOL/porcelain)" ' 135 write_script "$upstream/hooks/proc-receive" <<-EOF 136 printf >&2 "# proc-receive hook\n" 137 test-tool proc-receive -v --die-read-push-options 138 EOF 139' 140 141# Refs of upstream : main(A) 142# Refs of workbench: main(A) tags/v123 143# git push : refs/for/main/topic(A) 144test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $PROTOCOL/porcelain)" ' 145 git -C "$upstream" config receive.advertisePushOptions true && 146 test_must_fail git -C workbench push --porcelain origin \ 147 -o reviewers=user1,user2 \ 148 HEAD:refs/for/main/topic \ 149 >out-$test_count 2>&1 && 150 filter_out_user_friendly_and_stable_output \ 151 -e "/^To / { p; n; p; n; p; }" \ 152 <out-$test_count >actual && 153 cat >expect <<-EOF && 154 To <URL/of/upstream.git> 155 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 156 Done 157 EOF 158 test_cmp expect actual && 159 grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && 160 161 test_cmp_refs -C "$upstream" <<-EOF 162 <COMMIT-A> refs/heads/main 163 EOF 164' 165 166test_expect_success "setup proc-receive hook (hook --die-write-report, $PROTOCOL/porcelain)" ' 167 write_script "$upstream/hooks/proc-receive" <<-EOF 168 printf >&2 "# proc-receive hook\n" 169 test-tool proc-receive -v --die-write-report 170 EOF 171' 172 173# Refs of upstream : main(A) 174# Refs of workbench: main(A) tags/v123 175# git push : refs/for/main/topic(A) 176test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTOCOL/porcelain)" ' 177 test_must_fail git -C workbench push --porcelain origin \ 178 HEAD:refs/for/main/topic \ 179 >out-$test_count 2>&1 && 180 filter_out_user_friendly_and_stable_output \ 181 -e "/^To / { p; n; p; n; p; }" \ 182 <out-$test_count >actual && 183 cat >expect <<-EOF && 184 To <URL/of/upstream.git> 185 ! HEAD:refs/for/main/topic [remote rejected] (fail to run proc-receive hook) 186 Done 187 EOF 188 test_cmp expect actual && 189 grep "remote: fatal: die with the --die-write-report option" out-$test_count && 190 191 test_cmp_refs -C "$upstream" <<-EOF 192 <COMMIT-A> refs/heads/main 193 EOF 194' 195 196test_expect_success "setup proc-receive hook (no report, $PROTOCOL/porcelain)" ' 197 write_script "$upstream/hooks/proc-receive" <<-EOF 198 printf >&2 "# proc-receive hook\n" 199 test-tool proc-receive -v 200 EOF 201' 202 203# Refs of upstream : main(A) 204# Refs of workbench: main(A) tags/v123 205# git push : next(A) refs/for/main/topic(A) 206test_expect_success "proc-receive: bad protocol (no report, $PROTOCOL/porcelain)" ' 207 test_must_fail git -C workbench push --porcelain origin \ 208 HEAD:refs/heads/next \ 209 HEAD:refs/for/main/topic >out-$test_count 2>&1 && 210 make_user_friendly_and_stable_output <out-$test_count >actual && 211 format_and_save_expect <<-EOF && 212 > remote: # pre-receive hook Z 213 > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z 214 > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 215 > remote: # proc-receive hook Z 216 > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 217 > remote: # post-receive hook Z 218 > remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next Z 219 > To <URL/of/upstream.git> 220 > * HEAD:refs/heads/next [new branch] 221 > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) 222 > Done 223 EOF 224 test_cmp expect actual && 225 226 test_cmp_refs -C "$upstream" <<-EOF 227 <COMMIT-A> refs/heads/main 228 <COMMIT-A> refs/heads/next 229 EOF 230' 231 232# Refs of upstream : main(A) next(A) 233# Refs of workbench: main(A) tags/v123 234test_expect_success "cleanup ($PROTOCOL/porcelain)" ' 235 git -C "$upstream" update-ref -d refs/heads/next 236' 237 238test_expect_success "setup proc-receive hook (no ref, $PROTOCOL/porcelain)" ' 239 write_script "$upstream/hooks/proc-receive" <<-EOF 240 printf >&2 "# proc-receive hook\n" 241 test-tool proc-receive -v \ 242 -r "ok" 243 EOF 244' 245 246# Refs of upstream : main(A) 247# Refs of workbench: main(A) tags/v123 248# git push : refs/for/main/topic 249test_expect_success "proc-receive: bad protocol (no ref, $PROTOCOL/porcelain)" ' 250 test_must_fail git -C workbench push --porcelain origin \ 251 HEAD:refs/for/main/topic\ 252 >out-$test_count 2>&1 && 253 make_user_friendly_and_stable_output <out-$test_count >actual && 254 format_and_save_expect <<-EOF && 255 > remote: # pre-receive hook Z 256 > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 257 > remote: # proc-receive hook Z 258 > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 259 > remote: proc-receive> ok Z 260 > remote: error: proc-receive reported incomplete status line: "ok" Z 261 > To <URL/of/upstream.git> 262 > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) 263 > Done 264 EOF 265 test_cmp expect actual && 266 267 test_cmp_refs -C "$upstream" <<-EOF 268 <COMMIT-A> refs/heads/main 269 EOF 270' 271 272test_expect_success "setup proc-receive hook (unknown status, $PROTOCOL/porcelain)" ' 273 write_script "$upstream/hooks/proc-receive" <<-EOF 274 printf >&2 "# proc-receive hook\n" 275 test-tool proc-receive -v \ 276 -r "xx refs/for/main/topic" 277 EOF 278' 279 280# Refs of upstream : main(A) 281# Refs of workbench: main(A) tags/v123 282# git push : refs/for/main/topic 283test_expect_success "proc-receive: bad protocol (unknown status, $PROTOCOL/porcelain)" ' 284 test_must_fail git -C workbench push --porcelain origin \ 285 HEAD:refs/for/main/topic \ 286 >out-$test_count 2>&1 && 287 make_user_friendly_and_stable_output <out-$test_count >actual && 288 format_and_save_expect <<-EOF && 289 > remote: # pre-receive hook Z 290 > remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 291 > remote: # proc-receive hook Z 292 > remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic Z 293 > remote: proc-receive> xx refs/for/main/topic Z 294 > remote: error: proc-receive reported bad status "xx" on ref "refs/for/main/topic" Z 295 > To <URL/of/upstream.git> 296 > ! HEAD:refs/for/main/topic [remote rejected] (proc-receive failed to report status) 297 > Done 298 EOF 299 test_cmp expect actual && 300 301 test_cmp_refs -C "$upstream" <<-EOF 302 <COMMIT-A> refs/heads/main 303 EOF 304' 305