changeset 15562:a82b6038ff08

mail: use quoted-printable for mime encoding to avoid too long lines (issue3075) Quoted-printable was already used for the more critical patch mails, so it should be fine for everything else as well.
author Mads Kiilerich <mads@kiilerich.com>
date Wed, 23 Nov 2011 02:44:11 +0100
parents ca572e94d8e7
children 7786b7dfbc46
files mercurial/mail.py tests/test-notify.t
diffstat 2 files changed, 33 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/mail.py	Wed Nov 23 02:36:33 2011 +0100
+++ b/mercurial/mail.py	Wed Nov 23 02:44:11 2011 +0100
@@ -131,14 +131,9 @@
                                'but not in PATH') % method)
 
 def mimetextpatch(s, subtype='plain', display=False):
-    '''If patch in utf-8 transfer-encode it.'''
-
-    enc = None
-    for line in s.splitlines():
-        if len(line) > 950:
-            s = quopri.encodestring(s)
-            enc = "quoted-printable"
-            break
+    '''Return MIME message suitable for a patch.
+    Charset will be detected as utf-8 or (possibly fake) us-ascii.
+    Transfer encodings will be used if necessary.'''
 
     cs = 'us-ascii'
     if not display:
@@ -152,7 +147,20 @@
                 # We'll go with us-ascii as a fallback.
                 pass
 
-    msg = email.MIMEText.MIMEText(s, subtype, cs)
+    return mimetextqp(s, subtype, cs)
+
+def mimetextqp(body, subtype, charset):
+    '''Return MIME message.
+    Qouted-printable transfer encoding will be used if necessary.
+    '''
+    enc = None
+    for line in body.splitlines():
+        if len(line) > 950:
+            body = quopri.encodestring(body)
+            enc = "quoted-printable"
+            break
+
+    msg = email.MIMEText.MIMEText(body, subtype, charset)
     if enc:
         del msg['Content-Transfer-Encoding']
         msg['Content-Transfer-Encoding'] = enc
@@ -244,4 +252,4 @@
     cs = 'us-ascii'
     if not display:
         s, cs = _encode(ui, s, charsets)
-    return email.MIMEText.MIMEText(s, 'plain', cs)
+    return mimetextqp(s, 'plain', cs)
--- a/tests/test-notify.t	Wed Nov 23 02:36:33 2011 +0100
+++ b/tests/test-notify.t	Wed Nov 23 02:44:11 2011 +0100
@@ -422,7 +422,7 @@
   From test@test.com ... ... .. ..:..:.. .... (re)
   Content-Type: text/plain; charset="us-ascii"
   MIME-Version: 1.0
-  Content-Transfer-Encoding: 7bit
+  Content-Transfer-Encoding: quoted-printable
   X-Test: foo
   Date: * (glob)
   Subject: long line
@@ -447,5 +447,18 @@
    a
    a
    a
-  +nononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononononono
+  +nonononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nononononononononononononononononononononononononononononononononononononon=
+  ononononononononononononononononononononononononononononononononononononono=
+  nonononononononononononono