notify extension - hooks for sending email notifications at commit/push time Subscriptions can be managed through a hgrc file. Default mode is to print messages to stdout, for testing and configuring. To use, configure the notify extension and enable it in hgrc like this: [extensions] notify = [hooks] # one email for each incoming changeset incoming.notify = python:hgext.notify.hook # batch emails when many changesets incoming at one time changegroup.notify = python:hgext.notify.hook [notify] # config items go here Required configuration items: config = /path/to/file # file containing subscriptions Optional configuration items: test = True # print messages to stdout for testing strip = 3 # number of slashes to strip for url paths domain = example.com # domain to use if committer missing domain style = ... # style file to use when formatting email template = ... # template to use when formatting email incoming = ... # template to use when run as incoming hook changegroup = ... # template when run as changegroup hook maxdiff = 300 # max lines of diffs to include (0=none, -1=all) maxsubject = 67 # truncate subject line longer than this diffstat = True # add a diffstat before the diff content sources = serve # notify if source of incoming changes in this list # (serve == ssh or http, push, pull, bundle) merge = False # send notification for merges (default True) [email] from = user@host.com # email address to send as if none given [web] baseurl = http://hgserver/... # root of hg web site for browsing commits The notify config file has same format as a regular hgrc file. It has two sections so you can express subscriptions in whatever way is handier for you. [usersubs] # key is subscriber email, value is ","-separated list of glob patterns user@host = pattern [reposubs] # key is glob pattern, value is ","-separated list of subscriber emails pattern = user@host Glob patterns are matched against path to repository root. If you like, you can put notify config file in repository that users can push changes to, they can manage their own subscriptions. no commands defined % commit adding a % clone updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % commit % pull (minimal config) pulling from ../a searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Date: Subject: changeset in test-notify/b: b From: test X-Hg-Notification: changeset 0647d048b600 Message-Id: To: baz, foo@bar changeset 0647d048b600 in test-notify/b details: test-notify/b?cmd=changeset;node=0647d048b600 description: b diffs (6 lines): diff -r cb9a9f314b8b -r 0647d048b600 a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:01 1970 +0000 @@ -1,1 +1,2 @@ a +a (run 'hg update' to get a working copy) % fail for config file is missing rolling back last transaction pull failed % pull rolling back last transaction pulling from ../a searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Test: foo Date: Subject: b From: test@test.com X-Hg-Notification: changeset 0647d048b600 Message-Id: To: baz@test.com, foo@bar changeset 0647d048b600 description: b diffs (6 lines): diff -r cb9a9f314b8b -r 0647d048b600 a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:01 1970 +0000 @@ -1,1 +1,2 @@ a +a (run 'hg update' to get a working copy) % pull rolling back last transaction pulling from ../a searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Test: foo Date: Subject: b From: test@test.com X-Hg-Notification: changeset 0647d048b600 Message-Id: To: baz@test.com, foo@bar changeset 0647d048b600 description: b diffstat: a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (6 lines): diff -r cb9a9f314b8b -r 0647d048b600 a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:01 1970 +0000 @@ -1,1 +1,2 @@ a +a (run 'hg update' to get a working copy) % test merge 1 files updated, 0 files merged, 0 files removed, 0 files unresolved created new head 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) pulling from ../a searching for changes adding changesets adding manifests adding file changes added 2 changesets with 0 changes to 0 files Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Test: foo Date: Subject: adda2 From: test@test.com X-Hg-Notification: changeset 0a184ce6067f Message-Id: To: baz@test.com, foo@bar changeset 0a184ce6067f description: adda2 diffstat: a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (6 lines): diff -r cb9a9f314b8b -r 0a184ce6067f a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:02 1970 +0000 @@ -1,1 +1,2 @@ a +a Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Test: foo Date: Subject: merge From: test@test.com X-Hg-Notification: changeset 22c88b85aa27 Message-Id: To: baz@test.com, foo@bar changeset 22c88b85aa27 description: merge (run 'hg update' to get a working copy)