diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-09-26 14:39:44 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-09-26 14:39:44 -0700 |
commit | bdab1bca53b71fd6bd2420d1e007eb2ef7b8abc3 (patch) | |
tree | 47cf14e920aad5a552426fd0b3b4c024f3d31cf5 | |
parent | c0f5f311dbb219c88a2da4a3029f9c7d9c554753 (diff) | |
parent | ec7dbd145bd8ea27d958dcb16e19b5f0ef3fd643 (diff) | |
download | git-bdab1bca53b71fd6bd2420d1e007eb2ef7b8abc3.tar.gz |
Merge branch 'jc/ignore-sigpipe-while-running-hooks'
pre- and post-receive hooks are no longer required to read all
their inputs.
* jc/ignore-sigpipe-while-running-hooks:
receive-pack: allow hooks to ignore its standard input stream
-rw-r--r-- | builtin/receive-pack.c | 6 | ||||
-rwxr-xr-x | t/t5401-update-hooks.sh | 13 |
2 files changed, 19 insertions, 0 deletions
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index afb8d99264..daf0600ca3 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -15,6 +15,7 @@ #include "connected.h" #include "argv-array.h" #include "version.h" +#include "sigchain.h" static const char receive_pack_usage[] = "git receive-pack <git-dir>"; @@ -287,6 +288,8 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_sta return code; } + sigchain_push(SIGPIPE, SIG_IGN); + while (1) { const char *buf; size_t n; @@ -298,6 +301,9 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_sta close(proc.in); if (use_sideband) finish_async(&muxer); + + sigchain_pop(SIGPIPE); + return finish_command(&proc); } diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh index 17bcb0b040..7f278d8ce9 100755 --- a/t/t5401-update-hooks.sh +++ b/t/t5401-update-hooks.sh @@ -135,4 +135,17 @@ test_expect_success 'send-pack stderr contains hook messages' ' test_cmp expect actual ' +test_expect_success 'pre-receive hook that forgets to read its input' ' + write_script victim.git/hooks/pre-receive <<-\EOF && + exit 0 + EOF + rm -f victim.git/hooks/update victim.git/hooks/post-update && + + for v in $(test_seq 100 999) + do + git branch branch_$v master || return + done && + git push ./victim.git "+refs/heads/*:refs/heads/*" +' + test_done |