Subject: [PATCH v16 00/11] New proc-receive hook for centralized workflow

From: Jiang Xin <[email-masked]>
Date: Mon, 18 May 2020 05:40:28 -0400

From: Jiang Xin <[email-masked]>

This topic introduces a new hook named "proc-receive" for
"receive-pack".  We can use this hook to implement a Gerrit-like
centralized workflow.

## Changes since v15

1. Parse report options in function `transport_update_tracking_ref()`
   in order to update remote-tracking branches properly.

   See patch 9/11 and 10/11.

2. Add docs for 'report-status-v2' in 'Documentation/technical/
   pack-protocol.txt', and other files.

   See patch 5/11.

3. Remove unnecessary headers:

    --- a/remote.c
    +++ b/remote.c
    @@ -1,6 +1,5 @@
     #include "cache.h"
     #include "config.h"
    -#include "connect.h"
     #include "remote.h"
     #include "refs.h"
     #include "refspec.h"
    
    --- a/t/helper/test-proc-receive.c
    +++ b/t/helper/test-proc-receive.c
    @@ -3,7 +3,6 @@
     #include "parse-options.h"
     #include "pkt-line.h"
     #include "sigchain.h"
    -#include "string-list.h"
     #include "test-tool.h"
     
     static const char *proc_receive_usage[] = {

4. Fix format issues:

    --- a/builtin/receive-pack.c
    +++ b/builtin/receive-pack.c
    @@ -2262,7 +2262,7 @@ static void report(struct command *commands, const char *unpack_status)
     	for (cmd = commands; cmd; cmd = cmd->next) {
     		if (!cmd->report.error_message)
     			packet_buf_write(&buf, "ok %s\n",
    -						 cmd->ref_name);
    +					 cmd->ref_name);
     		else
     			packet_buf_write(&buf, "ng %s %s\n",
     					 cmd->ref_name, cmd->report.error_message);

    --- a/builtin/send-pack.c
    +++ b/builtin/send-pack.c
    @@ -101,13 +101,13 @@ static void print_helper_status(struct ref *ref)
     				strbuf_addf(&buf, "ok %s\n", ref->name);
     			if (options->ref_name)
     				strbuf_addf(&buf, "option refname %s\n",
    -						  options->ref_name);
    +					    options->ref_name);
     			if (options->old_oid)
     				strbuf_addf(&buf, "option old-oid %s\n",
    -						  oid_to_hex(options->old_oid));
    +					    oid_to_hex(options->old_oid));
     			if (options->new_oid)
     				strbuf_addf(&buf, "option new-oid %s\n",
    -						  oid_to_hex(options->new_oid));
    +					    oid_to_hex(options->new_oid));
     			if (options->forced_update)
     				strbuf_addstr(&buf, "option forced-update\n");
     		}

5. Other minor changes:

    --- a/builtin/receive-pack.c
    +++ b/builtin/receive-pack.c
    @@ -806,7 +806,7 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
     	if (options) {
     		struct object_id *old_oid;
     		struct object_id *new_oid;
    -		char *ref_name;
    +		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;

    --- a/remote.h
    +++ b/remote.h
    @@ -94,7 +94,7 @@ int for_each_remote(each_remote_fn fn, void *priv);
     int remote_has_url(struct remote *remote, const char *url);
     
     struct ref_push_report_options {
    -	char *ref_name;
    +	const char *ref_name;
     	struct object_id *old_oid;
     	struct object_id *new_oid;
     	unsigned int forced_update:1;
    
----

Jiang Xin (11):
  transport: not report a non-head push as a branch
  t5411: add basic test cases for proc-receive hook
  receive-pack: add new proc-receive hook
  New capability "report-status-v2" for git-push
  doc: add document for capability report-status-v2
  receive-pack: feed report options to post-receive
  refs.c: refactor to reuse ref_is_hidden()
  receive-pack: new config receive.procReceiveRefs
  t5411: test updates of remote-tracking branches
  transport: parse report options for tracking refs
  doc: add documentation for the proc-receive hook

 Documentation/config/receive.txt              |  14 +
 Documentation/githooks.txt                    |  62 +++
 Documentation/technical/pack-protocol.txt     |  43 +-
 .../technical/protocol-capabilities.txt       |  17 +-
 Makefile                                      |   1 +
 builtin/receive-pack.c                        | 461 ++++++++++++++++--
 builtin/send-pack.c                           |  21 +-
 refs.c                                        |  13 +-
 refs.h                                        |   1 +
 remote.c                                      |   4 +-
 remote.h                                      |  16 +-
 send-pack.c                                   |  99 +++-
 t/helper/test-proc-receive.c                  | 174 +++++++
 t/helper/test-tool.c                          |   1 +
 t/helper/test-tool.h                          |   1 +
 t/t5411-proc-receive-hook.sh                  | 117 +++++
 t/t5411/common-functions.sh                   |  56 +++
 t/t5411/once-0010-report-status-v1.sh         |  88 ++++
 t/t5411/test-0000-standard-git-push.sh        | 143 ++++++
 .../test-0001-standard-git-push--porcelain.sh | 147 ++++++
 t/t5411/test-0002-pre-receive-declined.sh     |  33 ++
 ...st-0003-pre-receive-declined--porcelain.sh |  34 ++
 t/t5411/test-0010-proc-receive-settings.sh    |   7 +
 t/t5411/test-0011-no-hook-error.sh            |  64 +++
 t/t5411/test-0012-no-hook-error--porcelain.sh |  66 +++
 t/t5411/test-0013-bad-protocol.sh             | 217 +++++++++
 t/t5411/test-0014-bad-protocol--porcelain.sh  | 160 ++++++
 t/t5411/test-0020-report-ng.sh                |  67 +++
 t/t5411/test-0021-report-ng--porcelain.sh     |  69 +++
 t/t5411/test-0022-report-unexpect-ref.sh      |  45 ++
 ...est-0023-report-unexpect-ref--porcelain.sh |  46 ++
 t/t5411/test-0024-report-unknown-ref.sh       |  34 ++
 ...test-0025-report-unknown-ref--porcelain.sh |  35 ++
 t/t5411/test-0026-push-options.sh             |  79 +++
 t/t5411/test-0027-push-options--porcelain.sh  |  82 ++++
 t/t5411/test-0030-report-ok.sh                |  35 ++
 t/t5411/test-0031-report-ok--porcelain.sh     |  36 ++
 t/t5411/test-0032-report-with-options.sh      | 256 ++++++++++
 ...est-0033-report-with-options--porcelain.sh | 265 ++++++++++
 t/t5411/test-0034-report-ft.sh                |  44 ++
 t/t5411/test-0035-report-ft--porcelain.sh     |  45 ++
 ...t-0036-report-multi-rewrite-for-one-ref.sh | 227 +++++++++
 ...rt-multi-rewrite-for-one-ref--porcelain.sh | 172 +++++++
 t/t5411/test-0038-report-mixed-refs.sh        |  89 ++++
 .../test-0039-report-mixed-refs--porcelain.sh |  91 ++++
 t/t5411/test-0040-process-all-refs.sh         | 113 +++++
 .../test-0041-process-all-refs--porcelain.sh  | 114 +++++
 t/t5516-fetch-push.sh                         |   2 +-
 transport-helper.c                            |  53 +-
 transport.c                                   | 161 ++++--
 50 files changed, 4109 insertions(+), 111 deletions(-)
 create mode 100644 t/helper/test-proc-receive.c
 create mode 100755 t/t5411-proc-receive-hook.sh
 create mode 100644 t/t5411/common-functions.sh
 create mode 100644 t/t5411/once-0010-report-status-v1.sh
 create mode 100644 t/t5411/test-0000-standard-git-push.sh
 create mode 100644 t/t5411/test-0001-standard-git-push--porcelain.sh
 create mode 100644 t/t5411/test-0002-pre-receive-declined.sh
 create mode 100644 t/t5411/test-0003-pre-receive-declined--porcelain.sh
 create mode 100644 t/t5411/test-0010-proc-receive-settings.sh
 create mode 100644 t/t5411/test-0011-no-hook-error.sh
 create mode 100644 t/t5411/test-0012-no-hook-error--porcelain.sh
 create mode 100644 t/t5411/test-0013-bad-protocol.sh
 create mode 100644 t/t5411/test-0014-bad-protocol--porcelain.sh
 create mode 100644 t/t5411/test-0020-report-ng.sh
 create mode 100644 t/t5411/test-0021-report-ng--porcelain.sh
 create mode 100644 t/t5411/test-0022-report-unexpect-ref.sh
 create mode 100644 t/t5411/test-0023-report-unexpect-ref--porcelain.sh
 create mode 100644 t/t5411/test-0024-report-unknown-ref.sh
 create mode 100644 t/t5411/test-0025-report-unknown-ref--porcelain.sh
 create mode 100644 t/t5411/test-0026-push-options.sh
 create mode 100644 t/t5411/test-0027-push-options--porcelain.sh
 create mode 100644 t/t5411/test-0030-report-ok.sh
 create mode 100644 t/t5411/test-0031-report-ok--porcelain.sh
 create mode 100644 t/t5411/test-0032-report-with-options.sh
 create mode 100644 t/t5411/test-0033-report-with-options--porcelain.sh
 create mode 100644 t/t5411/test-0034-report-ft.sh
 create mode 100644 t/t5411/test-0035-report-ft--porcelain.sh
 create mode 100644 t/t5411/test-0036-report-multi-rewrite-for-one-ref.sh
 create mode 100644 t/t5411/test-0037-report-multi-rewrite-for-one-ref--porcelain.sh
 create mode 100644 t/t5411/test-0038-report-mixed-refs.sh
 create mode 100644 t/t5411/test-0039-report-mixed-refs--porcelain.sh
 create mode 100644 t/t5411/test-0040-process-all-refs.sh
 create mode 100644 t/t5411/test-0041-process-all-refs--porcelain.sh

-- 
2.26.1.120.g98702cf3e9