X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=irkerhook.py;h=2d6df23f13e8aa02d127800e718f26d04f794531;hb=56654dcaf6c75cadd659e058fcfd65667276e26e;hp=99a9d3996205bfb9bf7bcdeed76a79870649e34f;hpb=1251b42e50e35ec9a785f66fbc77e06fae0e9a85;p=bzrirker.git diff --git a/irkerhook.py b/irkerhook.py index 99a9d39..2d6df23 100644 --- a/irkerhook.py +++ b/irkerhook.py @@ -3,95 +3,51 @@ # Copyright 2012 Neil Muller # GPL 2+ - see COPYING for details -from bzrlib import ( - errors, - revision as _mod_revision, - ) -from bzrlib.config import ( - ListOption, - Option, - bool_from_store, - int_from_store, - ) +from bzrlib.config import Option +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, - 'repo': '', + 'repo': self.branch.nick, 'rev': '%d' % self.revno, - 'files': '', + 'files': ' '.join(files), 'logmsg': self.revision.get_summary(), - 'url': self.url(), } 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) + ' %(bold)s%(files)s%(reset)s: %(logmsg)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') @@ -102,7 +58,7 @@ class IrkerSender(object): return url def colours(self): - colour_style = self.config.get('irker_colors') + colour_style = self.config.get('irker_colours') colours = { 'bold': '', 'green': '', @@ -117,32 +73,32 @@ class IrkerSender(object): # 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' + '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' + 'bold': '\x02', + 'green': '\x0303', + 'blue': '\x0302', + 'red': '\x0305', + 'yellow': '\x0307', + 'brown': '\x0305', + 'magenta': '\x0306', + 'cyan': '\x0310', + 'reset': '\x0F', } - return colours + return colours.iteritems() def project(self): - projet = self.config.get('irker_project') + project = self.config.get('irker_project') if project is None: project = 'No Project name set' return project @@ -152,9 +108,30 @@ class IrkerSender(object): """ 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') + if channels: + channels = channels.split(',') + 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()