[PATCH] Change behavior of changegroup hook for notify extension

Nikolaus.Schueler at lantiq.com Nikolaus.Schueler at lantiq.com
Thu Dec 15 07:06:30 CST 2011


Hello Matt,

here is my patch again. As suggested by you, I added to the existing "test-notify-changegroup.t" instead of creating a new test. I hope the additions are not too long, but in addition to checking that the feature works, I have to check that the merge user is not taken as sender.

Regards 

Nik

# HG changeset patch
# User Nikolaus Schueler <nikolaus.schueler at lantiq.com>
# Date 1323953874 -3600
# Node ID a1d824a1d63453945ae209021170bd6a9e12e492
# Parent  e6868bd17f24324db347a289bb2ae0120dd5cd54
Notify extension: Change behavior of "changegroup" hook

Change the behavior so that the sender (the "From" header in the notification
mail) in case of the "changegroup" hook is the user that did the first commit
in the changegroup.  The option is configurable, if you set "notify.fromauthor"
to "True" in your config, the new behavior is activated.  If you do not set the
option, the behavior is as before.  The commit adds to an existing test to show
various aspects of the changed behavior.

diff --git a/hgext/notify.py b/hgext/notify.py
--- a/hgext/notify.py
+++ b/hgext/notify.py
@@ -108,6 +108,11 @@ notify.merge
 notify.mbox
   If set, append mails to this mbox file instead of sending. Default: None.
 
+notify.fromauthor
+  If set, use the first committer of the changegroup for the "From" field of
+  the notification mail. If not set, take the user from the pushing repo.
+  Default: False.
+
 If set, the following entries will also be used to customize the notifications:
 
 email.from
@@ -338,11 +343,14 @@ def hook(ui, repo, hooktype, node=None, 
     ui.pushbuffer()
     data = ''
     count = 0
+    author = ''
     if hooktype == 'changegroup' or hooktype == 'outgoing':
         start, end = ctx.rev(), len(repo)
         for rev in xrange(start, end):
             if n.node(repo[rev]):
                 count += 1
+                if not author:
+                    author = repo[rev].user()
             else:
                 data += ui.popbuffer()
                 ui.note(_('notify: suppressing notification for merge %d:%s\n') %
@@ -360,5 +368,9 @@ def hook(ui, repo, hooktype, node=None, 
         n.diff(ctx)
 
     data += ui.popbuffer()
+    fromauthor = ui.config('notify', 'fromauthor')
+    if author and fromauthor:
+        data = '\n'.join(['From: %s' % author, data])
+
     if count:
         n.send(ctx, count, data)
diff --git a/tests/test-notify-changegroup.t b/tests/test-notify-changegroup.t
--- a/tests/test-notify-changegroup.t
+++ b/tests/test-notify-changegroup.t
@@ -124,3 +124,91 @@ unbundle with correct source
   +a
   +a
   (run 'hg update' to get a working copy)
+
+Check that using the first committer as the author of a changeset works:
+Check that the config option works.
+Check that the first committer is indeed used for "From:".
+Check that the merge user is NOT used for "From:"
+
+Create new file
+
+  $ echo a > b/b
+  $ echo b >> b/b
+  $ echo c >> b/b
+  $ hg --traceback --cwd b commit -Amnewfile -u committer_1
+  adding b
+
+commit as one user
+
+  $ echo x > b/b
+  $ echo b >> b/b
+  $ echo c >> b/b
+  $ hg --traceback --cwd b commit -Amx -u committer_2
+
+commit as other user, change file so we can do an (automatic) merge
+
+  $ hg --cwd b up 2
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo a > b/b
+  $ echo b >> b/b
+  $ echo y >> b/b
+  $ hg --traceback --cwd b commit -Amy -u committer_3
+  created new head
+
+merge as a different user
+
+  $ hg --cwd b merge --config notify.fromauthor=True
+  merging b
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+
+  $ hg --traceback --cwd b commit -Am "merged"
+
+push
+
+  $ hg --traceback --cwd b --config notify.fromauthor=True push ../a 2>&1 |
+  >     python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+  pushing to ../a
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 4 changesets with 4 changes to 1 files
+  Content-Type: text/plain; charset="us-ascii"
+  MIME-Version: 1.0
+  Content-Transfer-Encoding: 7bit
+  Date: * (glob)
+  Subject: * (glob)
+  From: committer_1
+  X-Hg-Notification: changeset 84e487dddc58
+  Message-Id: <*> (glob)
+  To: baz, foo at bar
+  
+  changeset 84e487dddc58 in $TESTTMP/a
+  details: $TESTTMP/a?cmd=changeset;node=84e487dddc58
+  summary: newfile
+  
+  changeset b29c7a2b6b0c in $TESTTMP/a
+  details: $TESTTMP/a?cmd=changeset;node=b29c7a2b6b0c
+  summary: x
+  
+  changeset 0957c7d64886 in $TESTTMP/a
+  details: $TESTTMP/a?cmd=changeset;node=0957c7d64886
+  summary: y
+  
+  changeset 485b4e6b0249 in $TESTTMP/a
+  details: $TESTTMP/a?cmd=changeset;node=485b4e6b0249
+  summary: merged
+  
+  diffs (7 lines):
+  
+  diff -r ba677d0156c1 -r 485b4e6b0249 b
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/b	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,3 @@
+  +x
+  +b
+  +y
+  $ hg --cwd a rollback
+  repository tip rolled back to revision 1 (undo push)
+
diff --git a/tests/test-notify.t b/tests/test-notify.t
--- a/tests/test-notify.t
+++ b/tests/test-notify.t
@@ -116,6 +116,11 @@
   notify.mbox
     If set, append mails to this mbox file instead of sending. Default: None.
   
+  notify.fromauthor
+    If set, use the first committer of the changegroup for the "From" field of
+    the notification mail. If not set, take the user from the pushing repo.
+    Default: False.
+  
   If set, the following entries will also be used to customize the
   notifications:
   



More information about the Mercurial-devel mailing list