py3: use email parser that operates on bytes
authorGregory Szorc <gregory.szorc@gmail.com>
Sun, 11 Feb 2018 14:17:23 -0800
changeset 36083 04984f2e50ae
parent 36082 3b4d14beac3d
child 36084 a5cf79755eff
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
mercurial/patch.py
mercurial/pycompat.py
--- 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'