1240 r = author.find('>') |
1240 r = author.find('>') |
1241 if r == -1: |
1241 if r == -1: |
1242 r = None |
1242 r = None |
1243 return author[author.find('<') + 1:r] |
1243 return author[author.find('<') + 1:r] |
1244 |
1244 |
|
1245 def _ellipsis(text, maxlength): |
|
1246 if len(text) <= maxlength: |
|
1247 return text, False |
|
1248 else: |
|
1249 return "%s..." % (text[:maxlength - 3]), True |
|
1250 |
1245 def ellipsis(text, maxlength=400): |
1251 def ellipsis(text, maxlength=400): |
1246 """Trim string to at most maxlength (default: 400) characters.""" |
1252 """Trim string to at most maxlength (default: 400) characters.""" |
1247 if len(text) <= maxlength: |
1253 try: |
1248 return text |
1254 # use unicode not to split at intermediate multi-byte sequence |
1249 else: |
1255 utext, truncated = _ellipsis(text.decode(encoding.encoding), |
1250 return "%s..." % (text[:maxlength - 3]) |
1256 maxlength) |
|
1257 if not truncated: |
|
1258 return text |
|
1259 return utext.encode(encoding.encoding) |
|
1260 except (UnicodeDecodeError, UnicodeEncodeError): |
|
1261 return _ellipsis(text, maxlength)[0] |
1251 |
1262 |
1252 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): |
1263 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): |
1253 '''yield every hg repository under path, recursively.''' |
1264 '''yield every hg repository under path, recursively.''' |
1254 def errhandler(err): |
1265 def errhandler(err): |
1255 if err.filename == path: |
1266 if err.filename == path: |