encoding: add converter between native str and byte string
This kind of encoding conversion is unavoidable on Python 3.
--- 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)