# HG changeset patch # User Mitchell Plamann # Date 2020-10-05 21:18:39 # Node ID b3e8d8e4a40d45d5bc13a8066bcc094945a22e89 # Parent 2c6b054e22d0b66dd098244fc28b5d5c3e3401e6 hook: ignore EPIPE when flushing stdout/stderr This fixes the bug described in the parent commit. test-transaction-rollback-on-sigpipe.t is updated to show the new behavior. Differential Revision: https://phab.mercurial-scm.org/D9152 diff --git a/mercurial/hook.py b/mercurial/hook.py --- a/mercurial/hook.py +++ b/mercurial/hook.py @@ -8,6 +8,7 @@ from __future__ import absolute_import import contextlib +import errno import os import sys @@ -289,10 +290,18 @@ def redirect_stdio(): # The stderr is fully buffered on Windows when connected to a pipe. # A forcible flush is required to make small stderr data in the # remote side available to the client immediately. - procutil.stderr.flush() + try: + procutil.stderr.flush() + except IOError as err: + if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): + raise error.StdioError(err) if _redirect and oldstdout >= 0: - procutil.stdout.flush() # write hook output to stderr fd + try: + procutil.stdout.flush() # write hook output to stderr fd + except IOError as err: + if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): + raise error.StdioError(err) os.dup2(oldstdout, stdoutno) os.close(oldstdout) diff --git a/tests/test-transaction-rollback-on-sigpipe.t b/tests/test-transaction-rollback-on-sigpipe.t --- a/tests/test-transaction-rollback-on-sigpipe.t +++ b/tests/test-transaction-rollback-on-sigpipe.t @@ -64,4 +64,4 @@ disconnecting. Then exit nonzero, to for abort: stream ended unexpectedly (got 0 bytes, expected 4) $ check_for_abandoned_transaction - Abandoned transaction! + [1]