[PATCH v6 1/2] parsemail: Convert to a management command

Daniel Axtens dja at axtens.net
Tue Sep 20 01:22:40 AEST 2016


So, umm, I went ahead and had a crack at this.

It turns out this is hideously difficult to get right. But this plus my
other patch to fix Thomas' problem should have things working on Py2 and
Py3 with this series.

It's a bit of a work in progress: I need to close the file at the end
of the function, the logging needs to be added again, etc.

Tests to come.

Stephen: I can do this up into a proper patch if you like or you can
fold it into your series.

Regards,
Daniel

diff --git a/patchwork/management/commands/parsemail.py b/patchwork/management/commands/parsemail.py
index a60e2ad11f06..2b957473167f 100644
--- a/patchwork/management/commands/parsemail.py
+++ b/patchwork/management/commands/parsemail.py
@@ -18,10 +18,11 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 import argparse
-from email import message_from_file
+import email
 import logging
 from optparse import make_option
 import sys
+import codecs
 
 import django
 from django.core.management import base
@@ -48,9 +49,9 @@ class Command(base.BaseCommand):
             parser.add_argument(
                 'infile',
                 nargs='?',
-                type=argparse.FileType('r'),
-                default=sys.stdin,
-                help='input mbox file (a filename or stdin)')
+                type=str,
+                default=None,
+                help='input mbox file (stdin if not provided)')
             parser.add_argument(
                 '--list-id',
                 help='mailing list ID. If not supplied, this will be '
@@ -59,17 +60,19 @@ class Command(base.BaseCommand):
     def handle(self, *args, **options):
         infile = args[0] if args else options['infile']
 
-        # Attempt to parse the path if provided, and fallback to stdin if not
-        if infile and isinstance(infile, six.string_types):  # Django < 1.8
-            logger.info('Parsing mail loaded by filename')
-            with open(infile, 'r+') as file_:
-                mail = message_from_file(file_)
+        if six.PY3:
+            if infile:
+                file_ = open(infile, 'r', encoding='utf-8', errors='replace')
+            else:
+                file_ = codecs.getreader('utf-8')(sys.stdin.buffer, errors='replace')
         else:
-            if infile == sys.stdin:
-                logger.info('Parsing mail loaded from stdin')
-            else:  # Djano >= 1.8
-                logger.info('Parsing mail loaded by filename')
-            mail = message_from_file(infile)
+            if infile:
+                file_ = open(infile, 'r')
+            else:
+                file_ = codecs.getreader('utf-8')(sys.stdin, errors='replace')
+
+        mail = email.message_from_file(file_)
+
         try:
             result = parse_mail(mail, options['list_id'])
             if result:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 859 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/patchwork/attachments/20160920/bab06a7a/attachment.sig>


More information about the Patchwork mailing list