[PATCH] patch: decode e-mail headers

funman at videolan.org funman at videolan.org
Tue Oct 22 12:18:00 UTC 2013


# HG changeset patch
# User Rafaël Carré <funman at videolan.org>
# Date 1382444275 -7200
#      Tue Oct 22 14:17:55 2013 +0200
# Branch stable
# Node ID e8c0f97e42ca9e09b4000245bd713f03e5d72038
# Parent  2c886dedd9021598b6290d95ea0f068731ea4e2b
patch: decode e-mail headers

    Change commits from:
user:        =?UTF-8?q?Rafa=C3=ABl=20Carr=C3=A9?= <funman at videolan.org>
    to:
user:        Rafaël Carré <funman at videolan.org>

diff -r 2c886dedd902 -r e8c0f97e42ca mercurial/patch.py
--- a/mercurial/patch.py	Mon Oct 21 10:50:58 2013 -0700
+++ b/mercurial/patch.py	Tue Oct 22 14:17:55 2013 +0200
@@ -12,6 +12,7 @@
 # load. This was not a problem on Python 2.7.
 import email.Generator
 import email.Parser
+from email.header import decode_header
 
 from i18n import _
 from node import hex, short
@@ -162,6 +163,25 @@
     Any item in the returned tuple can be None. If filename is None,
     fileobj did not contain a patch. Caller must unlink filename when done.'''
 
+    def header_decode(h):
+        '''Decode ?=UTF-8? from e-mail headers.'''
+        if h is None:
+            return None
+        res = ''
+        pairs = decode_header(h)
+        if pairs is None:
+            return None
+        n = len(pairs)
+        pair = 0
+        for p in pairs:
+            pair += 1
+            if p[1] == 'utf-8' or p[1] is None:
+                res += p[0]
+                if pair < n:
+                    res += ' '
+
+        return res
+
     # attempt to detect the start of a patch
     # (this heuristic is borrowed from quilt)
     diffre = re.compile(r'^(?:Index:[ \t]|diff[ \t]|RCS file: |'
@@ -174,8 +194,8 @@
     try:
         msg = email.Parser.Parser().parse(fileobj)
 
-        subject = msg['Subject']
-        user = msg['From']
+        subject = header_decode(msg['Subject'])
+        user = header_decode(msg['From'])
         if not subject and not user:
             # Not an email, restore parsed headers if any
             subject = '\n'.join(': '.join(h) for h in msg.items()) + '\n'


More information about the Mercurial-devel mailing list