Update to point at irker's new gitlab repo
[bzrirker.git] / irkerhook.py
index d58b194ef6290f8a9375017f0567d7675971263c..e9aabc8477726d850f9779cb0f6844333f62c995 100644 (file)
@@ -8,6 +8,8 @@ import socket
 import sys
 import json
 
+IRKER_PORT = 6659
+
 
 class IrkerSender(object):
     """An irker message sender."""
@@ -15,13 +17,12 @@ class IrkerSender(object):
     def __init__(self, branch, revision_id, config):
         self.config = config
         self.branch = branch
-        self.repository = branch.repository
         self._revision_id = revision_id
         self.revision = None
         self.revno = None
 
     def _setup_revision_and_revno(self):
-        self.revision = self.repository.get_revision(self._revision_id)
+        self.revision = self.branch.repository.get_revision(self._revision_id)
         self.revno = self.branch.revision_id_to_revno(self._revision_id)
 
     def _format(self):
@@ -41,6 +42,9 @@ class IrkerSender(object):
             'files': ' '.join(files),
             'logmsg': self.revision.get_summary(),
         }
+        if len(fields['files']) > 250:
+            # Dangerously long looking list of files, so truncate it
+            fields['files'] = fields['files'][:250]
         fields.update(self.colours())
         text = ('%(bold)s%(project)s:%(reset)s '
                 '%(green)s%(committer)s%(reset)s '
@@ -99,33 +103,37 @@ class IrkerSender(object):
         """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
+        self.branch.repository.lock_read()
+        server = self.config.get('irker_server')
+        if not server:
+            server = 'localhost'
+        port = int(self.config.get('irker_port'))
+        if not port:
+            port = IRKER_PORT
         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
+            # If we're too long, we might not get any notification, so
+            # we truncate the msg to max 450 chars, and hope that's
+            # going to be within the 510 irc limit
+            msg = unicode(self._format())[:450]
             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.connect((server, port))
                     sock.sendall(message + "\n")
                 except socket.error, e:
                     sys.stderr.write("%s\n" % e)
                 finally:
                     sock.close()
         finally:
-            self.repository.unlock()
+            self.branch.repository.unlock()
             self.branch.unlock()
 
 opt_irker_channels = Option('irker_channels',
@@ -134,3 +142,7 @@ opt_irker_colours = Option('irker_colours',
     help='Colour option for irker.')
 opt_irker_project = Option('irker_project',
     help='Project name to use.')
+opt_irker_server = Option('irker_server',
+    help='host for the irkerd server (default localhost).')
+opt_irker_port = Option('irker_port',
+    help='port for the irkerd server (default %d)' % IRKER_PORT)