Sketch in skeleton of module from bzr-email
[bzrirker.git] / irkerhook.py
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
5
6 from bzrlib import (
7     errors,
8     revision as _mod_revision,
9     )
10 from bzrlib.config import (
11     ListOption,
12     Option,
13     bool_from_store,
14     int_from_store,
15     )
16
17
18 class IrkerSender(object):
19     """An irker message sender."""
20
21     def __init__(self, branch, revision_id, config, local_branch=None,
22         op='commit'):
23         self.config = config
24         self.branch = branch
25         self.repository = branch.repository
26         if (local_branch is not None and
27             local_branch.repository.has_revision(revision_id)):
28             self.repository = local_branch.repository
29         self._revision_id = revision_id
30         self.revision = None
31         self.revno = None
32         self.op = op
33
34     def _setup_revision_and_revno(self):
35         self.revision = self.repository.get_revision(self._revision_id)
36         self.revno = self.branch.revision_id_to_revno(self._revision_id)
37
38     def _format(self):
39         fields = {
40             'committer': self.revision.committer,
41             'message': self.revision.get_summary(),
42             'revision': '%d' % self.revno,
43             'url': self.url()
44         }
45         text = ''
46         #for name, value in fields.items():
47         #    text = text.replace('$%s' % name, value)
48         return text
49
50     def body(self):
51         from bzrlib import log
52
53         rev1 = rev2 = self.revno
54         if rev1 == 0:
55             rev1 = None
56             rev2 = None
57
58         # use 'replace' so that we don't abort if trying to write out
59         # in e.g. the default C locale.
60
61         # Following bzr-email, we use StringIO.StringIO to minimise possible
62         # unicode issues.
63         from StringIO import StringIO
64         outf = StringIO()
65
66         lf = log.log_formatter('line',
67                                show_ids=True,
68                                to_file=outf
69                                )
70
71         if len(self.revision.parent_ids) <= 1:
72             # This is not a merge, so we can special case the display of one
73             # revision, and not have to encur the show_log overhead.
74             lr = log.LogRevision(self.revision, self.revno, 0, None)
75             lf.log_revision(lr)
76         else:
77             # let the show_log code figure out what revisions need to be
78             # displayed, as this is a merge
79             log.show_log(self.branch,
80                          lf,
81                          start_revision=rev1,
82                          end_revision=rev2,
83                          verbose=True
84                          )
85
86         return outf.getvalue()
87
88     def url(self):
89         """What URL to display in the subject of the mail"""
90         url = self.config.get('irker_url')
91         if url is None:
92             url = self.config.get('public_branch')
93         if url is None:
94             url = self.branch.base
95         return url
96
97     def send(self):
98         """Send the info to irkerd.
99         """
100         self.branch.lock_read()
101         self.repository.lock_read()
102         try:
103             # Do this after we have locked, to make things faster.
104             self._setup_revision_and_revno()
105         finally:
106             self.repository.unlock()
107             self.branch.unlock()
108
109 opt_irker_url = Option('irker_url',
110     help='URL to mention for branch in messages.')
111 opt_irker_channels = Option('irker_channels',
112     help='Channel(s) to post commit messages to.')
113 opt_irker_colours = Option('irker_colours',
114     help='Colour option for irker.')