X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=irkerhook.py;h=7e59a6ebc767d63fe371c169d166982e886e40d9;hb=d5846c47552f312217e200d83c26513063a0b7ee;hp=b2dd4fe4e776e6e90191917c774f28052feb3902;hpb=044cea8437cfe55bee35cc06318c06d7bc6a70fa;p=bzrirker.git diff --git a/irkerhook.py b/irkerhook.py index b2dd4fe..7e59a6e 100644 --- a/irkerhook.py +++ b/irkerhook.py @@ -13,78 +13,52 @@ from bzrlib.config import ( bool_from_store, int_from_store, ) +import socket +import sys +import json class IrkerSender(object): """An irker message sender.""" - def __init__(self, branch, revision_id, config, local_branch=None, - op='commit'): + def __init__(self, branch, revision_id, config): self.config = config self.branch = branch self.repository = branch.repository - if (local_branch is not None and - local_branch.repository.has_revision(revision_id)): - self.repository = local_branch.repository self._revision_id = revision_id self.revision = None self.revno = None - self.op = op def _setup_revision_and_revno(self): self.revision = self.repository.get_revision(self._revision_id) self.revno = self.branch.revision_id_to_revno(self._revision_id) def _format(self): + delta = self.branch.repository.get_revision_delta(self._revision_id) + files = [] + [files.append(f) for (f,_,_) in delta.added] + [files.append(f) for (f,_,_) in delta.removed] + [files.append(f) for (_,f,_,_,_,_) in delta.renamed] + [files.append(f) for (f,_,_,_,_) in delta.modified] + fields = { + 'project': self.project(), 'committer': self.revision.committer, - 'message': self.revision.get_summary(), - 'revision': '%d' % self.revno, - 'url': self.url() + 'repo': self.branch.nick, + 'rev': '%d' % self.revno, + 'files': ' '.join(files), + 'logmsg': self.revision.get_summary(), + 'url': self.url(), } - text = '' - #for name, value in fields.items(): - # text = text.replace('$%s' % name, value) + for name, value in self.colours(): + fields[name] = value + text = ('%(bold)s%(project)s:%(reset)s ' + '%(green)s%(committer)s%(reset)s ' + '%(repo)s * %(bold)s%(rev)s%(reset)s / ' + ' %(bold)s%(files)s%(reset)s: %(logmsg)s ' + '%(brown)s%(url)s%(reset)s' % fields) return text - def body(self): - from bzrlib import log - - rev1 = rev2 = self.revno - if rev1 == 0: - rev1 = None - rev2 = None - - # use 'replace' so that we don't abort if trying to write out - # in e.g. the default C locale. - - # Following bzr-email, we use StringIO.StringIO to minimise possible - # unicode issues. - from StringIO import StringIO - outf = StringIO() - - lf = log.log_formatter('line', - show_ids=True, - to_file=outf - ) - - if len(self.revision.parent_ids) <= 1: - # This is not a merge, so we can special case the display of one - # revision, and not have to encur the show_log overhead. - lr = log.LogRevision(self.revision, self.revno, 0, None) - lf.log_revision(lr) - else: - # let the show_log code figure out what revisions need to be - # displayed, as this is a merge - log.show_log(self.branch, - lf, - start_revision=rev1, - end_revision=rev2, - verbose=True - ) - - return outf.getvalue() - def url(self): """What URL to display in the subject of the mail""" url = self.config.get('irker_url') @@ -94,14 +68,79 @@ class IrkerSender(object): url = self.branch.base return url + def colours(self): + colour_style = self.config.get('irker_colors') + colours = { + 'bold': '', + 'green': '', + 'blue': '', + 'red': '', + 'yellow': '', + 'brown': '', + 'magenta': '', + 'cyan': '', + 'reset': '', + } + # Vaues taken from irker's irkerhook.py + if colour_style == 'ANSI': + colours = { + 'bold': '\x1b[1m', + 'green': '\x1b[1;32m', + 'blue': '\x1b[1;34m', + 'red': '\x1b[1;31m', + 'yellow': '\x1b[1;33m', + 'brown': '\x1b[33m', + 'magenta': '\x1b[35m', + 'cyan': '\x1b[36m', + 'reset': '\x1b[0m', + } + elif colour_style == 'mIRC': + colours = { + 'bold': '\x02', + 'green': '\x0303', + 'blue': '\x0302', + 'red': '\x0305', + 'yellow': '\x0307', + 'brown': '\x0305', + 'magenta': '\x0306', + 'cyan': '\x0310', + 'reset': '\x0F', + } + return colours + + def project(self): + project = self.config.get('irker_project') + if project is None: + project = 'No Project name set' + return project + def send(self): """Send the info to irkerd. """ self.branch.lock_read() self.repository.lock_read() + # These should become configurable at some point + default_server = 'localhost' + IRKER_PORT = 6659 try: # Do this after we have locked, to make things faster. self._setup_revision_and_revno() + channels = self.config.get('irker_channels') + msg = unicode(self._format()) + # We rely on the server truncating, rather than trying to be + # too fancy here + message = json.dumps({"to": channels, "privmsg": msg}) + if channels: + # We assume tcp, since I'm lazy, so we just grab that bit + # of irker's code + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((default_server, IRKER_PORT)) + sock.sendall(message + "\n") + except socket.error, e: + sys.stderr.write("%s\n" % e) + finally: + sock.close() finally: self.repository.unlock() self.branch.unlock() @@ -112,3 +151,5 @@ opt_irker_channels = Option('irker_channels', help='Channel(s) to post commit messages to.') opt_irker_colours = Option('irker_colours', help='Colour option for irker.') +opt_irker_project = Option('irker_project', + help='Project name to use.')