comparison mercurial/mail.py @ 43576:14b96072797d

mail: let addressencode() / addrlistencode() return native strings Avoids conversion to "str" on py3.
author Denis Laxalde <denis@laxalde.org>
date Sat, 09 Nov 2019 15:16:52 +0100
parents 67b4439c09b2
children 599e25add437
comparison
equal deleted inserted replaced
43575:67b4439c09b2 43576:14b96072797d
383 try: 383 try:
384 # too strict? 384 # too strict?
385 addr.decode('ascii') 385 addr.decode('ascii')
386 except UnicodeDecodeError: 386 except UnicodeDecodeError:
387 raise error.Abort(_(b'invalid local address: %s') % addr) 387 raise error.Abort(_(b'invalid local address: %s') % addr)
388 return pycompat.bytesurl( 388 return email.utils.formataddr((name, encoding.strfromlocal(addr)))
389 email.utils.formataddr((name, encoding.strfromlocal(addr)))
390 )
391 389
392 390
393 def addressencode(ui, address, charsets=None, display=False): 391 def addressencode(ui, address, charsets=None, display=False):
394 '''Turns address into RFC-2047 compliant header.''' 392 '''Turns address into RFC-2047 compliant header.'''
395 if display or not address: 393 if display or not address:
396 return address or b'' 394 return encoding.strfromlocal(address or b'')
397 name, addr = email.utils.parseaddr(encoding.strfromlocal(address)) 395 name, addr = email.utils.parseaddr(encoding.strfromlocal(address))
398 return _addressencode(ui, name, encoding.strtolocal(addr), charsets) 396 return _addressencode(ui, name, encoding.strtolocal(addr), charsets)
399 397
400 398
401 def addrlistencode(ui, addrs, charsets=None, display=False): 399 def addrlistencode(ui, addrs, charsets=None, display=False):
403 A single element of input list may contain multiple addresses, but output 401 A single element of input list may contain multiple addresses, but output
404 always has one address per item''' 402 always has one address per item'''
405 for a in addrs: 403 for a in addrs:
406 assert isinstance(a, bytes), '%r unexpectedly not a bytestr' % a 404 assert isinstance(a, bytes), '%r unexpectedly not a bytestr' % a
407 if display: 405 if display:
408 return [a.strip() for a in addrs if a.strip()] 406 return [encoding.strfromlocal(a.strip()) for a in addrs if a.strip()]
409 407
410 result = [] 408 result = []
411 for name, addr in email.utils.getaddresses( 409 for name, addr in email.utils.getaddresses(
412 [encoding.strfromlocal(a) for a in addrs] 410 [encoding.strfromlocal(a) for a in addrs]
413 ): 411 ):