mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 23:38:50 +03:00
96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
|
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'] = '<hg.%s.%s.%s@%s>' % (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))
|