from mercurial.demandload import * from mercurial.i18n import gettext as _ from mercurial.node import * demandload(globals(), 'email.MIMEText mercurial:templater,util fnmatch socket') demandload(globals(), 'time') class notifier(object): def __init__(self, ui, repo): self.ui = ui self.ui.readconfig(self.ui.config('notify', 'config')) self.repo = repo self.stripcount = self.ui.config('notify', 'strip') self.root = self.strip(self.repo.root) def strip(self, path): path = util.pconvert(path) count = self.stripcount while path and count >= 0: c = path.find('/') if c == -1: break path = path[c+1:] count -= 1 return path def subscribers(self): subs = [] for user, pat in self.ui.configitems('usersubs'): if fnmatch.fnmatch(self.root, pat): subs.append(user) for pat, users in self.ui.configitems('reposubs'): if fnmatch.fnmatch(self.root, pat): subs.extend([u.strip() for u in users.split(',')]) subs.sort() return subs def seen(self, node): pass def url(self, path=None): return self.ui.config('web', 'baseurl') + (path or self.root) def message(self, node, changes): sio = templater.stringio() seen = self.seen(node) if seen: seen = self.strip(seen) sio.write('Changeset %s merged to %s\n' % (short(node), self.url())) sio.write('First seen in %s\n' % self.url(seen)) else: sio.write('Changeset %s new to %s\n' % (short(node), self.url())) sio.write('Committed by %s at %s\n' % (changes[1], templater.isodate(changes[2]))) sio.write('See %s?cmd=changeset;node=%s for full details\n' % (self.url(), short(node))) sio.write('\nDescription:\n') sio.write(templater.indent(changes[4], ' ')) msg = email.MIMEText.MIMEText(sio.getvalue(), 'plain') firstline = changes[4].lstrip().split('\n', 1)[0].rstrip() subject = '%s %s: %s' % (self.root, self.repo.rev(node), firstline) if seen: subject = '[merge] ' + subject if subject.endswith('.'): subject = subject[:-1] if len(subject) > 67: subject = subject[:64] + '...' msg['Subject'] = subject msg['X-Hg-Repo'] = self.root if '@' in changes[1]: msg['From'] = changes[1] else: msg['From'] = self.ui.config('email', 'from') msg['Message-Id'] = '' % (hex(node), int(time.time()), hash(self.repo.root), socket.getfqdn()) return msg def node(self, node): mail = self.ui.sendmail() changes = self.repo.changelog.read(node) fromaddr = self.ui.config('email', 'from', changes[1]) msg = self.message(node, changes) subs = self.subscribers() msg['To'] = ', '.join(subs) msgtext = msg.as_string(0) mail.sendmail(templater.email(fromaddr), [templater.email(s) for s in subs], msgtext) def hook(ui, repo, hooktype, node=None, **kwargs): n = notifier(ui, repo) n.node(bin(node))