]> git.ipfire.org Git - thirdparty/git.git/commitdiff
receive-pack: feed report options to post-receive
authorJiang Xin <zhiyou.jx@alibaba-inc.com>
Thu, 27 Aug 2020 15:45:45 +0000 (11:45 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 27 Aug 2020 19:47:47 +0000 (12:47 -0700)
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 <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/receive-pack.c
t/t5411/test-0032-report-with-options.sh
t/t5411/test-0033-report-with-options--porcelain.sh
t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh
t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh
t/t5411/test-0038-report-mixed-refs.sh
t/t5411/test-0039-report-mixed-refs--porcelain.sh

index 2b63b9254561e9c435ae64bca8b735a416234735..38f230248d201ae851beac691da731f84cfc739b 100644 (file)
@@ -694,6 +694,7 @@ static void prepare_push_cert_sha1(struct child_process *proc)
 
 struct receive_hook_feed_state {
        struct command *cmd;
+       struct ref_push_report *report;
        int skip_broken;
        struct strbuf buf;
        const struct string_list *push_options;
@@ -781,11 +782,31 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
                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 (!state->report)
+               state->report = cmd->report;
+       if (state->report) {
+               struct object_id *old_oid;
+               struct object_id *new_oid;
+               const char *ref_name;
+
+               old_oid = state->report->old_oid ? state->report->old_oid : &cmd->old_oid;
+               new_oid = state->report->new_oid ? state->report->new_oid : &cmd->new_oid;
+               ref_name = state->report->ref_name ? state->report->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);
+               state->report = state->report->next;
+               if (!state->report)
+                       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;
@@ -804,6 +825,7 @@ static int run_receive_hook(struct command *commands,
        strbuf_init(&state.buf, 0);
        state.cmd = commands;
        state.skip_broken = skip_broken;
+       state.report = NULL;
        if (feed_receive_hook(&state, NULL, NULL))
                return 0;
        state.cmd = commands;
index a743aa80183e703e0729d216e0fcfe8f6aa7f6ea..c559c207faa853f7b8b778a76f4da0a37b8a3bd8 100644 (file)
@@ -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/for/master/topic
        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/for/master/topic
        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>
         * [new reference] HEAD -> refs/for/master/topic
        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>
         * [new reference] 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>
         * [new reference] 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/for/next/topic
         * [new reference] HEAD -> refs/for/a/b/c/topic
index 439b97b06ef6a23ad305b61b88582a6287002965..ea9312234e07dd258989ec3eb3cb7e3cc3bb3e4b 100644 (file)
@@ -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/for/master/topic    [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/for/master/topic    [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/for/master/topic    [new reference]
        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    [new reference]
        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    [new reference]
        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/for/next/topic    [new reference]
        *    HEAD:refs/for/a/b/c/topic    [new reference]
index 12acf9ea1f7068614ce970e5dd22758e2d07a30e..67cc4a8a4c0da380d87bbaaca3a8144cdc8f6838 100644 (file)
@@ -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>
         * [new reference] HEAD -> refs/for/master/topic
        EOF
@@ -99,7 +101,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/for/master/topic
        EOF
@@ -145,7 +149,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/for/master/topic
        EOF
index f4a2c56e14e2815c44069d41102338493b16f12e..1dc8551bc68725fed2428d0a6b77eb5ec34af01b 100644 (file)
@@ -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    [new reference]
        Done
@@ -100,7 +102,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/for/master/topic    [new reference]
        Done
@@ -147,7 +151,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/for/master/topic    [new reference]
        Done
index 1dd6a97a977b0f19f397d8fcb5aecd956e3328a8..bfc8d586d6668a1254c3acbb8e8a9f2c422369a9 100644 (file)
@@ -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
index 32ebf63dcfa2ad55b53d7d77ac12904f45cb363d..5d021a48379f189bfa106e6b2b131a2e29fb5d6e 100644 (file)
@@ -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]