From: Robin Jarry Date: Wed, 10 Nov 2021 09:29:42 +0000 (+0100) Subject: receive-pack: ignore SIGPIPE while reporting status to client X-Git-Tag: v2.35.0-rc0~82^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d34182b9e37fc72e04e40e834775a1c29e80c970;p=thirdparty%2Fgit.git receive-pack: ignore SIGPIPE while reporting status to client Before running the post-receive hook, status info is reported back to the client. If a remote client exits before or during the status report, receive-pack is killed by SIGPIPE and post-receive is never executed. The post-receive hook is often used to send email notifications (see contrib/hooks/post-receive-email), update bug trackers, start automatic builds, etc. Not executing it after an interrupted yet "successful" push can lead to inconsistencies. Ignore SIGPIPE before reporting status to the client to increase the chances of post-receive running if pre-receive was successful. This does not guarantee 100% consistency but it should resist early disconnection by the client. Signed-off-by: Robin Jarry Signed-off-by: Junio C Hamano --- diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 2d1f97e1ca..89202830ac 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -2563,10 +2563,12 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) &push_options); if (pack_lockfile) unlink_or_warn(pack_lockfile); + sigchain_push(SIGPIPE, SIG_IGN); if (report_status_v2) report_v2(commands, unpack_status); else if (report_status) report(commands, unpack_status); + sigchain_pop(SIGPIPE); run_receive_hook(commands, "post-receive", 1, &push_options); run_update_post_hook(commands);