blob: 4fb9022f6a78f22e59ed2f1a3246cd85ce0d2982 [file] [log] [blame]
import buildbot
import zope
import os
from datetime import datetime, timedelta
from twisted.python import log
class ConfigEmailLookup(buildbot.util.ComparableMixin):
"""
Email lookup implementation which searchs a user specified configuration
file to match commit authors to email addresses.
"""
# TODO: Document this class.
# Class loads llvm_authors from file and reload if the file was updated.
zope.interface.implements(buildbot.interfaces.IEmailLookup)
compare_attrs = ["author_filename", "default_address", "only_addresses"]
def __init__(self, author_filename, default_address, only_addresses = None, update_interval=timedelta(hours=1)):
from ConfigParser import ConfigParser
self.author_filename = author_filename
self.default_address = default_address
self.only_addresses = only_addresses
self.update_interval = update_interval
self.config_parser = ConfigParser()
self.config_parser.read(self.author_filename)
self.time_checked = datetime.utcnow()
self.time_loaded = datetime.utcfromtimestamp(os.path.getmtime(self.author_filename))
if only_addresses:
import re
self.address_match_p = re.compile(only_addresses).match
else:
self.address_match_p = lambda addr: True
def getAddress(self, name):
# For a multiple types of pollers/schedulers we can get an email address or
# a fully qualified name/email in 'name' parameter. Check and return name if it
# contains email address.
if name is not None and '@' in name:
return name
try:
if (datetime.utcnow() - self.time_checked) >= timedelta(minutes=1):
self.time_checked = datetime.utcnow()
current_mtime = datetime.utcfromtimestamp(os.path.getmtime(self.author_filename))
if (current_mtime != self.time_loaded) and ((datetime.utcnow() - current_mtime) >= timedelta(minutes=1)):
# Reload the list of authors.
self.config_parser.read(self.author_filename)
self.time_loaded = current_mtime
log.msg('Reloaded file %s (mtime=%s) at %s' % (self.author_filename, self.time_loaded, self.time_checked))
except:
log.msg('Cannot load the %s file.' % self.author_filename)
pass
try:
email = self.config_parser.get("authors", name)
except:
return self.default_address
if self.address_match_p(email):
return email
return self.default_address