changeset 5973:ea77f6f77514

patchbomb: undo backout and fix bugs in the earlier patch
author Matt Mackall <mpm@selenic.com>
date Thu, 31 Jan 2008 14:44:19 -0600
parents d83020d0466f
children bed929082b58
files hgext/patchbomb.py mercurial/mail.py
diffstat 2 files changed, 32 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/patchbomb.py	Tue Jan 22 23:07:23 2008 +0100
+++ b/hgext/patchbomb.py	Thu Jan 31 14:44:19 2008 -0600
@@ -381,6 +381,7 @@
     parent = None
 
     sender_addr = email.Utils.parseaddr(sender)[1]
+    sendmail = None
     for m in msgs:
         try:
             m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
@@ -425,10 +426,12 @@
             fp.write('\n\n')
             fp.close()
         else:
+            if not sendmail:
+                sendmail = mail.connect(ui)
             ui.status('Sending ', m['Subject'], ' ...\n')
             # Exim does not remove the Bcc field
             del m['Bcc']
-            mail.sendmail(ui, sender, to + bcc + cc, m.as_string(0))
+            sendmail(sender, to + bcc + cc, m.as_string(0))
 
 cmdtable = {
     "email":
--- a/mercurial/mail.py	Tue Jan 22 23:07:23 2008 +0100
+++ b/mercurial/mail.py	Thu Jan 31 14:44:19 2008 -0600
@@ -9,8 +9,7 @@
 import os, smtplib, templater, util, socket
 
 def _smtp(ui):
-    '''send mail using smtp.'''
-
+    '''build an smtp connection and return a function to send mail'''
     local_hostname = ui.config('smtp', 'local_hostname')
     s = smtplib.SMTP(local_hostname=local_hostname)
     mailhost = ui.config('smtp', 'host')
@@ -36,46 +35,42 @@
         ui.note(_('(authenticating to mail server as %s)\n') %
                   (username))
         s.login(username, password)
-    return s
 
-class _sendmail(object):
-    '''send mail using sendmail.'''
+    def send(sender, recipients, msg):
+        try:
+            return s.sendmail(sender, recipients, msg)
+        except smtplib.SMTPRecipientsRefused, inst:
+            recipients = [r[1] for r in inst.recipients.values()]
+            raise util.Abort('\n' + '\n'.join(recipients))
+        except smtplib.SMTPException, inst:
+            raise util.Abort(inst)
 
-    def __init__(self, ui, program):
-        self.ui = ui
-        self.program = program
+    return send
 
-    def sendmail(self, sender, recipients, msg):
-        cmdline = '%s -f %s %s' % (
-            self.program, templater.email(sender),
-            ' '.join(map(templater.email, recipients)))
-        self.ui.note(_('sending mail: %s\n') % cmdline)
-        fp = os.popen(cmdline, 'w')
-        fp.write(msg)
-        ret = fp.close()
-        if ret:
-            raise util.Abort('%s %s' % (
-                os.path.basename(self.program.split(None, 1)[0]),
-                util.explain_exit(ret)[0]))
+def _sendmail(ui, sender, recipients, msg):
+    '''send mail using sendmail.'''
+    program = ui.config('email', 'method')
+    cmdline = '%s -f %s %s' % (program, templater.email(sender),
+                               ' '.join(map(templater.email, recipients)))
+    ui.note(_('sending mail: %s\n') % cmdline)
+    fp = os.popen(cmdline, 'w')
+    fp.write(msg)
+    ret = fp.close()
+    if ret:
+        raise util.Abort('%s %s' % (
+            os.path.basename(program.split(None, 1)[0]),
+            util.explain_exit(ret)[0]))
 
 def connect(ui):
-    '''make a mail connection. object returned has one method, sendmail.
+    '''make a mail connection. return a function to send mail.
     call as sendmail(sender, list-of-recipients, msg).'''
-
-    method = ui.config('email', 'method', 'smtp')
-    if method == 'smtp':
+    if ui.config('email', 'method', 'smtp') == 'smtp':
         return _smtp(ui)
-
-    return _sendmail(ui, method)
+    return lambda s, r, m: _sendmail(ui, s, r, m)
 
 def sendmail(ui, sender, recipients, msg):
-    try:
-        return connect(ui).sendmail(sender, recipients, msg)
-    except smtplib.SMTPRecipientsRefused, inst:
-        recipients = [r[1] for r in inst.recipients.values()]
-        raise util.Abort('\n' + '\n'.join(recipients))
-    except smtplib.SMTPException, inst:
-        raise util.Abort(inst)
+    send = connect(ui)
+    return send(sender, recipients, msg)
 
 def validateconfig(ui):
     '''determine if we have enough config data to try sending email.'''