summaryrefslogtreecommitdiff
path: root/transport.c
diff options
context:
space:
mode:
authorClemens Buchacher <clemens.buchacher@intel.com>2015-11-16 09:05:58 +0100
committerJeff King <peff@peff.net>2015-11-16 08:59:19 -0500
commitaf65f68cdf7540764583956e5819d85c5f6c74d1 (patch)
treed24339ac5e49e4236682967e331da5cf9ba3f766 /transport.c
parentaf40944bda352190f05d22b7cb8fe88beb17f3a7 (diff)
downloadgit-af65f68cdf7540764583956e5819d85c5f6c74d1.tar.gz
allow hooks to ignore their standard input streamcb/hook-sigpipe
Since ec7dbd145 (receive-pack: allow hooks to ignore its standard input stream) the pre-receive and post-receive hooks ignore SIGPIPE. Do the same for the remaining hooks pre-push and post-rewrite, which read from standard input. The same arguments for ignoring SIGPIPE apply. Include test by Jeff King which checks that SIGPIPE does not cause pre-push hook failure. With the use of git update-ref --stdin it is fast enough to be enabled by default. Signed-off-by: Clemens Buchacher <clemens.buchacher@intel.com> Signed-off-by: Jeff King <peff@peff.net>
Diffstat (limited to 'transport.c')
-rw-r--r--transport.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/transport.c b/transport.c
index 863eb524f9..37e4f5e42c 100644
--- a/transport.c
+++ b/transport.c
@@ -15,6 +15,7 @@
#include "submodule.h"
#include "string-list.h"
#include "sha1-array.h"
+#include "sigchain.h"
/* rsync support */
@@ -1126,6 +1127,8 @@ static int run_pre_push_hook(struct transport *transport,
return -1;
}
+ sigchain_push(SIGPIPE, SIG_IGN);
+
strbuf_init(&buf, 256);
for (r = remote_refs; r; r = r->next) {
@@ -1139,8 +1142,10 @@ static int run_pre_push_hook(struct transport *transport,
r->peer_ref->name, sha1_to_hex(r->new_sha1),
r->name, sha1_to_hex(r->old_sha1));
- if (write_in_full(proc.in, buf.buf, buf.len) != buf.len) {
- ret = -1;
+ if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
+ /* We do not mind if a hook does not read all refs. */
+ if (errno != EPIPE)
+ ret = -1;
break;
}
}
@@ -1151,6 +1156,8 @@ static int run_pre_push_hook(struct transport *transport,
if (!ret)
ret = x;
+ sigchain_pop(SIGPIPE);
+
x = finish_command(&proc);
if (!ret)
ret = x;