[U-Boot] [PATCH 01/11] patman: Update cros_subprocess to use bytearray

Simon Glass sjg at chromium.org
Sat May 11 19:23:46 UTC 2019


At present this function uses lists and strings. This does not work so
well with Python 3, and testing against '' does not work for a bytearray.
Update the code to fix these issues.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 tools/patman/cros_subprocess.py | 33 +++++++++++++++++++++------------
 tools/patman/gitutil.py         |  2 ++
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/tools/patman/cros_subprocess.py b/tools/patman/cros_subprocess.py
index ebd4300dfd..cd19150ee6 100644
--- a/tools/patman/cros_subprocess.py
+++ b/tools/patman/cros_subprocess.py
@@ -156,11 +156,11 @@ class Popen(subprocess.Popen):
                 self.stdin.close()
         if self.stdout:
             read_set.append(self.stdout)
-            stdout = []
+            stdout = bytearray()
         if self.stderr and self.stderr != self.stdout:
             read_set.append(self.stderr)
-            stderr = []
-        combined = []
+            stderr = bytearray()
+        combined = bytearray()
 
         input_offset = 0
         while read_set or write_set:
@@ -192,12 +192,12 @@ class Popen(subprocess.Popen):
                     data = os.read(self.stdout.fileno(), 1024)
                 except OSError:
                     pass
-                if data == "":
+                if not len(data):
                     self.stdout.close()
                     read_set.remove(self.stdout)
                 else:
-                    stdout.append(data)
-                    combined.append(data)
+                    stdout += data
+                    combined += data
                     if output:
                         output(sys.stdout, data)
             if self.stderr in rlist:
@@ -207,25 +207,34 @@ class Popen(subprocess.Popen):
                     data = os.read(self.stderr.fileno(), 1024)
                 except OSError:
                     pass
-                if data == "":
+                if not len(data):
                     self.stderr.close()
                     read_set.remove(self.stderr)
                 else:
-                    stderr.append(data)
-                    combined.append(data)
+                    stderr += data
+                    combined += data
                     if output:
                         output(sys.stderr, data)
 
         # All data exchanged.    Translate lists into strings.
         if stdout is not None:
-            stdout = ''.join(stdout)
+            try:
+                stdout = stdout.decode('utf-8')
+            except UnicodeDecodeError:
+                stdout = stdout.decode('utf-8', 'ignore')
         else:
             stdout = ''
         if stderr is not None:
-            stderr = ''.join(stderr)
+            try:
+                stderr = stderr.decode('utf-8')
+            except UnicodeDecodeError:
+                stderr = stderr.decode('utf-8', 'ignore')
         else:
             stderr = ''
-        combined = ''.join(combined)
+        try:
+            combined = combined.decode('utf-8')
+        except UnicodeDecodeError:
+            combined = combined.decode('utf-8', 'ignore')
 
         # Translate newlines, if requested.    We cannot let the file
         # object do the translation: It is based on stdio, which is
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py
index 9905bb0bbd..7650b51bd5 100644
--- a/tools/patman/gitutil.py
+++ b/tools/patman/gitutil.py
@@ -326,6 +326,8 @@ def BuildEmailList(in_list, tag=None, alias=None, raise_on_error=True):
     result = []
     for item in raw:
         if not item in result:
+            if type(item) == unicode:
+                item = item.encode('utf-8')
             result.append(item)
     if tag:
         return ['%s %s%s%s' % (tag, quote, email, quote) for email in result]
-- 
2.21.0.1020.gf2820cf01a-goog



More information about the U-Boot mailing list