Show More
@@ -10,6 +10,7 b' from __future__ import absolute_import, ' | |||
|
10 | 10 | import difflib |
|
11 | 11 | import errno |
|
12 | 12 | import getopt |
|
13 | import io | |
|
13 | 14 | import os |
|
14 | 15 | import pdb |
|
15 | 16 | import re |
@@ -144,7 +145,50 b' def run():' | |||
|
144 | 145 | if pycompat.ispy3: |
|
145 | 146 | |
|
146 | 147 | def initstdio(): |
|
147 | pass | |
|
148 | # stdio streams on Python 3 are io.TextIOWrapper instances proxying another | |
|
149 | # buffer. These streams will normalize \n to \r\n by default. Mercurial's | |
|
150 | # preferred mechanism for writing output (ui.write()) uses io.BufferedWriter | |
|
151 | # instances, which write to the underlying stdio file descriptor in binary | |
|
152 | # mode. ui.write() uses \n for line endings and no line ending normalization | |
|
153 | # is attempted through this interface. This "just works," even if the system | |
|
154 | # preferred line ending is not \n. | |
|
155 | # | |
|
156 | # But some parts of Mercurial (e.g. hooks) can still send data to sys.stdout | |
|
157 | # and sys.stderr. They will inherit the line ending normalization settings, | |
|
158 | # potentially causing e.g. \r\n to be emitted. Since emitting \n should | |
|
159 | # "just work," here we change the sys.* streams to disable line ending | |
|
160 | # normalization, ensuring compatibility with our ui type. | |
|
161 | ||
|
162 | # write_through is new in Python 3.7. | |
|
163 | kwargs = { | |
|
164 | "newline": "\n", | |
|
165 | "line_buffering": sys.stdout.line_buffering, | |
|
166 | } | |
|
167 | if util.safehasattr(sys.stdout, "write_through"): | |
|
168 | kwargs["write_through"] = sys.stdout.write_through | |
|
169 | sys.stdout = io.TextIOWrapper( | |
|
170 | sys.stdout.buffer, sys.stdout.encoding, sys.stdout.errors, **kwargs | |
|
171 | ) | |
|
172 | ||
|
173 | kwargs = { | |
|
174 | "newline": "\n", | |
|
175 | "line_buffering": sys.stderr.line_buffering, | |
|
176 | } | |
|
177 | if util.safehasattr(sys.stderr, "write_through"): | |
|
178 | kwargs["write_through"] = sys.stderr.write_through | |
|
179 | sys.stderr = io.TextIOWrapper( | |
|
180 | sys.stderr.buffer, sys.stderr.encoding, sys.stderr.errors, **kwargs | |
|
181 | ) | |
|
182 | ||
|
183 | # No write_through on read-only stream. | |
|
184 | sys.stdin = io.TextIOWrapper( | |
|
185 | sys.stdin.buffer, | |
|
186 | sys.stdin.encoding, | |
|
187 | sys.stdin.errors, | |
|
188 | # None is universal newlines mode. | |
|
189 | newline=None, | |
|
190 | line_buffering=sys.stdin.line_buffering, | |
|
191 | ) | |
|
148 | 192 | |
|
149 | 193 | def _silencestdio(): |
|
150 | 194 | for fp in (sys.stdout, sys.stderr): |
General Comments 0
You need to be logged in to leave comments.
Login now