aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandr Mezin <mezin.alexander@gmail.com>2021-03-06 12:03:42 +0600
committerJussi Pakkanen <jpakkane@gmail.com>2021-03-30 18:47:09 +0300
commit692f6733122b2bf053299f8a0cdbcab3d5bfbfb5 (patch)
tree3d554fd08b040e33d657e3947ec4c8254b7157cb
parentd1628b8bed5d88318e757d7bfe17bceb0e3be230 (diff)
downloadmeson-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.py6
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: