--- a/hgext/notify.py Tue Aug 15 11:34:08 2006 -0500
+++ b/hgext/notify.py Tue Aug 15 14:06:50 2006 -0500
@@ -67,8 +67,8 @@
from mercurial.demandload import *
from mercurial.i18n import gettext as _
from mercurial.node import *
-demandload(globals(), 'email.Parser mercurial:commands,patch,templater,util')
-demandload(globals(), 'fnmatch socket time')
+demandload(globals(), 'mercurial:commands,patch,templater,util,mail')
+demandload(globals(), 'email.Parser fnmatch socket time')
# template for single changeset can include email headers.
single_template = '''
@@ -229,8 +229,8 @@
else:
self.ui.status(_('notify: sending %d subscribers %d changes\n') %
(len(self.subs), count))
- mail = self.ui.sendmail()
- mail.sendmail(templater.email(msg['From']), self.subs, msgtext)
+ mail.sendmail(self.ui, templater.email(msg['From']),
+ self.subs, msgtext)
def diff(self, node, ref):
maxdiff = int(self.ui.config('notify', 'maxdiff', 300))
--- a/hgext/patchbomb.py Tue Aug 15 11:34:08 2006 -0500
+++ b/hgext/patchbomb.py Tue Aug 15 14:06:50 2006 -0500
@@ -241,7 +241,7 @@
ui.write('\n')
if not opts['test'] and not opts['mbox']:
- mail = ui.sendmail()
+ mailer = mail.connect(ui)
parent = None
# Calculate UTC offset
@@ -290,7 +290,7 @@
ui.status('Sending ', m['Subject'], ' ...\n')
# Exim does not remove the Bcc field
del m['Bcc']
- mail.sendmail(sender, to + bcc + cc, m.as_string(0))
+ mailer.sendmail(sender, to + bcc + cc, m.as_string(0))
cmdtable = {
'email':
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/mail.py Tue Aug 15 14:06:50 2006 -0500
@@ -0,0 +1,68 @@
+# mail.py - mail sending bits for mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+from i18n import gettext as _
+from demandload import *
+demandload(globals(), "os re smtplib templater util")
+
+def _smtp(ui):
+ '''send mail using smtp.'''
+
+ local_hostname = ui.config('smtp', 'local_hostname')
+ s = smtplib.SMTP(local_hostname=local_hostname)
+ mailhost = ui.config('smtp', 'host')
+ if not mailhost:
+ raise util.Abort(_('no [smtp]host in hgrc - cannot send mail'))
+ mailport = int(ui.config('smtp', 'port', 25))
+ self.note(_('sending mail: smtp host %s, port %s\n') %
+ (mailhost, mailport))
+ s.connect(host=mailhost, port=mailport)
+ if ui.configbool('smtp', 'tls'):
+ ui.note(_('(using tls)\n'))
+ s.ehlo()
+ s.starttls()
+ s.ehlo()
+ username = ui.config('smtp', 'username')
+ password = ui.config('smtp', 'password')
+ if username and password:
+ ui.note(_('(authenticating to mail server as %s)\n') %
+ (username))
+ s.login(username, password)
+ return s
+
+class _sendmail(object):
+ '''send mail using sendmail.'''
+
+ def __init__(self, ui, program):
+ self.ui = ui
+ self.program = program
+
+ 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 connect(ui):
+ '''make a mail connection. object returned has one method, sendmail.
+ call as sendmail(sender, list-of-recipients, msg).'''
+
+ method = ui.config('email', 'method', 'smtp')
+ if method == 'smtp':
+ return smtp(ui)
+
+ return sendmail(ui, method)
+
+def sendmail(ui, sender, recipients, msg):
+ return connect(ui).sendmail(sender, recipients, msg)
--- a/mercurial/ui.py Tue Aug 15 11:34:08 2006 -0500
+++ b/mercurial/ui.py Tue Aug 15 14:06:50 2006 -0500
@@ -7,7 +7,7 @@
from i18n import gettext as _
from demandload import *
-demandload(globals(), "errno getpass os re smtplib socket sys tempfile")
+demandload(globals(), "errno getpass os re socket sys tempfile")
demandload(globals(), "ConfigParser mdiff templater traceback util")
class ui(object):
@@ -281,62 +281,6 @@
return t
- def sendmail(self):
- '''send mail message. object returned has one method, sendmail.
- call as sendmail(sender, list-of-recipients, msg).'''
-
- def smtp():
- '''send mail using smtp.'''
-
- local_hostname = self.config('smtp', 'local_hostname')
- s = smtplib.SMTP(local_hostname=local_hostname)
- mailhost = self.config('smtp', 'host')
- if not mailhost:
- raise util.Abort(_('no [smtp]host in hgrc - cannot send mail'))
- mailport = int(self.config('smtp', 'port', 25))
- self.note(_('sending mail: smtp host %s, port %s\n') %
- (mailhost, mailport))
- s.connect(host=mailhost, port=mailport)
- if self.configbool('smtp', 'tls'):
- self.note(_('(using tls)\n'))
- s.ehlo()
- s.starttls()
- s.ehlo()
- username = self.config('smtp', 'username')
- password = self.config('smtp', 'password')
- if username and password:
- self.note(_('(authenticating to mail server as %s)\n') %
- (username))
- s.login(username, password)
- return s
-
- class sendmail(object):
- '''send mail using sendmail.'''
-
- def __init__(self, ui, program):
- self.ui = ui
- self.program = program
-
- 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]))
-
- method = self.config('email', 'method', 'smtp')
- if method == 'smtp':
- mail = smtp()
- else:
- mail = sendmail(self, method)
- return mail
-
def print_exc(self):
'''print exception traceback if traceback printing enabled.
only to call in exception handler. returns true if traceback