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