patman: Move unicode helpers to tools
authorSimon Glass <sjg@chromium.org>
Tue, 14 May 2019 21:53:50 +0000 (15:53 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 10 Jul 2019 22:52:58 +0000 (16:52 -0600)
Create helper functions in the tools module to deal with the differences
between unicode in Python 2 (where we use the 'unicode' type) and Python 3
(where we use the 'str' type).

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/patman/gitutil.py
tools/patman/series.py
tools/patman/settings.py
tools/patman/tools.py

index 11aeb73b74c20c18fea455be1a17c856d69f0164..fb9e67c0f0d7225ca4e33c6b531ab55a979f0ecd 100644 (file)
@@ -12,6 +12,7 @@ import terminal
 
 import checkpatch
 import settings
+import tools
 
 # True to use --no-decorate - we check this in Setup()
 use_no_decorate = True
@@ -325,9 +326,8 @@ def BuildEmailList(in_list, tag=None, alias=None, raise_on_error=True):
         raw += LookupEmail(item, alias, raise_on_error=raise_on_error)
     result = []
     for item in raw:
+        item = tools.FromUnicode(item)
         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]
index 2735afaf88feab0eb3e4546dac7912f088fe37bc..0b71a896cb233d4d688fa280ab9e27ebc0114770 100644 (file)
@@ -11,6 +11,7 @@ import get_maintainer
 import gitutil
 import settings
 import terminal
+import tools
 
 # Series-xxx tags that we understand
 valid_series = ['to', 'cc', 'version', 'changes', 'prefix', 'notes', 'name',
@@ -249,7 +250,7 @@ class Series(dict):
             cover_cc = gitutil.BuildEmailList(self.get('cover_cc', ''))
             cover_cc = [m.encode('utf-8') if type(m) != str else m
                         for m in cover_cc]
-            cc_list = ', '.join([x.decode('utf-8')
+            cc_list = ', '.join([tools.ToUnicode(x)
                                  for x in set(cover_cc + all_ccs)])
             print(cover_fname, cc_list.encode('utf-8'), file=fd)
 
index 07bf6a6ea4dda04f450ec609e1b7705aabd60027..b080136d882d7ee1131d449f9f144ecbdf3567e9 100644 (file)
@@ -14,6 +14,7 @@ import re
 
 import command
 import gitutil
+import tools
 
 """Default settings per-project.
 
@@ -99,17 +100,6 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser):
         for setting_name, setting_value in project_defaults.items():
             self.set(project_settings, setting_name, setting_value)
 
-    def _to_unicode(self, val):
-        """Make sure a value is of type 'unicode'
-
-        Args:
-            val: string or unicode object
-
-        Returns:
-            unicode version of val
-        """
-        return val if isinstance(val, unicode) else val.decode('utf-8')
-
     def get(self, section, option, *args, **kwargs):
         """Extend SafeConfigParser to try project_section before section.
 
@@ -127,7 +117,7 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser):
             val = ConfigParser.SafeConfigParser.get(
                 self, section, option, *args, **kwargs
             )
-        return self._to_unicode(val)
+        return tools.ToUnicode(val)
 
     def items(self, section, *args, **kwargs):
         """Extend SafeConfigParser to add project_section to section.
@@ -162,7 +152,7 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser):
 
         item_dict = dict(top_items)
         item_dict.update(project_items)
-        return {(self._to_unicode(item), self._to_unicode(val))
+        return {(tools.ToUnicode(item), tools.ToUnicode(val))
                 for item, val in item_dict.items()}
 
 def ReadGitAliases(fname):
index 0ad0fb9705d647a7b7ad67844aea623acab4e84c..7e6a45a3b0767f1fb2d5b4e526e2bdbffd4ce0dd 100644 (file)
@@ -258,3 +258,35 @@ def GetBytes(byte, size):
     else:
         data = chr(byte) * size
     return data
+
+def ToUnicode(val):
+    """Make sure a value is a unicode string
+
+    This allows some amount of compatibility between Python 2 and Python3. For
+    the former, it returns a unicode object.
+
+    Args:
+        val: string or unicode object
+
+    Returns:
+        unicode version of val
+    """
+    if sys.version_info[0] >= 3:
+        return val
+    return val if isinstance(val, unicode) else val.decode('utf-8')
+
+def FromUnicode(val):
+    """Make sure a value is a non-unicode string
+
+    This allows some amount of compatibility between Python 2 and Python3. For
+    the former, it converts a unicode object to a string.
+
+    Args:
+        val: string or unicode object
+
+    Returns:
+        non-unicode version of val
+    """
+    if sys.version_info[0] >= 3:
+        return val
+    return val if isinstance(val, str) else val.encode('utf-8')