diff --git a/hgext/notify.py b/hgext/notify.py --- a/hgext/notify.py +++ b/hgext/notify.py @@ -147,7 +147,6 @@ class notifier(object): def subscribers(self): '''return list of email addresses of subscribers to this repo.''' - subs = {} for user, pats in self.ui.configitems('usersubs'): for pat in pats.split(','): @@ -164,20 +163,18 @@ class notifier(object): def url(self, path=None): return self.ui.config('web', 'baseurl') + (path or self.root) - def node(self, node): + def node(self, ctx): '''format one changeset.''' - - self.t.show(self.repo[node], changes=self.repo.changelog.read(node), + self.t.show(ctx, changes=ctx.changeset(), baseurl=self.ui.config('web', 'baseurl'), - root=self.repo.root, - webroot=self.root) + root=self.repo.root, webroot=self.root) def skipsource(self, source): '''true if incoming changes from this source should be skipped.''' ok_sources = self.ui.config('notify', 'sources', 'serve').split() return source not in ok_sources - def send(self, node, count, data): + def send(self, ctx, count, data): '''send message.''' p = email.Parser.Parser() @@ -203,8 +200,7 @@ class notifier(object): if count > 1: subject = _('%s: %d new changesets') % (self.root, count) else: - changes = self.repo.changelog.read(node) - s = changes[4].lstrip().split('\n', 1)[0].rstrip() + s = ctx.description().lstrip().split('\n', 1)[0].rstrip() subject = '%s: %s' % (self.root, s) maxsubject = int(self.ui.config('notify', 'maxsubject', 67)) if maxsubject and len(subject) > maxsubject: @@ -220,10 +216,10 @@ class notifier(object): msg['From'] = mail.addressencode(self.ui, sender, self.charsets, self.test) - msg['X-Hg-Notification'] = 'changeset ' + short(node) + msg['X-Hg-Notification'] = 'changeset %s' % ctx if not msg['Message-Id']: msg['Message-Id'] = ('' % - (short(node), int(time.time()), + (ctx, int(time.time()), hash(self.repo.root), socket.getfqdn())) msg['To'] = ', '.join(self.subs) @@ -238,10 +234,11 @@ class notifier(object): mail.sendmail(self.ui, util.email(msg['From']), self.subs, msgtext) - def diff(self, node, ref): + def diff(self, ctx, ref=None): + maxdiff = int(self.ui.config('notify', 'maxdiff', 300)) - prev = self.repo.changelog.parents(node)[0] - + prev = ctx.parents()[0].node() + ref = ref and ref.node() or ctx.node() chunks = patch.diff(self.repo, prev, ref, opts=patch.diffopts(self.ui)) difflines = ''.join(chunks).splitlines() @@ -250,14 +247,16 @@ class notifier(object): # s may be nil, don't include the header if it is if s: self.ui.write('\ndiffstat:\n\n%s' % s) + if maxdiff == 0: return - if maxdiff > 0 and len(difflines) > maxdiff: - self.ui.write(_('\ndiffs (truncated from %d to %d lines):\n\n') % - (len(difflines), maxdiff)) + elif maxdiff > 0 and len(difflines) > maxdiff: + msg = _('\ndiffs (truncated from %d to %d lines):\n\n') + self.ui.write(msg % (len(difflines), maxdiff)) difflines = difflines[:maxdiff] elif difflines: self.ui.write(_('\ndiffs (%d lines):\n\n') % len(difflines)) + self.ui.write("\n".join(difflines)) def hook(ui, repo, hooktype, node=None, source=None, **kwargs): @@ -265,26 +264,28 @@ def hook(ui, repo, hooktype, node=None, if used as changegroup hook, send one email for all changesets in changegroup. else send one email per changeset.''' + n = notifier(ui, repo, hooktype) + ctx = repo[node] + if not n.subs: ui.debug(_('notify: no subscribers to repo %s\n') % n.root) return if n.skipsource(source): - ui.debug(_('notify: changes have source "%s" - skipping\n') % - source) + ui.debug(_('notify: changes have source "%s" - skipping\n') % source) return - node = bin(node) + ui.pushbuffer() if hooktype == 'changegroup': - start = repo[node].rev() - end = len(repo) + start, end = ctx.rev(), len(repo) count = end - start for rev in xrange(start, end): - n.node(repo[rev].node()) - n.diff(node, repo.changelog.tip()) + n.node(repo[rev]) + n.diff(ctx, repo['tip']) else: count = 1 - n.node(node) - n.diff(node, node) + n.node(ctx) + n.diff(ctx) + data = ui.popbuffer() - n.send(node, count, data) + n.send(ctx, count, data)