changeset 31448:6419cd243017

encoding: add converter between native str and byte string This kind of encoding conversion is unavoidable on Python 3.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 13 Mar 2017 09:12:56 -0700
parents 067add650129
children 756175623f2e
files mercurial/encoding.py mercurial/extensions.py mercurial/util.py tests/test-check-code.t
diffstat 4 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/encoding.py	Mon Mar 13 09:11:08 2017 -0700
+++ b/mercurial/encoding.py	Mon Mar 13 09:12:56 2017 -0700
@@ -204,6 +204,16 @@
     """Convert a byte string of local encoding to a unicode string"""
     return fromlocal(s).decode('utf-8')
 
+# converter functions between native str and byte string. use these if the
+# character encoding is not aware (e.g. exception message) or is known to
+# be locale dependent (e.g. date formatting.)
+if pycompat.ispy3:
+    strtolocal = unitolocal
+    strfromlocal = unifromlocal
+else:
+    strtolocal = str
+    strfromlocal = str
+
 if not _nativeenviron:
     # now encoding and helper functions are available, recreate the environ
     # dict to be exported to other modules
--- a/mercurial/extensions.py	Mon Mar 13 09:11:08 2017 -0700
+++ b/mercurial/extensions.py	Mon Mar 13 09:12:56 2017 -0700
@@ -108,9 +108,7 @@
 def _forbytes(inst):
     """Portably format an import error into a form suitable for
     %-formatting into bytestrings."""
-    if pycompat.ispy3:
-        return encoding.unitolocal(str(inst))
-    return inst
+    return encoding.strtolocal(str(inst))
 
 def _reportimporterror(ui, err, failed, next):
     # note: this ui.debug happens before --debug is processed,
--- a/mercurial/util.py	Mon Mar 13 09:11:08 2017 -0700
+++ b/mercurial/util.py	Mon Mar 13 09:12:56 2017 -0700
@@ -2653,9 +2653,7 @@
         >>> print url(r'file:///D:\data\hg')
         file:///D:\data\hg
         """
-        if pycompat.ispy3:
-            return encoding.unifromlocal(self.__bytes__())
-        return self.__bytes__()
+        return encoding.strfromlocal(self.__bytes__())
 
     def __bytes__(self):
         if self._localpath:
--- a/tests/test-check-code.t	Mon Mar 13 09:11:08 2017 -0700
+++ b/tests/test-check-code.t	Mon Mar 13 09:12:56 2017 -0700
@@ -22,7 +22,7 @@
   mercurial/encoding.py:61:
    >                    for k, v in os.environ.items())
    use encoding.environ instead (py3)
-  mercurial/encoding.py:211:
+  mercurial/encoding.py:221:
    >                    for k, v in os.environ.items())
    use encoding.environ instead (py3)
   Skipping mercurial/httpclient/__init__.py it has no-che?k-code (glob)