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