[PATCH v17 06/10] receive-pack: feed report options to post-receive
From: Jiang Xin <hidden>
Date: 2020-08-15 21:57:13
Subsystem:
the rest · Maintainer:
Linus Torvalds
Possibly related (same subject, not in this thread)
- 2020-08-17 · Re: [PATCH v17 06/10] receive-pack: feed report options to post-receive · Junio C Hamano <hidden>
From: Jiang Xin <redacted> When commands are fed to the "post-receive" hook, report options will be parsed and the real old-oid, new-oid, reference name will feed to the "post-receive" hook. Signed-off-by: Jiang Xin <redacted> --- builtin/receive-pack.c | 29 ++++++++++++++++--- t/t5411/once-0010-report-status-v1.sh | 3 +- t/t5411/test-0032-report-with-options.sh | 14 ++++----- ...est-0033-report-with-options--porcelain.sh | 14 ++++----- ...t-0036-report-multi-rewrite-for-one-ref.sh | 11 +++++-- ...rt-multi-rewrite-for-one-ref--porcelain.sh | 11 +++++-- t/t5411/test-0038-report-mixed-refs.sh | 2 +- .../test-0039-report-mixed-refs--porcelain.sh | 2 +- 8 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 58972aa7cf..a687218167 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c@@ -777,17 +777,38 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep) { struct receive_hook_feed_state *state = state_; struct command *cmd = state->cmd; + static struct ref_push_report_options *options = NULL; while (cmd && state->skip_broken && (cmd->report.error_message || cmd->did_not_exist)) cmd = cmd->next; if (!cmd) return -1; /* EOF */ + if (!bufp) + return 0; /* OK, can feed something. */ strbuf_reset(&state->buf); - strbuf_addf(&state->buf, "%s %s %s\n", - oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid), - cmd->ref_name); - state->cmd = cmd->next; + if (!options) + options = cmd->report.options; + if (options) { + struct object_id *old_oid; + struct object_id *new_oid; + const char *ref_name; + + old_oid = options->old_oid ? options->old_oid : &cmd->old_oid; + new_oid = options->new_oid ? options->new_oid : &cmd->new_oid; + ref_name = options->ref_name ? options->ref_name : cmd->ref_name; + strbuf_addf(&state->buf, "%s %s %s\n", + oid_to_hex(old_oid), oid_to_hex(new_oid), + ref_name); + options = options->next; + if (!options) + state->cmd = cmd->next; + } else { + strbuf_addf(&state->buf, "%s %s %s\n", + oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid), + cmd->ref_name); + state->cmd = cmd->next; + } if (bufp) { *bufp = state->buf.buf; *sizep = state->buf.len;
diff --git a/t/t5411/once-0010-report-status-v1.sh b/t/t5411/once-0010-report-status-v1.sh
index 56a86d8ed4..bf410dc418 100644
--- a/t/t5411/once-0010-report-status-v1.sh
+++ b/t/t5411/once-0010-report-status-v1.sh@@ -74,7 +74,8 @@ test_expect_success "proc-receive: report status v1" ' post-receive< <COMMIT-A> <COMMIT-B> refs/heads/master post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic1 post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo - post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic2 + post-receive< <ZERO-OID> <COMMIT-A> refs/for/changes/23/123/1 + post-receive< <COMMIT-B> <COMMIT-A> refs/for/changes/24/124/2 EOF test_cmp expect actual &&
diff --git a/t/t5411/test-0032-report-with-options.sh b/t/t5411/test-0032-report-with-options.sh
index 3742ed3c3d..b77b78c49f 100644
--- a/t/t5411/test-0032-report-with-options.sh
+++ b/t/t5411/test-0032-report-with-options.sh@@ -54,7 +54,7 @@ test_expect_success "proc-receive: report option refname ($PROTOCOL)" ' remote: proc-receive> ok refs/for/master/topic remote: proc-receive> option refname refs/pull/123/head remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> * [new reference] HEAD -> refs/pull/123/head EOF
@@ -87,7 +87,7 @@ test_expect_success "proc-receive: report option refname and forced-update ($PRO remote: proc-receive> option refname refs/pull/123/head remote: proc-receive> option forced-update remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> * [new reference] HEAD -> refs/pull/123/head EOF
@@ -121,7 +121,7 @@ test_expect_success "proc-receive: report option refname and old-oid ($PROTOCOL) remote: proc-receive> option refname refs/pull/123/head remote: proc-receive> option old-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> <OID-B>..<OID-A> HEAD -> refs/pull/123/head EOF
@@ -153,7 +153,7 @@ test_expect_success "proc-receive: report option old-oid ($PROTOCOL)" ' remote: proc-receive> ok refs/for/master/topic remote: proc-receive> option old-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/for/master/topic To <URL/of/upstream.git> <OID-B>..<OID-A> HEAD -> refs/for/master/topic EOF
@@ -187,7 +187,7 @@ test_expect_success "proc-receive: report option old-oid and new-oid ($PROTOCOL) remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic To <URL/of/upstream.git> <OID-A>..<OID-B> HEAD -> refs/for/master/topic EOF
@@ -237,9 +237,9 @@ test_expect_success "proc-receive: report with multiple rewrites ($PROTOCOL)" ' remote: proc-receive> option forced-update remote: proc-receive> option new-oid <COMMIT-A> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head To <URL/of/upstream.git> * [new reference] HEAD -> refs/pull/123/head * [new reference] HEAD -> refs/for/a/b/c/topic
diff --git a/t/t5411/test-0033-report-with-options--porcelain.sh b/t/t5411/test-0033-report-with-options--porcelain.sh
index f18ba9f06f..1fe352b686 100644
--- a/t/t5411/test-0033-report-with-options--porcelain.sh
+++ b/t/t5411/test-0033-report-with-options--porcelain.sh@@ -55,7 +55,7 @@ test_expect_success "proc-receive: report option refname ($PROTOCOL/porcelain)" remote: proc-receive> ok refs/for/master/topic remote: proc-receive> option refname refs/pull/123/head remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> * HEAD:refs/pull/123/head [new reference] Done
@@ -90,7 +90,7 @@ test_expect_success "proc-receive: report option refname and forced-update ($PRO remote: proc-receive> option refname refs/pull/123/head remote: proc-receive> option forced-update remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> * HEAD:refs/pull/123/head [new reference] Done
@@ -125,7 +125,7 @@ test_expect_success "proc-receive: report option refname and old-oid ($PROTOCOL/ remote: proc-receive> option refname refs/pull/123/head remote: proc-receive> option old-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/123/head To <URL/of/upstream.git> HEAD:refs/pull/123/head <OID-B>..<OID-A> Done
@@ -158,7 +158,7 @@ test_expect_success "proc-receive: report option old-oid ($PROTOCOL/porcelain)" remote: proc-receive> ok refs/for/master/topic remote: proc-receive> option old-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/for/master/topic To <URL/of/upstream.git> HEAD:refs/for/master/topic <OID-B>..<OID-A> Done
@@ -193,7 +193,7 @@ test_expect_success "proc-receive: report option old-oid and new-oid ($PROTOCOL/ remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic To <URL/of/upstream.git> HEAD:refs/for/master/topic <OID-A>..<OID-B> Done
@@ -245,9 +245,9 @@ test_expect_success "proc-receive: report with multiple rewrites ($PROTOCOL/porc remote: proc-receive> option forced-update remote: proc-receive> option new-oid <COMMIT-A> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/pull/123/head remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/topic - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/pull/124/head To <URL/of/upstream.git> * HEAD:refs/pull/123/head [new reference] * HEAD:refs/for/a/b/c/topic [new reference]
diff --git a/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh b/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh
index 64662afdc6..27d58edd14 100644
--- a/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh
+++ b/t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh@@ -41,7 +41,9 @@ test_expect_success "proc-receive: multiple rewrite for one ref, no refname for remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/25/125/1 To <URL/of/upstream.git> <OID-A>..<OID-B> HEAD -> refs/for/master/topic * [new reference] HEAD -> refs/changes/24/124/1
@@ -101,7 +103,9 @@ test_expect_success "proc-receive: multiple rewrites for one ref, no refname for remote: proc-receive> option new-oid <COMMIT-A> remote: proc-receive> option forced-update remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/changes/25/125/1 To <URL/of/upstream.git> * [new reference] HEAD -> refs/changes/24/124/1 <OID-A>..<OID-B> HEAD -> refs/for/master/topic
@@ -149,7 +153,8 @@ test_expect_success "proc-receive: multiple rewrites for one ref ($PROTOCOL)" ' remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/23/123/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/24/124/2 To <URL/of/upstream.git> * [new reference] HEAD -> refs/changes/23/123/1 <OID-A>..<OID-B> HEAD -> refs/changes/24/124/2
diff --git a/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh b/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh
index a7e29af0c2..77b5b22ed4 100644
--- a/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh
+++ b/t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh@@ -41,7 +41,9 @@ test_expect_success "proc-receive: multiple rewrite for one ref, no refname for remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/25/125/1 To <URL/of/upstream.git> HEAD:refs/for/master/topic <OID-A>..<OID-B> * HEAD:refs/changes/24/124/1 [new reference]
@@ -102,7 +104,9 @@ test_expect_success "proc-receive: multiple rewrites for one ref, no refname for remote: proc-receive> option new-oid <COMMIT-A> remote: proc-receive> option forced-update remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/24/124/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic + remote: post-receive< <COMMIT-B> <COMMIT-A> refs/changes/25/125/1 To <URL/of/upstream.git> * HEAD:refs/changes/24/124/1 [new reference] HEAD:refs/for/master/topic <OID-A>..<OID-B>
@@ -151,7 +155,8 @@ test_expect_success "proc-receive: multiple rewrites for one ref ($PROTOCOL/porc remote: proc-receive> option old-oid <COMMIT-A> remote: proc-receive> option new-oid <COMMIT-B> remote: # post-receive hook - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <ZERO-OID> <COMMIT-A> refs/changes/23/123/1 + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/changes/24/124/2 To <URL/of/upstream.git> * HEAD:refs/changes/23/123/1 [new reference] HEAD:refs/changes/24/124/2 <OID-A>..<OID-B>
diff --git a/t/t5411/test-0038-report-mixed-refs.sh b/t/t5411/test-0038-report-mixed-refs.sh
index 54bec4c026..a74a2cb449 100644
--- a/t/t5411/test-0038-report-mixed-refs.sh
+++ b/t/t5411/test-0038-report-mixed-refs.sh@@ -53,7 +53,7 @@ test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL)" ' remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic To <URL/of/upstream.git> <OID-A>..<OID-B> <COMMIT-B> -> master * [new branch] HEAD -> bar
diff --git a/t/t5411/test-0039-report-mixed-refs--porcelain.sh b/t/t5411/test-0039-report-mixed-refs--porcelain.sh
index 605b3cb5c9..e4baa13ea3 100644
--- a/t/t5411/test-0039-report-mixed-refs--porcelain.sh
+++ b/t/t5411/test-0039-report-mixed-refs--porcelain.sh@@ -53,7 +53,7 @@ test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL/porcel remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/baz remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/next/topic2 remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/foo - remote: post-receive< <ZERO-OID> <COMMIT-A> refs/for/master/topic + remote: post-receive< <COMMIT-A> <COMMIT-B> refs/for/master/topic To <URL/of/upstream.git> <COMMIT-B>:refs/heads/master <OID-A>..<OID-B> * HEAD:refs/heads/bar [new branch]
--
2.28.0