diff -r 0a1eefaf98f2 -r e3bf16703e26 mercurial/util.py --- a/mercurial/util.py Fri Dec 31 15:14:51 2010 +0100 +++ b/mercurial/util.py Sat Dec 25 21:59:00 2010 +0900 @@ -1242,12 +1242,23 @@ r = None return author[author.find('<') + 1:r] +def _ellipsis(text, maxlength): + if len(text) <= maxlength: + return text, False + else: + return "%s..." % (text[:maxlength - 3]), True + def ellipsis(text, maxlength=400): """Trim string to at most maxlength (default: 400) characters.""" - if len(text) <= maxlength: - return text - else: - return "%s..." % (text[:maxlength - 3]) + try: + # use unicode not to split at intermediate multi-byte sequence + utext, truncated = _ellipsis(text.decode(encoding.encoding), + maxlength) + if not truncated: + return text + return utext.encode(encoding.encoding) + except (UnicodeDecodeError, UnicodeEncodeError): + return _ellipsis(text, maxlength)[0] def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): '''yield every hg repository under path, recursively.'''