Mercurial > hg-stable
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: