summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xloginfo-consumer70
-rwxr-xr-xloginfo-producer2
2 files changed, 44 insertions, 28 deletions
diff --git a/loginfo-consumer b/loginfo-consumer
index 15ca8cd..c369004 100755
--- a/loginfo-consumer
+++ b/loginfo-consumer
@@ -29,10 +29,17 @@ from qpid.queue import Empty
from lxml import etree
-from email.mime.text import MIMEText
-from email import utils
-from email import Header
-from email.encoders import encode_quopri
+import email.generator
+import email.message
+import email.header
+import email.utils
+import email.charset
+
+from cStringIO import StringIO
+
+utf8 = email.charset.Charset('utf-8')
+utf8.body_encoding = None
+utf8.header_encoding = email.charset.SHORTEST
def get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version):
diff = u''
@@ -53,13 +60,13 @@ def get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version):
filename))
fp = os.popen(diffcmd)
- diff += fp.read().decode('utf-8')
+ diff += fp.read().decode('utf-8', 'replace')
status = fp.close()
return diff
package_re = re.compile(r'^(?:rpms|devel)/([^/]+)(?:/([^/]+))?')
-def append_package_owner_email(directory, recipients):
+def append_package_owner_email(directory, log_message, recipients):
global package_re
package_match = package_re.match(directory)
@@ -79,29 +86,30 @@ directory_based_notifications = [(re.compile(r'^rpms'), [append_package_owner_em
(re.compile(r'^comps'), ['cvsextras@fedoraproject.org',
'katzj@redhat.com',
'notting@redhat.com',
- 'jkeating@redhat.com'])]
+ 'jkeating@redhat.com']),
+ (re.compile(r'^example'), ['jeff@ocjtech.us'])]
message_based_notifications = [(re.compile(r'docs'), ['relnotes@fedoraproject.org'])]
-def process_notifications(directory, message, recipients, notifications):
+def process_notifications(directory, log_message, recipients, notifications):
for notification in notifications:
if isinstance(notification, basestring):
recipients.add(notification)
elif callable(notification):
- notification(directory, message, recipients)
+ notification(directory, log_message, recipients)
-def compute_directory_based_notifications(directory, message, recipients):
+def compute_directory_based_notifications(directory, log_message, recipients):
for pattern, notifications in directory_based_notifications:
match = pattern.match(directory)
if match:
- process_notifications(directory, message, recipients, notifications)
+ process_notifications(directory, log_message, recipients, notifications)
-def compute_message_based_notifications(directory, message, email_recipient_set):
+def compute_message_based_notifications(directory, log_message, email_recipient_set):
for pattern, notifications in message_based_notifications:
- match = pattern.search(message)
+ match = pattern.search(log_message)
if match:
- process_notifications(directory, message, recipients, notifications)
+ process_notifications(directory, log_message, recipients, notifications)
host = '127.0.0.1'
port = 5672
@@ -130,14 +138,15 @@ while True:
username = root_element.xpath('/loginfo/username')[0].text
fullname = root_element.xpath('/loginfo/fullname')[0].text
timestamp = float(root_element.xpath('/loginfo/timestamp')[0].text)
+ log_message = root_element.xpath('/loginfo/message')[0].text
- email_sender = utils.formataddr((fullname, username + '@fedoraproject.org'))
+ email_sender = email.utils.formataddr((fullname, username + '@fedoraproject.org'))
email_body = u'Author: %s\n\n' % email_sender
- email_body += root_element.xpath('/loginfo/message')[0].text
+ email_body += unicode(log_message)
email_body += u'\n\n'
-
- email_subject = directory
+
+ email_subject = unicode(directory)
for file_element in root_element.xpath('/loginfo/files/file'):
filename = file_element.xpath('filename')[0].text
@@ -151,13 +160,13 @@ while True:
email_body += diff
email_body += u'\n\n'
- email_subject += u' %s,%s,%s' % (filename,old_version,new_version)
+ email_subject += u' %s,%s,%s' % (filename, old_version, new_version)
# build the list of recipients
recipients = set()
- compute_directory_based_notifications(directory, message, recipients)
- compute_message_based_notifications(directory, message, recipients)
+ compute_directory_based_notifications(directory, log_message, recipients)
+ compute_message_based_notifications(directory, log_message, recipients)
if len(recipients) == 0:
recipients.add('admin@fedoraproject.org')
@@ -167,11 +176,14 @@ while True:
# Build the email object
- msg = MIMEText(email_body.encode('utf-8'), _charset='utf-8')
- msg['From'] = Header.Header(email_sender)
- msg['To'] = Header.Header(u', '.join(email_recipients))
- msg['Subject'] = Header.Header(email_subject)
- msg['Date'] = utils.formatdate(timestamp)
+ msg = email.message.Message()
+ msg.set_charset(utf8)
+ msg.set_payload(email_body.encode('utf-8'))
+
+ msg['From'] = email.header.Header(unicode(email_sender), utf8)
+ msg['To'] = email.header.Header(u', '.join(email_recipients), utf8)
+ msg['Subject'] = email.header.Header(email_subject, utf8)
+ msg['Date'] = email.utils.formatdate(timestamp)
msg['X-CVSROOT'] = cvsroot
msg['X-CVS-Module'] = directory.split('/', 1)[0]
msg['X-CVS-Directory'] = directory
@@ -181,9 +193,13 @@ while True:
# and send it out
+ msg_fp = StringIO()
+ msg_g = email.generator.Generator(msg_fp, False)
+ msg_g.flatten(msg)
+
s = smtplib.SMTP()
s.connect()
- s.sendmail(email_sender, email_recipients, msg.as_string())
+ s.sendmail(email_sender, email_recipients, msg_fp.getvalue())
s.close()
session.message_accept(RangedSet(message.id))
diff --git a/loginfo-producer b/loginfo-producer
index f927168..556aaf8 100755
--- a/loginfo-producer
+++ b/loginfo-producer
@@ -62,7 +62,7 @@ cvsroot_element.text = cvsroot
directory_re = re.compile(r'^Update of %s/(.*)$' % (cvsroot,), re.M)
-message = sys.stdin.read().decode('utf-8')
+message = sys.stdin.read().decode('utf-8', 'replace')
directory_match = directory_re.search(message)
assert(directory_match)