diff --git a/hgext/notify.py b/hgext/notify.py --- a/hgext/notify.py +++ b/hgext/notify.py @@ -106,6 +106,7 @@ class notifier(object): self.stripcount = int(self.ui.config('notify', 'strip', 0)) self.root = self.strip(self.repo.root) self.domain = self.ui.config('notify', 'domain') + self.charsets = mail._charsets(self.ui) self.subs = self.subscribers() mapfile = self.ui.config('notify', 'style') @@ -156,7 +157,8 @@ class notifier(object): if fnmatch.fnmatch(self.repo.root, pat): for user in users.split(','): subs[self.fixmail(user)] = 1 - return util.sort(subs) + subs = util.sort(subs) + return [mail.addressencode(self.ui, s, self.charsets) for s in subs] def url(self, path=None): return self.ui.config('web', 'baseurl') + (path or self.root) @@ -180,10 +182,16 @@ class notifier(object): p = email.Parser.Parser() msg = p.parsestr(data) - def fix_subject(): + # store sender and subject + sender, subject = msg['From'], msg['Subject'] + # create fresh mime message from msg body + text = msg.get_payload() + # for notification prefer readability over data precision + msg = mail.mimeencode(self.ui, text, self.charsets) + + def fix_subject(subject): '''try to make subject line exist and be useful.''' - subject = msg['Subject'] if not subject: if count > 1: subject = _('%s: %d new changesets') % (self.root, count) @@ -194,23 +202,20 @@ class notifier(object): maxsubject = int(self.ui.config('notify', 'maxsubject', 67)) if maxsubject and len(subject) > maxsubject: subject = subject[:maxsubject-3] + '...' - del msg['Subject'] - msg['Subject'] = subject + msg['Subject'] = mail.headencode(self.ui, subject, self.charsets) - def fix_sender(): + def fix_sender(sender): '''try to make message have proper sender.''' - sender = msg['From'] if not sender: sender = self.ui.config('email', 'from') or self.ui.username() if '@' not in sender or '@localhost' in sender: sender = self.fixmail(sender) - del msg['From'] - msg['From'] = sender + msg['From'] = mail.addressencode(self.ui, sender, self.charsets) msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2") - fix_subject() - fix_sender() + fix_subject(subject) + fix_sender(sender) msg['X-Hg-Notification'] = 'changeset ' + short(node) if not msg['Message-Id']: diff --git a/tests/test-keyword b/tests/test-keyword --- a/tests/test-keyword +++ b/tests/test-keyword @@ -104,7 +104,7 @@ diffstat = False EOF echo % pull from bundle -hg pull -u ../kw.hg 2>&1 | sed -e '/^Date:/,/^diffs (/ d' +hg pull -u ../kw.hg 2>&1 | sed -e '/^Content-Type:/,/^diffs (/ d' echo % remove notify config sed -e '/\[hooks\]/,$ d' $HGRCPATH > $HGRCPATH.nonotify diff --git a/tests/test-notify-changegroup.out b/tests/test-notify-changegroup.out --- a/tests/test-notify-changegroup.out +++ b/tests/test-notify-changegroup.out @@ -11,6 +11,9 @@ adding changesets adding manifests adding file changes added 2 changesets with 2 changes to 1 files +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit Date: Subject: test-notify-changegroup/a: 2 new changesets From: test diff --git a/tests/test-notify.out b/tests/test-notify.out --- a/tests/test-notify.out +++ b/tests/test-notify.out @@ -14,6 +14,9 @@ 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 @@ -45,6 +48,9 @@ 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: b From: test@test.com @@ -72,6 +78,9 @@ 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: b From: test@test.com