[rtems-tools commit] rtemstoolkit: Fix decoding unicode strings in output

Chris Johns chrisj at rtems.org
Mon Apr 22 06:42:29 UTC 2024


Module:    rtems-tools
Branch:    master
Commit:    b9d32b3bb5ad68ea0ac98f02273b07ab6b4a520c
Changeset: http://git.rtems.org/rtems-tools/commit/?id=b9d32b3bb5ad68ea0ac98f02273b07ab6b4a520c

Author:    Chris Johns <chrisj at rtems.org>
Date:      Fri Apr 19 11:12:09 2024 +1000

rtemstoolkit: Fix decoding unicode strings in output

---

 rtemstoolkit/execute.py | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
index 31d3a8a..c7d8134 100755
--- a/rtemstoolkit/execute.py
+++ b/rtemstoolkit/execute.py
@@ -37,6 +37,7 @@
 from __future__ import print_function
 
 import functools
+import codecs
 import io
 import os
 import re
@@ -203,6 +204,10 @@ class execute(object):
                     stacktraces.trace()
             if trace_threads:
                 print('execute:_readthread: start')
+            if sys.stdout.encoding is not None:
+                decoder = codecs.getincrementaldecoder(sys.stdout.encoding)()
+            else:
+                decoder = None
             count = 0
             line = ''
             try:
@@ -222,8 +227,8 @@ class execute(object):
                             _output_line(line + '\n', exe, prefix, out, count)
                         break
                     # str and bytes are the same type in Python2
-                    if type(data) is not str and type(data) is bytes:
-                        data = data.decode(sys.stdout.encoding)
+                    if decoder is not None and type(data) is not str and type(data) is bytes:
+                        data = decoder.decode(data)
                     last_ch = data[-1]
                     sd = (line + data).split('\n')
                     if last_ch != '\n':
@@ -382,6 +387,9 @@ class execute(object):
         if self.verbose:
             log.output(what + ': ' + cs)
         log.trace('exe: %s' % (cs))
+        if shell and self.shell_exe:
+            command = arg_list(command)
+            command[:0] = self.shell_exe
         if not stdin and self.input:
             stdin = subprocess.PIPE
         if not stdout:



More information about the vc mailing list