1 # -*- coding: utf-8 -*-
2 # vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4
3 # Copyright 2012 Neil Muller
4 # GPL 2+ - see COPYING for details
6 from bzrlib.config import Option
12 class IrkerSender(object):
13 """An irker message sender."""
15 def __init__(self, branch, revision_id, config):
18 self.repository = branch.repository
19 self._revision_id = revision_id
23 def _setup_revision_and_revno(self):
24 self.revision = self.repository.get_revision(self._revision_id)
25 self.revno = self.branch.revision_id_to_revno(self._revision_id)
28 delta = self.branch.repository.get_revision_delta(self._revision_id)
30 [files.append(f) for (f,_,_) in delta.added]
31 [files.append(f) for (f,_,_) in delta.removed]
32 [files.append(f) for (_,f,_,_,_,_) in delta.renamed]
33 [files.append(f) for (f,_,_,_,_) in delta.modified]
36 'project': self.project(),
37 'committer': self.revision.committer,
38 'repo': self.branch.nick,
39 'rev': '%d' % self.revno,
40 'files': ' '.join(files),
41 'logmsg': self.revision.get_summary(),
43 for name, value in self.colours():
45 text = ('%(bold)s%(project)s:%(reset)s '
46 '%(green)s%(committer)s%(reset)s '
47 '%(repo)s * %(bold)s%(rev)s%(reset)s / '
48 ' %(bold)s%(files)s%(reset)s: %(logmsg)s ' % fields)
52 """What URL to display in the subject of the mail"""
53 url = self.config.get('irker_url')
55 url = self.config.get('public_branch')
57 url = self.branch.base
61 colour_style = self.config.get('irker_colours')
73 # Vaues taken from irker's irkerhook.py
74 if colour_style == 'ANSI':
77 'green': '\x1b[1;32m',
80 'yellow': '\x1b[1;33m',
82 'magenta': '\x1b[35m',
86 elif colour_style == 'mIRC':
98 return colours.iteritems()
101 project = self.config.get('irker_project')
103 project = 'No Project name set'
107 """Send the info to irkerd.
109 self.branch.lock_read()
110 self.repository.lock_read()
111 # These should become configurable at some point
112 default_server = 'localhost'
115 # Do this after we have locked, to make things faster.
116 self._setup_revision_and_revno()
117 channels = self.config.get('irker_channels')
119 channels = channels.split(',')
120 msg = unicode(self._format())
121 # We rely on the server truncating, rather than trying to be
123 message = json.dumps({"to": channels, "privmsg": msg})
125 # We assume tcp, since I'm lazy, so we just grab that bit
128 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
129 sock.connect((default_server, IRKER_PORT))
130 sock.sendall(message + "\n")
131 except socket.error, e:
132 sys.stderr.write("%s\n" % e)
136 self.repository.unlock()
139 opt_irker_url = Option('irker_url',
140 help='URL to mention for branch in messages.')
141 opt_irker_channels = Option('irker_channels',
142 help='Channel(s) to post commit messages to.')
143 opt_irker_colours = Option('irker_colours',
144 help='Colour option for irker.')
145 opt_irker_project = Option('irker_project',
146 help='Project name to use.')