ui: use bytes IO and convert EOL manually in ui.editor()
authorYuya Nishihara <yuya@tcha.org>
Wed, 29 Mar 2017 21:43:38 +0900
changeset 31778 ac69675fff1c
parent 31777 6a5b69b0abec
child 31779 fd687ec5a643
ui: use bytes IO and convert EOL manually in ui.editor() Text IO sucks on Python 3 as it must be a unicode stream. We could introduce a wrapper that converts unicode back to bytes, but it wouldn't be simple to handle offsets transparently from/to underlying IOBase API. Fortunately, we don't need to process huge text files, so let's stick to bytes IO and convert EOL in memory.
mercurial/ui.py
--- a/mercurial/ui.py	Wed Mar 29 21:40:15 2017 +0900
+++ b/mercurial/ui.py	Wed Mar 29 21:43:38 2017 +0900
@@ -1232,11 +1232,11 @@
         if self.configbool('experimental', 'editortmpinhg'):
             rdir = repopath
         (fd, name) = tempfile.mkstemp(prefix='hg-' + extra['prefix'] + '-',
-                                      suffix=extra['suffix'], text=True,
+                                      suffix=extra['suffix'],
                                       dir=rdir)
         try:
-            f = os.fdopen(fd, pycompat.sysstr("w"))
-            f.write(encoding.strfromlocal(text))
+            f = os.fdopen(fd, r'wb')
+            f.write(util.tonativeeol(text))
             f.close()
 
             environ = {'HGUSER': user}
@@ -1258,8 +1258,8 @@
                         onerr=error.Abort, errprefix=_("edit failed"),
                         blockedtag='editor')
 
-            f = open(name)
-            t = encoding.strtolocal(f.read())
+            f = open(name, r'rb')
+            t = util.fromnativeeol(f.read())
             f.close()
         finally:
             os.unlink(name)