Mercurial > hg
comparison hgext/notify.py @ 2201:f15056b29472
patch queue: notify.patch
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Thu, 04 May 2006 12:25:10 -0700 |
parents | |
children | 9569eea1707c |
comparison
equal
deleted
inserted
replaced
2200:9f43b6e24232 | 2201:f15056b29472 |
---|---|
1 from mercurial.demandload import * | |
2 from mercurial.i18n import gettext as _ | |
3 from mercurial.node import * | |
4 demandload(globals(), 'email.MIMEText mercurial:templater,util fnmatch socket') | |
5 demandload(globals(), 'time') | |
6 | |
7 class notifier(object): | |
8 def __init__(self, ui, repo): | |
9 self.ui = ui | |
10 self.ui.readconfig(self.ui.config('notify', 'config')) | |
11 self.repo = repo | |
12 self.stripcount = self.ui.config('notify', 'strip') | |
13 self.root = self.strip(self.repo.root) | |
14 | |
15 def strip(self, path): | |
16 path = util.pconvert(path) | |
17 count = self.stripcount | |
18 while path and count >= 0: | |
19 c = path.find('/') | |
20 if c == -1: | |
21 break | |
22 path = path[c+1:] | |
23 count -= 1 | |
24 return path | |
25 | |
26 def subscribers(self): | |
27 subs = [] | |
28 for user, pat in self.ui.configitems('usersubs'): | |
29 if fnmatch.fnmatch(self.root, pat): | |
30 subs.append(user) | |
31 for pat, users in self.ui.configitems('reposubs'): | |
32 if fnmatch.fnmatch(self.root, pat): | |
33 subs.extend([u.strip() for u in users.split(',')]) | |
34 subs.sort() | |
35 return subs | |
36 | |
37 def seen(self, node): | |
38 pass | |
39 | |
40 def url(self, path=None): | |
41 return self.ui.config('web', 'baseurl') + (path or self.root) | |
42 | |
43 def message(self, node, changes): | |
44 sio = templater.stringio() | |
45 seen = self.seen(node) | |
46 if seen: | |
47 seen = self.strip(seen) | |
48 sio.write('Changeset %s merged to %s\n' % | |
49 (short(node), self.url())) | |
50 sio.write('First seen in %s\n' % self.url(seen)) | |
51 else: | |
52 sio.write('Changeset %s new to %s\n' % (short(node), self.url())) | |
53 sio.write('Committed by %s at %s\n' % | |
54 (changes[1], templater.isodate(changes[2]))) | |
55 sio.write('See %s?cmd=changeset;node=%s for full details\n' % | |
56 (self.url(), short(node))) | |
57 sio.write('\nDescription:\n') | |
58 sio.write(templater.indent(changes[4], ' ')) | |
59 msg = email.MIMEText.MIMEText(sio.getvalue(), 'plain') | |
60 firstline = changes[4].lstrip().split('\n', 1)[0].rstrip() | |
61 subject = '%s %s: %s' % (self.root, self.repo.rev(node), firstline) | |
62 if seen: | |
63 subject = '[merge] ' + subject | |
64 if subject.endswith('.'): | |
65 subject = subject[:-1] | |
66 if len(subject) > 67: | |
67 subject = subject[:64] + '...' | |
68 msg['Subject'] = subject | |
69 msg['X-Hg-Repo'] = self.root | |
70 if '@' in changes[1]: | |
71 msg['From'] = changes[1] | |
72 else: | |
73 msg['From'] = self.ui.config('email', 'from') | |
74 msg['Message-Id'] = '<hg.%s.%s.%s@%s>' % (hex(node), | |
75 int(time.time()), | |
76 hash(self.repo.root), | |
77 socket.getfqdn()) | |
78 return msg | |
79 | |
80 def node(self, node): | |
81 mail = self.ui.sendmail() | |
82 changes = self.repo.changelog.read(node) | |
83 fromaddr = self.ui.config('email', 'from', changes[1]) | |
84 msg = self.message(node, changes) | |
85 subs = self.subscribers() | |
86 msg['To'] = ', '.join(subs) | |
87 msgtext = msg.as_string(0) | |
88 mail.sendmail(templater.email(fromaddr), | |
89 [templater.email(s) for s in subs], | |
90 msgtext) | |
91 | |
92 | |
93 def hook(ui, repo, hooktype, node=None, **kwargs): | |
94 n = notifier(ui, repo) | |
95 n.node(bin(node)) |