From 2d8c658f6591c26b2219e6bead524eaa9cbe1e45 Mon Sep 17 00:00:00 2001 From: "victor.stinner" Date: Wed, 19 May 2010 20:30:19 +0000 Subject: [PATCH] Merged revisions 81359-81361 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r81359 | victor.stinner | 2010-05-19 19:00:07 +0200 (mer., 19 mai 2010) | 4 lines Issue #8663: distutils.log emulates backslashreplace error handler. Fix compilation in a non-ASCII directory if stdout encoding is ASCII (eg. if stdout is not a TTY). ........ r81360 | victor.stinner | 2010-05-19 19:11:19 +0200 (mer., 19 mai 2010) | 5 lines regrtest.py: call replace_stdout() before the first call to print() print("== ", os.getcwd()) fails if the current working directory is not ASCII whereas sys.stdout encoding is ASCII. ........ r81361 | victor.stinner | 2010-05-19 19:15:50 +0200 (mer., 19 mai 2010) | 2 lines Oops, add the new test_log.py for distutils test suite (missing part of r81359) ........ git-svn-id: http://svn.python.org/projects/python/branches/release31-maint@81363 6015fed2-1504-0410-9fe1-9d1591cc4771 --- Lib/distutils/log.py | 4 ++++ Lib/distutils/tests/test_log.py | 36 ++++++++++++++++++++++++++++++++++++ Lib/test/regrtest.py | 3 ++- Misc/NEWS | 4 ++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Lib/distutils/tests/test_log.py diff --git a/Lib/distutils/log.py b/Lib/distutils/log.py index 758857081c..b301a8338c 100644 --- a/Lib/distutils/log.py +++ b/Lib/distutils/log.py @@ -27,6 +27,10 @@ class Log: stream = sys.stderr else: stream = sys.stdout + if stream.errors == 'strict': + # emulate backslashreplace error handler + encoding = stream.encoding + msg = msg.encode(encoding, "backslashreplace").decode(encoding) stream.write('%s\n' % msg) stream.flush() diff --git a/Lib/distutils/tests/test_log.py b/Lib/distutils/tests/test_log.py new file mode 100644 index 0000000000..d35de3456c --- /dev/null +++ b/Lib/distutils/tests/test_log.py @@ -0,0 +1,36 @@ +"""Tests for distutils.log""" + +import sys +import unittest +from tempfile import NamedTemporaryFile + +from distutils import log + +class TestLog(unittest.TestCase): + def test_non_ascii(self): + # Issue #8663: test that non-ASCII text is escaped with + # backslashreplace error handler (stream use ASCII encoding and strict + # error handler) + old_stdout = sys.stdout + old_stderr = sys.stderr + try: + log.set_threshold(log.DEBUG) + with NamedTemporaryFile(mode="w+", encoding='ascii') as stdout, \ + NamedTemporaryFile(mode="w+", encoding='ascii') as stderr: + sys.stdout = stdout + sys.stderr = stderr + log.debug("debug:\xe9") + log.fatal("fatal:\xe9") + stdout.seek(0) + self.assertEquals(stdout.read().rstrip(), "debug:\\xe9") + stderr.seek(0) + self.assertEquals(stderr.read().rstrip(), "fatal:\\xe9") + finally: + sys.stdout = old_stdout + sys.stderr = old_stderr + +def test_suite(): + return unittest.makeSuite(TestLog) + +if __name__ == "__main__": + unittest.main(defaultTest="test_suite") diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 30792c2f66..c2c44e5c84 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -215,6 +215,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, on the command line. """ + replace_stdout() + support.record_original_stdout(sys.stdout) try: opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsSrf:lu:t:TD:NLR:wM:n', @@ -411,7 +413,6 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, support.verbose = verbose # Tell tests to be moderately quiet support.use_resources = use_resources save_modules = sys.modules.keys() - replace_stdout() for test in tests: if not quiet: print(test) diff --git a/Misc/NEWS b/Misc/NEWS index 56684d409e..d7db9a26c2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,10 @@ Core and Builtins Library ------- +- Issue #8663: distutils.log emulates backslashreplace error handler. Fix + compilation in a non-ASCII directory if stdout encoding is ASCII (eg. if + stdout is not a TTY). + - Issue #8688: Distutils now recalculates MANIFEST everytime. - Issue #5099: subprocess.Popen.__del__ no longer references global objects -- 2.11.4.GIT