diff mercurial/util.py @ 15065:24a6c3f903bb stable

util: wrap lines with multi-byte characters correctly (issue2943) This re-introduces the unicode conversion what was lost in d320e70442a5 5 years ago and had the comment: To avoid corrupting multi-byte characters in line, we must wrap a Unicode string instead of a bytestring.
author Mads Kiilerich <mads@kiilerich.com>
date Sat, 06 Aug 2011 23:52:20 +0200
parents 0f1311e829c9
children 24efa83d81cb
line wrap: on
line diff
--- a/mercurial/util.py	Mon Jul 25 15:19:43 2011 -0500
+++ b/mercurial/util.py	Sat Aug 06 23:52:20 2011 +0200
@@ -1148,16 +1148,14 @@
         def __init__(self, **kwargs):
             textwrap.TextWrapper.__init__(self, **kwargs)
 
-        def _cutdown(self, str, space_left):
+        def _cutdown(self, ucstr, space_left):
             l = 0
-            ucstr = unicode(str, encoding.encoding)
             colwidth = unicodedata.east_asian_width
             for i in xrange(len(ucstr)):
                 l += colwidth(ucstr[i]) in 'WFA' and 2 or 1
                 if space_left < l:
-                    return (ucstr[:i].encode(encoding.encoding),
-                            ucstr[i:].encode(encoding.encoding))
-            return str, ''
+                    return (ucstr[:i], ucstr[i:])
+            return ucstr, ''
 
         # overriding of base class
         def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):
@@ -1179,10 +1177,13 @@
     if width <= maxindent:
         # adjust for weird terminal size
         width = max(78, maxindent + 1)
+    line = line.decode(encoding.encoding, encoding.encodingmode)
+    initindent = initindent.decode(encoding.encoding, encoding.encodingmode)
+    hangindent = hangindent.decode(encoding.encoding, encoding.encodingmode)
     wrapper = MBTextWrapper(width=width,
                             initial_indent=initindent,
                             subsequent_indent=hangindent)
-    return wrapper.fill(line)
+    return wrapper.fill(line).encode(encoding.encoding)
 
 def iterlines(iterator):
     for chunk in iterator: