D3954: mail: cope with Py3 unicode antics on email addresses

Yuya Nishihara yuya at tcha.org
Sat Aug 11 21:54:27 EDT 2018


>  def _addressencode(ui, name, addr, charsets=None):
>      name = headencode(ui, name, charsets)
>      try:
> -        acc, dom = addr.split('@')
> +        acc, dom = addr.split(r'@')

I think `addr` here should be a byte string since `dom` is decoded to unicode,
and `addr` is embedded in abort message.

>          acc = acc.encode('ascii')
>          dom = dom.decode(encoding.encoding).encode('idna')
>          addr = '%s@%s' % (acc, dom)
> @@ -311,27 +311,31 @@
>              addr = addr.encode('ascii')
>          except UnicodeDecodeError:
>              raise error.Abort(_('invalid local address: %s') % addr)
> -    return email.utils.formataddr((name, addr))
> +    return pycompat.bytesurl(
> +        email.utils.formataddr((name, encoding.strfromlocal(addr))))

>      result = []
> -    for name, addr in email.utils.getaddresses(addrs):
> +    for name, addr in email.utils.getaddresses(
> +            [encoding.strfromlocal(a) for a in addrs]):
>          if name or addr:
>              result.append(_addressencode(ui, name, addr, charsets))
> -    return result
> +    return [pycompat.bytesurl(r) for r in result]

_addressencode() retunrs bytes.


More information about the Mercurial-devel mailing list