Patchwork [2,of,4,V2] dispatch: gate against missing stdout/stderr

login
register
mail settings
Submitter Yuya Nishihara
Date Dec. 19, 2020, 2:49 a.m.
Message ID <a5fa4ea662d52a6eccb5.1608346158@lemosa>
Download mbox | patch
Permalink /patch/47937/
State Accepted
Headers show

Comments

Yuya Nishihara - Dec. 19, 2020, 2:49 a.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1608290094 -32400
#      Fri Dec 18 20:14:54 2020 +0900
# Node ID a5fa4ea662d52a6eccb538e79ca36b2a4745a9b8
# Parent  a05f8740ce1faeda3f6299c3cbf961be48652a06
dispatch: gate against missing stdout/stderr

We do need procutil.stdin/stdout/stderr, but we don't care much for sys.std*.
Let's leave them be None as it is the Python 3 way.

Patch

diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -166,26 +166,34 @@  if pycompat.ispy3:
         # "just work," here we change the sys.* streams to disable line ending
         # normalization, ensuring compatibility with our ui type.
 
-        # write_through is new in Python 3.7.
-        kwargs = {
-            "newline": "\n",
-            "line_buffering": sys.stdout.line_buffering,
-        }
-        if util.safehasattr(sys.stdout, "write_through"):
-            kwargs["write_through"] = sys.stdout.write_through
-        sys.stdout = io.TextIOWrapper(
-            sys.stdout.buffer, sys.stdout.encoding, sys.stdout.errors, **kwargs
-        )
+        if sys.stdout is not None:
+            # write_through is new in Python 3.7.
+            kwargs = {
+                "newline": "\n",
+                "line_buffering": sys.stdout.line_buffering,
+            }
+            if util.safehasattr(sys.stdout, "write_through"):
+                kwargs["write_through"] = sys.stdout.write_through
+            sys.stdout = io.TextIOWrapper(
+                sys.stdout.buffer,
+                sys.stdout.encoding,
+                sys.stdout.errors,
+                **kwargs
+            )
 
-        kwargs = {
-            "newline": "\n",
-            "line_buffering": sys.stderr.line_buffering,
-        }
-        if util.safehasattr(sys.stderr, "write_through"):
-            kwargs["write_through"] = sys.stderr.write_through
-        sys.stderr = io.TextIOWrapper(
-            sys.stderr.buffer, sys.stderr.encoding, sys.stderr.errors, **kwargs
-        )
+        if sys.stderr is not None:
+            kwargs = {
+                "newline": "\n",
+                "line_buffering": sys.stderr.line_buffering,
+            }
+            if util.safehasattr(sys.stderr, "write_through"):
+                kwargs["write_through"] = sys.stderr.write_through
+            sys.stderr = io.TextIOWrapper(
+                sys.stderr.buffer,
+                sys.stderr.encoding,
+                sys.stderr.errors,
+                **kwargs
+            )
 
         if sys.stdin is not None:
             # No write_through on read-only stream.
@@ -200,6 +208,8 @@  if pycompat.ispy3:
 
     def _silencestdio():
         for fp in (sys.stdout, sys.stderr):
+            if fp is None:
+                continue
             # Check if the file is okay
             try:
                 fp.flush()