diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2007-03-10 03:28:13 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-03-11 22:49:46 -0700 |
commit | 1d9e8b56fe3a0360bf61ce633827af8fa9a7013c (patch) | |
tree | 179fca89bbcfce5fdf70059d92ef6f06b79b422e /receive-pack.c | |
parent | 6c319a22e47e6b49d799f5893aeac92e723a5e6f (diff) | |
download | git-1d9e8b56fe3a0360bf61ce633827af8fa9a7013c.tar.gz |
Split back out update_hook handling in receive-pack
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>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'receive-pack.c')
-rw-r--r-- | receive-pack.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/receive-pack.c b/receive-pack.c index e147076056..4d7170f6ad 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"; } |