py3: use email parser that operates on bytes
email.parser.Parser() operates on str in both Python 2 and 3.
Python 3.2 introduced the email.parser.BytesParser(), which works
like Parser except it accepts bytes.
We implement the pycompat helper as a function so we lazily
import the "email" module.
Differential Revision: https://phab.mercurial-scm.org/D2147
--- a/mercurial/patch.py Sun Feb 11 13:32:18 2018 -0800
+++ b/mercurial/patch.py Sun Feb 11 14:17:23 2018 -0800
@@ -12,7 +12,6 @@
import copy
import difflib
import email
-import email.parser as emailparser
import errno
import hashlib
import os
@@ -109,7 +108,7 @@
cur.append(line)
c = chunk(cur)
- m = emailparser.Parser().parse(c)
+ m = pycompat.emailparser().parse(c)
if not m.is_multipart():
yield msgfp(m)
else:
@@ -218,7 +217,7 @@
fd, tmpname = tempfile.mkstemp(prefix='hg-patch-')
tmpfp = os.fdopen(fd, pycompat.sysstr('w'))
try:
- msg = emailparser.Parser().parse(fileobj)
+ msg = pycompat.emailparser().parse(fileobj)
subject = msg['Subject'] and mail.headdecode(msg['Subject'])
data['user'] = msg['From'] and mail.headdecode(msg['From'])
--- a/mercurial/pycompat.py Sun Feb 11 13:32:18 2018 -0800
+++ b/mercurial/pycompat.py Sun Feb 11 14:17:23 2018 -0800
@@ -267,6 +267,10 @@
ret = shlex.split(s.decode('latin-1'))
return [a.encode('latin-1') for a in ret]
+ def emailparser(*args, **kwargs):
+ import email.parser
+ return email.parser.BytesParser(*args, **kwargs)
+
else:
import cStringIO
@@ -327,6 +331,10 @@
ziplist = zip
rawinput = raw_input
+ def emailparser(*args, **kwargs):
+ import email.parser
+ return email.parser.Parser(*args, **kwargs)
+
isjython = sysplatform.startswith('java')
isdarwin = sysplatform == 'darwin'