comparison mercurial/hook.py @ 45737:b3e8d8e4a40d

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
author Mitchell Plamann <mplamann@janestreet.com>
date Mon, 05 Oct 2020 17:18:39 -0400
parents fd3b94f1712d
children 89a2afe31e82
comparison
equal deleted inserted replaced
45736:2c6b054e22d0 45737:b3e8d8e4a40d
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import absolute_import 8 from __future__ import absolute_import
9 9
10 import contextlib 10 import contextlib
11 import errno
11 import os 12 import os
12 import sys 13 import sys
13 14
14 from .i18n import _ 15 from .i18n import _
15 from .pycompat import getattr 16 from .pycompat import getattr
287 288
288 finally: 289 finally:
289 # The stderr is fully buffered on Windows when connected to a pipe. 290 # The stderr is fully buffered on Windows when connected to a pipe.
290 # A forcible flush is required to make small stderr data in the 291 # A forcible flush is required to make small stderr data in the
291 # remote side available to the client immediately. 292 # remote side available to the client immediately.
292 procutil.stderr.flush() 293 try:
294 procutil.stderr.flush()
295 except IOError as err:
296 if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF):
297 raise error.StdioError(err)
293 298
294 if _redirect and oldstdout >= 0: 299 if _redirect and oldstdout >= 0:
295 procutil.stdout.flush() # write hook output to stderr fd 300 try:
301 procutil.stdout.flush() # write hook output to stderr fd
302 except IOError as err:
303 if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF):
304 raise error.StdioError(err)
296 os.dup2(oldstdout, stdoutno) 305 os.dup2(oldstdout, stdoutno)
297 os.close(oldstdout) 306 os.close(oldstdout)
298 307
299 308
300 def runhooks(ui, repo, htype, hooks, throw=False, **args): 309 def runhooks(ui, repo, htype, hooks, throw=False, **args):