Browse Source
Add a new multi-valued config variable "receive.procReceiveRefs" for `receive-pack` command, like the follows: git config --system --add receive.procReceiveRefs refs/for git config --system --add receive.procReceiveRefs refs/drafts If the specific prefix strings given by the config variables match the reference names of the commands which are sent from git client to `receive-pack`, these commands will be executed by an external hook (named "proc-receive"), instead of the internal `execute_commands` function. For example, if it is set to "refs/for", pushing to a reference such as "refs/for/master" will not create or update reference "refs/for/master", but may create or update a pull request directly by running the hook "proc-receive". Optional modifiers can be provided in the beginning of the value to filter commands for specific actions: create (a), modify (m), delete (d). A `!` can be included in the modifiers to negate the reference prefix entry. E.g.: git config --system --add receive.procReceiveRefs ad:refs/heads git config --system --add receive.procReceiveRefs !:refs/heads Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Jiang Xin
4 years ago
committed by
Junio C Hamano
7 changed files with 494 additions and 7 deletions
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
test_expect_success "add two receive.procReceiveRefs settings" ' |
||||
( |
||||
cd "$upstream" && |
||||
git config --add receive.procReceiveRefs refs/for && |
||||
git config --add receive.procReceiveRefs refs/review/ |
||||
) |
||||
' |
@ -0,0 +1,113 @@
@@ -0,0 +1,113 @@
|
||||
test_expect_success "config receive.procReceiveRefs = refs ($PROTOCOL)" ' |
||||
git -C "$upstream" config --unset-all receive.procReceiveRefs && |
||||
git -C "$upstream" config --add receive.procReceiveRefs refs |
||||
' |
||||
|
||||
# Refs of upstream : master(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
test_expect_success "setup upstream branches ($PROTOCOL)" ' |
||||
( |
||||
cd "$upstream" && |
||||
git update-ref refs/heads/master $B && |
||||
git update-ref refs/heads/foo $A && |
||||
git update-ref refs/heads/bar $A && |
||||
git update-ref refs/heads/baz $A |
||||
) |
||||
|
||||
' |
||||
|
||||
test_expect_success "setup proc-receive hook ($PROTOCOL)" ' |
||||
write_script "$upstream/hooks/proc-receive" <<-EOF |
||||
printf >&2 "# proc-receive hook\n" |
||||
test-tool proc-receive -v \ |
||||
-r "ok refs/heads/master" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/heads/foo" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/heads/bar" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/for/master/topic" \ |
||||
-r "option refname refs/pull/123/head" \ |
||||
-r "option old-oid $A" \ |
||||
-r "option new-oid $B" \ |
||||
-r "ok refs/for/next/topic" \ |
||||
-r "option refname refs/pull/124/head" \ |
||||
-r "option old-oid $B" \ |
||||
-r "option new-oid $A" \ |
||||
-r "option forced-update" |
||||
EOF |
||||
' |
||||
|
||||
# Refs of upstream : master(B) foo(A) bar(A)) baz(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
# git push -f : master(A) (NULL) (B) refs/for/master/topic(A) refs/for/next/topic(A) |
||||
test_expect_success "proc-receive: process all refs ($PROTOCOL)" ' |
||||
git -C workbench push -f origin \ |
||||
HEAD:refs/heads/master \ |
||||
:refs/heads/foo \ |
||||
$B:refs/heads/bar \ |
||||
HEAD:refs/for/master/topic \ |
||||
HEAD:refs/for/next/topic \ |
||||
>out 2>&1 && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
remote: # pre-receive hook |
||||
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic |
||||
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic |
||||
remote: # proc-receive hook |
||||
remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: proc-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic |
||||
remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic |
||||
remote: proc-receive> ok refs/heads/master |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/heads/foo |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/heads/bar |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/for/master/topic |
||||
remote: proc-receive> option refname refs/pull/123/head |
||||
remote: proc-receive> option old-oid <COMMIT-A> |
||||
remote: proc-receive> option new-oid <COMMIT-B> |
||||
remote: proc-receive> ok refs/for/next/topic |
||||
remote: proc-receive> option refname refs/pull/124/head |
||||
remote: proc-receive> option old-oid <COMMIT-B> |
||||
remote: proc-receive> option new-oid <COMMIT-A> |
||||
remote: proc-receive> option forced-update |
||||
remote: # post-receive hook |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: post-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head |
||||
remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head |
||||
To <URL/of/upstream.git> |
||||
<OID-A>..<OID-B> <COMMIT-B> -> bar |
||||
- [deleted] foo |
||||
+ <OID-B>...<OID-A> HEAD -> master (forced update) |
||||
<OID-A>..<OID-B> HEAD -> refs/pull/123/head |
||||
+ <OID-B>...<OID-A> HEAD -> refs/pull/124/head (forced update) |
||||
EOF |
||||
test_cmp expect actual && |
||||
git -C "$upstream" show-ref >out && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
<COMMIT-B> refs/heads/bar |
||||
<COMMIT-A> refs/heads/baz |
||||
<COMMIT-A> refs/heads/master |
||||
EOF |
||||
test_cmp expect actual |
||||
' |
||||
|
||||
# Refs of upstream : master(A) bar(A) baz(B) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
test_expect_success "cleanup ($PROTOCOL)" ' |
||||
( |
||||
cd "$upstream" && |
||||
git update-ref -d refs/heads/bar && |
||||
git update-ref -d refs/heads/baz |
||||
) |
||||
' |
@ -0,0 +1,114 @@
@@ -0,0 +1,114 @@
|
||||
test_expect_success "config receive.procReceiveRefs = refs ($PROTOCOL/porcelain)" ' |
||||
git -C "$upstream" config --unset-all receive.procReceiveRefs && |
||||
git -C "$upstream" config --add receive.procReceiveRefs refs |
||||
' |
||||
|
||||
# Refs of upstream : master(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
test_expect_success "setup upstream branches ($PROTOCOL/porcelain)" ' |
||||
( |
||||
cd "$upstream" && |
||||
git update-ref refs/heads/master $B && |
||||
git update-ref refs/heads/foo $A && |
||||
git update-ref refs/heads/bar $A && |
||||
git update-ref refs/heads/baz $A |
||||
) |
||||
|
||||
' |
||||
|
||||
test_expect_success "setup proc-receive hook ($PROTOCOL/porcelain)" ' |
||||
write_script "$upstream/hooks/proc-receive" <<-EOF |
||||
printf >&2 "# proc-receive hook\n" |
||||
test-tool proc-receive -v \ |
||||
-r "ok refs/heads/master" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/heads/foo" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/heads/bar" \ |
||||
-r "option fall-through" \ |
||||
-r "ok refs/for/master/topic" \ |
||||
-r "option refname refs/pull/123/head" \ |
||||
-r "option old-oid $A" \ |
||||
-r "option new-oid $B" \ |
||||
-r "ok refs/for/next/topic" \ |
||||
-r "option refname refs/pull/124/head" \ |
||||
-r "option old-oid $B" \ |
||||
-r "option new-oid $A" \ |
||||
-r "option forced-update" |
||||
EOF |
||||
' |
||||
|
||||
# Refs of upstream : master(B) foo(A) bar(A)) baz(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
# git push -f : master(A) (NULL) (B) refs/for/master/topic(A) refs/for/next/topic(A) |
||||
test_expect_success "proc-receive: process all refs ($PROTOCOL/porcelain)" ' |
||||
git -C workbench push --porcelain -f origin \ |
||||
HEAD:refs/heads/master \ |
||||
:refs/heads/foo \ |
||||
$B:refs/heads/bar \ |
||||
HEAD:refs/for/master/topic \ |
||||
HEAD:refs/for/next/topic \ |
||||
>out 2>&1 && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
remote: # pre-receive hook |
||||
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic |
||||
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic |
||||
remote: # proc-receive hook |
||||
remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: proc-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic |
||||
remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic |
||||
remote: proc-receive> ok refs/heads/master |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/heads/foo |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/heads/bar |
||||
remote: proc-receive> option fall-through |
||||
remote: proc-receive> ok refs/for/master/topic |
||||
remote: proc-receive> option refname refs/pull/123/head |
||||
remote: proc-receive> option old-oid <COMMIT-A> |
||||
remote: proc-receive> option new-oid <COMMIT-B> |
||||
remote: proc-receive> ok refs/for/next/topic |
||||
remote: proc-receive> option refname refs/pull/124/head |
||||
remote: proc-receive> option old-oid <COMMIT-B> |
||||
remote: proc-receive> option new-oid <COMMIT-A> |
||||
remote: proc-receive> option forced-update |
||||
remote: # post-receive hook |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/bar |
||||
remote: post-receive< <COMMIT-A> <ZERO-OID> refs/heads/foo |
||||
remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/master |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head |
||||
remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head |
||||
To <URL/of/upstream.git> |
||||
<COMMIT-B>:refs/heads/bar <OID-A>..<OID-B> |
||||
- :refs/heads/foo [deleted] |
||||
+ HEAD:refs/heads/master <OID-B>...<OID-A> (forced update) |
||||
HEAD:refs/pull/123/head <OID-A>..<OID-B> |
||||
+ HEAD:refs/pull/124/head <OID-B>...<OID-A> (forced update) |
||||
Done |
||||
EOF |
||||
test_cmp expect actual && |
||||
git -C "$upstream" show-ref >out && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
<COMMIT-B> refs/heads/bar |
||||
<COMMIT-A> refs/heads/baz |
||||
<COMMIT-A> refs/heads/master |
||||
EOF |
||||
test_cmp expect actual |
||||
' |
||||
|
||||
# Refs of upstream : master(A) bar(A) baz(B) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
test_expect_success "cleanup ($PROTOCOL/porcelain)" ' |
||||
( |
||||
cd "$upstream" && |
||||
git update-ref -d refs/heads/bar && |
||||
git update-ref -d refs/heads/baz |
||||
) |
||||
' |
@ -0,0 +1,135 @@
@@ -0,0 +1,135 @@
|
||||
test_expect_success "config receive.procReceiveRefs with modifiers ($PROTOCOL)" ' |
||||
( |
||||
cd "$upstream" && |
||||
git config --unset-all receive.procReceiveRefs && |
||||
git config --add receive.procReceiveRefs m:refs/heads/master && |
||||
git config --add receive.procReceiveRefs ad:refs/heads && |
||||
git config --add receive.procReceiveRefs "a!:refs/heads" |
||||
) |
||||
' |
||||
|
||||
test_expect_success "setup proc-receive hook ($PROTOCOL)" ' |
||||
write_script "$upstream/hooks/proc-receive" <<-EOF |
||||
printf >&2 "# proc-receive hook\n" |
||||
test-tool proc-receive -v \ |
||||
-r "ok refs/heads/master" \ |
||||
-r "option refname refs/pull/123/head" \ |
||||
-r "option old-oid $A" \ |
||||
-r "option new-oid $B" \ |
||||
-r "ok refs/tags/v123 " \ |
||||
-r "option refname refs/pull/124/head" |
||||
EOF |
||||
' |
||||
|
||||
# Refs of upstream : master(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
# git push : master(B) tags/v123 |
||||
test_expect_success "proc-receive: update branch and new tag ($PROTOCOL)" ' |
||||
git -C workbench push origin \ |
||||
$B:refs/heads/master \ |
||||
v123 >out 2>&1 && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
remote: # pre-receive hook |
||||
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/master |
||||
remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 |
||||
remote: # proc-receive hook |
||||
remote: proc-receive< <COMMIT-A> <COMMIT-B> refs/heads/master |
||||
remote: proc-receive< <ZERO-OID> <TAG-v123> refs/tags/v123 |
||||
remote: proc-receive> ok refs/heads/master |
||||
remote: proc-receive> option refname refs/pull/123/head |
||||
remote: proc-receive> option old-oid <COMMIT-A> |
||||
remote: proc-receive> option new-oid <COMMIT-B> |
||||
remote: proc-receive> ok refs/tags/v123 |
||||
remote: proc-receive> option refname refs/pull/124/head |
||||
remote: # post-receive hook |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/pull/123/head |
||||
remote: post-receive< <ZERO-OID> <TAG-v123> refs/pull/124/head |
||||
To <URL/of/upstream.git> |
||||
<OID-A>..<OID-B> <COMMIT-B> -> refs/pull/123/head |
||||
* [new reference] v123 -> refs/pull/124/head |
||||
EOF |
||||
test_cmp expect actual && |
||||
git -C "$upstream" show-ref >out && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
<COMMIT-A> refs/heads/master |
||||
EOF |
||||
test_cmp expect actual |
||||
' |
||||
|
||||
# Refs of upstream : master(A) |
||||
# Refs of workbench: master(A) tags/v123 |
||||
test_expect_success "setup upstream: create tags/v123 ($PROTOCOL)" ' |
||||
git -C "$upstream" update-ref refs/heads/topic $A && |
||||
git -C "$upstream" update-ref refs/tags/v123 $TAG && |
||||
git -C "$upstream" show-ref >out && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
<COMMIT-A> refs/heads/master |
||||
<COMMIT-A> refs/heads/topic |
||||
<TAG-v123> refs/tags/v123 |
||||
EOF |
||||
test_cmp expect actual |
||||
' |
||||
|
||||
test_expect_success "setup proc-receive hook ($PROTOCOL)" ' |
||||
write_script "$upstream/hooks/proc-receive" <<-EOF |
||||
printf >&2 "# proc-receive hook\n" |
||||
test-tool proc-receive -v \ |
||||
-r "ok refs/heads/master" \ |
||||
-r "option refname refs/pull/123/head" \ |
||||
-r "option old-oid $A" \ |
||||
-r "option new-oid $ZERO_OID" \ |
||||
-r "ok refs/heads/next" \ |
||||
-r "option refname refs/pull/124/head" \ |
||||
-r "option new-oid $A" |
||||
EOF |
||||
' |
||||
|
||||
# Refs of upstream : master(A) topic(A) tags/v123 |
||||
# Refs of workbench: master(A) tags/v123 |
||||
# git push : NULL topic(B) NULL next(A) |
||||
test_expect_success "proc-receive: create/delete branch, and delete tag ($PROTOCOL)" ' |
||||
git -C workbench push origin \ |
||||
:refs/heads/master \ |
||||
$B:refs/heads/topic \ |
||||
$A:refs/heads/next \ |
||||
:refs/tags/v123 >out 2>&1 && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
remote: # pre-receive hook |
||||
remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/master |
||||
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/topic |
||||
remote: pre-receive< <TAG-v123> <ZERO-OID> refs/tags/v123 |
||||
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next |
||||
remote: # proc-receive hook |
||||
remote: proc-receive< <COMMIT-A> <ZERO-OID> refs/heads/master |
||||
remote: proc-receive< <ZERO-OID> <COMMIT-A> refs/heads/next |
||||
remote: proc-receive> ok refs/heads/master |
||||
remote: proc-receive> option refname refs/pull/123/head |
||||
remote: proc-receive> option old-oid <COMMIT-A> |
||||
remote: proc-receive> option new-oid <ZERO-OID> |
||||
remote: proc-receive> ok refs/heads/next |
||||
remote: proc-receive> option refname refs/pull/124/head |
||||
remote: proc-receive> option new-oid <COMMIT-A> |
||||
remote: # post-receive hook |
||||
remote: post-receive< <COMMIT-A> <ZERO-OID> refs/pull/123/head |
||||
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/topic |
||||
remote: post-receive< <TAG-v123> <ZERO-OID> refs/tags/v123 |
||||
remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/124/head |
||||
To <URL/of/upstream.git> |
||||
- [deleted] refs/pull/123/head |
||||
<OID-A>..<OID-B> <COMMIT-B> -> topic |
||||
- [deleted] v123 |
||||
* [new reference] <COMMIT-A> -> refs/pull/124/head |
||||
EOF |
||||
test_cmp expect actual && |
||||
git -C "$upstream" show-ref >out && |
||||
make_user_friendly_and_stable_output <out >actual && |
||||
cat >expect <<-EOF && |
||||
<COMMIT-A> refs/heads/master |
||||
<COMMIT-B> refs/heads/topic |
||||
EOF |
||||
test_cmp expect actual |
||||
' |
Loading…
Reference in new issue