diff options
author | Aleksandr Mezin <mezin.alexander@gmail.com> | 2021-03-06 12:03:42 +0600 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2021-03-30 18:47:09 +0300 |
commit | 692f6733122b2bf053299f8a0cdbcab3d5bfbfb5 (patch) | |
tree | 3d554fd08b040e33d657e3947ec4c8254b7157cb | |
parent | d1628b8bed5d88318e757d7bfe17bceb0e3be230 (diff) | |
download | meson-692f6733122b2bf053299f8a0cdbcab3d5bfbfb5.zip meson-692f6733122b2bf053299f8a0cdbcab3d5bfbfb5.tar.gz meson-692f6733122b2bf053299f8a0cdbcab3d5bfbfb5.tar.bz2 |
scripts/meson_exe: fix stdout and stderr decoding
1. use `locale.getpreferredencoding()` to get encoding name.
`bytes.decode()` assumes `encoding='utf-8'` by default. It is incorrect on my
Windows setup, and causes `UnicodeDecodeError`.
2. use `errors='replace'`.
`bytes.decode()` assumes `errors='strict'` by default. Meson shouldn't crash
if subprocess outputs some garbage that can't be decoded.
`surrogateescape` doesn't work as expected on Windows. On Linux, default
`errors` for `sys.stdout` is `strict`, so `surrogateescape` can't be used there
too (at least until `sys.stdout` is reconfigured).
Fixes https://github.com/mesonbuild/meson/issues/8480
-rw-r--r-- | mesonbuild/scripts/meson_exe.py | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/mesonbuild/scripts/meson_exe.py b/mesonbuild/scripts/meson_exe.py index ceb9e43..ea0fef6 100644 --- a/mesonbuild/scripts/meson_exe.py +++ b/mesonbuild/scripts/meson_exe.py @@ -18,6 +18,7 @@ import argparse import pickle import subprocess import typing as T +import locale from .. import mesonlib from ..backend.backends import ExecutableSerialisation @@ -70,11 +71,12 @@ def run_exe(exe: ExecutableSerialisation, extra_env: T.Optional[dict] = None) -> print(f'while executing {cmd_args!r}') if exe.verbose: return p.returncode + encoding = locale.getpreferredencoding() if not exe.capture: print('--- stdout ---') - print(stdout.decode()) + print(stdout.decode(encoding=encoding, errors='replace')) print('--- stderr ---') - print(stderr.decode()) + print(stderr.decode(encoding=encoding, errors='replace')) return p.returncode if exe.capture: |