[PATCH 7/8] Split back out update_hook handling in receive-pack
- From
Shawn O. Pearce <spearce@spearce.org>
- Date
- Mar 10, 2007, 08:28 UTC
- Message-ID
- <20070310082813.GG4133@spearce.org>
Since we have decided to change the calling conventions for the pre-receive and post-receive hooks to take the ref data on stdin rather than on the command line we cannot use the same logic to invoke the update hook anymore.
So we take a small step backwards towards what we used to have, and create a specialized function for executing just the update hook.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org> --- receive-pack.c | 26 ++++++++++++++++++++++++-- 1 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/receive-pack.c b/receive-pack.c index e147076..4d7170f 100644 --- a/receive-pack.c +++ b/receive-pack.c @@ -67,7 +67,6 @@ struct command { static struct command *commands; -static const char update_hook[] = "hooks/update"; static const char pre_receive_hook[] = "hooks/pre-receive"; static const char post_receive_hook[] = "hooks/post-receive"; @@ -134,6 +133,29 @@ static int run_hook(const char *hook_name, return hook_status(code, hook_name); } +static int run_update_hook(struct command *cmd) +{ + static const char update_hook[] = "hooks/update"; + struct child_process proc; + const char *argv[5]; + + if (access(update_hook, X_OK) < 0) + return 0; + + argv[0] = update_hook; + argv[1] = cmd->ref_name; + argv[2] = sha1_to_hex(cmd->old_sha1); + argv[3] = sha1_to_hex(cmd->new_sha1); + argv[4] = NULL; + + memset(&proc, 0, sizeof(proc)); + proc.argv = argv; + proc.no_stdin = 1; + proc.stdout_to_stderr = 1; + + return hook_status(run_command(&proc), update_hook); +} + static const char *update(struct command *cmd) { const char *name = cmd->ref_name; @@ -170,7 +192,7 @@ static const char *update(struct command *cmd) return "non-fast forward"; } } - if (run_hook(update_hook, cmd, 1)) { + if (run_update_hook(cmd)) { error("hook declined to update %s", name); return "hook declined"; }
-- 1.5.0.3.942.g299f