diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-12-09 00:01:27 +0100 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-12-09 00:01:27 +0100 |
commit | 620c48b7ea7a1ad3af23725afdac1e6a2b3e6cef (patch) | |
tree | 4fbac6f2150c5a62345aca7a52c4c121914935c3 /Lib | |
parent | 589ecda56eb23937ba871734598cda8f11395389 (diff) | |
download | cpython-git-620c48b7ea7a1ad3af23725afdac1e6a2b3e6cef.tar.gz |
Issue #17429: platform.linux_distribution() now decodes files from the UTF-8
encoding with the surrogateescape error handler, instead of decoding from the
locale encoding in strict mode. It fixes the function on Fedora 19 which is
probably the first major distribution release with a non-ASCII name. Patch
written by Toshio Kuratomi.
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/platform.py | 9 | ||||
-rw-r--r-- | Lib/test/test_platform.py | 16 |
2 files changed, 23 insertions, 2 deletions
diff --git a/Lib/platform.py b/Lib/platform.py index ec5df85d6f..030ef2a3a4 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -129,6 +129,10 @@ except AttributeError: # Standard Unix uses /dev/null DEV_NULL = '/dev/null' +# Directory to search for configuration information on Unix. +# Constant used by test_platform to test linux_distribution(). +_UNIXCONFDIR = '/etc' + ### Platform specific APIs _libc_search = re.compile(b'(__libc_init)' @@ -315,7 +319,7 @@ def linux_distribution(distname='', version='', id='', """ try: - etc = os.listdir('/etc') + etc = os.listdir(_UNIXCONFDIR) except os.error: # Probably not a Unix system return distname,version,id @@ -331,7 +335,8 @@ def linux_distribution(distname='', version='', id='', return _dist_try_harder(distname,version,id) # Read the first line - with open('/etc/'+file, 'r') as f: + with open(os.path.join(_UNIXCONFDIR, file), 'r', + encoding='utf-8', errors='surrogateescape') as f: firstline = f.readline() _distname, _version, _id = _parse_release_file(firstline) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 0dcfe0504a..8a5408e9a9 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -1,7 +1,10 @@ +from unittest import mock +import contextlib import os import platform import subprocess import sys +import tempfile import unittest import warnings @@ -295,6 +298,19 @@ class PlatformTest(unittest.TestCase): returncode = ret >> 8 self.assertEqual(returncode, len(data)) + def test_linux_distribution_encoding(self): + # Issue #17429 + with tempfile.TemporaryDirectory() as tempdir: + filename = os.path.join(tempdir, 'fedora-release') + with open(filename, 'w', encoding='utf-8') as f: + f.write('Fedora release 19 (Schr\xf6dinger\u2019s Cat)\n') + + with mock.patch('platform._UNIXCONFDIR', tempdir): + distname, version, distid = platform.linux_distribution() + + self.assertEqual(distname, 'Fedora') + self.assertEqual(version, '19') + self.assertEqual(distid, 'Schr\xf6dinger\u2019s Cat') def test_main(): support.run_unittest( |