changeset 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 2c6b054e22d0
children 5df1655edf42
files mercurial/hook.py tests/test-transaction-rollback-on-sigpipe.t
diffstat 2 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hook.py	Mon Oct 05 13:23:16 2020 -0400
+++ b/mercurial/hook.py	Mon Oct 05 17:18:39 2020 -0400
@@ -8,6 +8,7 @@
 from __future__ import absolute_import
 
 import contextlib
+import errno
 import os
 import sys
 
@@ -289,10 +290,18 @@
         # 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)
 
--- a/tests/test-transaction-rollback-on-sigpipe.t	Mon Oct 05 13:23:16 2020 -0400
+++ b/tests/test-transaction-rollback-on-sigpipe.t	Mon Oct 05 17:18:39 2020 -0400
@@ -64,4 +64,4 @@
   abort: stream ended unexpectedly (got 0 bytes, expected 4)
 
   $ check_for_abandoned_transaction
-  Abandoned transaction!
+  [1]