38 # template = ... # template to use when formatting email |
38 # template = ... # template to use when formatting email |
39 # incoming = ... # template to use when run as incoming hook |
39 # incoming = ... # template to use when run as incoming hook |
40 # changegroup = ... # template when run as changegroup hook |
40 # changegroup = ... # template when run as changegroup hook |
41 # maxdiff = 300 # max lines of diffs to include (0=none, -1=all) |
41 # maxdiff = 300 # max lines of diffs to include (0=none, -1=all) |
42 # maxsubject = 67 # truncate subject line longer than this |
42 # maxsubject = 67 # truncate subject line longer than this |
|
43 # sources = serve # notify if source of incoming changes in this list |
|
44 # # (serve == ssh or http, push, pull, bundle) |
43 # [email] |
45 # [email] |
44 # from = user@host.com # email address to send as if none given |
46 # from = user@host.com # email address to send as if none given |
45 # [web] |
47 # [web] |
46 # baseurl = http://hgserver/... # root of hg web site for browsing commits |
48 # baseurl = http://hgserver/... # root of hg web site for browsing commits |
47 # |
49 # |
164 |
166 |
165 self.t.show(changenode=node, changes=self.repo.changelog.read(node), |
167 self.t.show(changenode=node, changes=self.repo.changelog.read(node), |
166 baseurl=self.ui.config('web', 'baseurl'), |
168 baseurl=self.ui.config('web', 'baseurl'), |
167 root=self.repo.root, |
169 root=self.repo.root, |
168 webroot=self.root) |
170 webroot=self.root) |
|
171 |
|
172 def skipsource(self, source): |
|
173 '''true if incoming changes from this source should be skipped.''' |
|
174 ok_sources = self.ui.config('notify', 'sources', 'serve').split() |
|
175 return source not in ok_sources |
169 |
176 |
170 def send(self, node, count): |
177 def send(self, node, count): |
171 '''send message.''' |
178 '''send message.''' |
172 |
179 |
173 p = email.Parser.Parser() |
180 p = email.Parser.Parser() |
208 msg['X-Hg-Notification'] = 'changeset ' + short(node) |
215 msg['X-Hg-Notification'] = 'changeset ' + short(node) |
209 if not msg['Message-Id']: |
216 if not msg['Message-Id']: |
210 msg['Message-Id'] = ('<hg.%s.%s.%s@%s>' % |
217 msg['Message-Id'] = ('<hg.%s.%s.%s@%s>' % |
211 (short(node), int(time.time()), |
218 (short(node), int(time.time()), |
212 hash(self.repo.root), socket.getfqdn())) |
219 hash(self.repo.root), socket.getfqdn())) |
213 msg['To'] = self.subs |
220 msg['To'] = ', '.join(self.subs) |
214 |
221 |
215 msgtext = msg.as_string(0) |
222 msgtext = msg.as_string(0) |
216 if self.ui.configbool('notify', 'test', True): |
223 if self.ui.configbool('notify', 'test', True): |
217 self.ui.write(msgtext) |
224 self.ui.write(msgtext) |
218 if not msgtext.endswith('\n'): |
225 if not msgtext.endswith('\n'): |
236 difflines = difflines[:maxdiff] |
243 difflines = difflines[:maxdiff] |
237 elif difflines: |
244 elif difflines: |
238 self.sio.write(_('\ndiffs (%d lines):\n\n') % len(difflines)) |
245 self.sio.write(_('\ndiffs (%d lines):\n\n') % len(difflines)) |
239 self.sio.write(*difflines) |
246 self.sio.write(*difflines) |
240 |
247 |
241 def hook(ui, repo, hooktype, node=None, **kwargs): |
248 def hook(ui, repo, hooktype, node=None, source=None, **kwargs): |
242 '''send email notifications to interested subscribers. |
249 '''send email notifications to interested subscribers. |
243 |
250 |
244 if used as changegroup hook, send one email for all changesets in |
251 if used as changegroup hook, send one email for all changesets in |
245 changegroup. else send one email per changeset.''' |
252 changegroup. else send one email per changeset.''' |
246 n = notifier(ui, repo, hooktype) |
253 n = notifier(ui, repo, hooktype) |
247 if not n.subs: return True |
254 if not n.subs or n.skipsource(source): |
|
255 return |
248 node = bin(node) |
256 node = bin(node) |
249 if hooktype == 'changegroup': |
257 if hooktype == 'changegroup': |
250 start = repo.changelog.rev(node) |
258 start = repo.changelog.rev(node) |
251 end = repo.changelog.count() |
259 end = repo.changelog.count() |
252 count = end - start |
260 count = end - start |