annotate hgext/notify.py @ 48717:ae27a0684e75

notify: don't produce errors if a revision is not found Notify extension has a way to only subscribe to a specific revset, such as "branch(foo)". Before this patch, when there was no branch with that name, it would produce a traceback saying "unknown revision: foo". With this patch it would no longer do that, and instead it'll assume there are no revisions that match this revset. I think this patch is an improvement in general, but there's a reason I'm sending it now. test-notify.t has a test case where it obsoletes the only revision on a branch, and previously that wouldn't produce any complications, because head computation wasn't obsolescence-aware. Now if the only revision on a branch is obsolete, repo should not see that branch at all. That branch will still be present in branchcache (with an empty list of revisions) until the next patch. Differential Revision: https://phab.mercurial-scm.org/D12134
author Anton Shestakov <av6@dwimlabs.net>
date Sun, 06 Feb 2022 19:14:51 +0300
parents 89a2afe31e82
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
1 # notify.py - email notifications for mercurial
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
2 #
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
3 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8154
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10112
diff changeset
6 # GNU General Public License version 2 or any later version.
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
7
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
8 '''hooks for sending email push notifications
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
9
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
10 This extension implements hooks to send email notifications when
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
11 changesets are sent from or received by the local repository.
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
12
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
13 First, enable the extension as explained in :hg:`help extensions`, and
16500
8436a4e21417 doc: fix careless document miss in help of hgext/notify
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15654
diff changeset
14 register the hook you want to run. ``incoming`` and ``changegroup`` hooks
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
15 are run when changesets are received, while ``outgoing`` hooks are for
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
16 changesets sent to another repository::
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
17
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
18 [hooks]
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
19 # one email for each incoming changeset
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
20 incoming.notify = python:hgext.notify.hook
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
21 # one email for all incoming changesets
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
22 changegroup.notify = python:hgext.notify.hook
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
23
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
24 # one email for all outgoing changesets
14617
23f4e1e40988 notify: send changesets on 'outgoing' hook, updated doc
Ingo Bressler <dev@ingobressler.net>
parents: 13878
diff changeset
25 outgoing.notify = python:hgext.notify.hook
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
26
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
27 This registers the hooks. To enable notification, subscribers must
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
28 be assigned to repositories. The ``[usersubs]`` section maps multiple
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
29 repositories to a given recipient. The ``[reposubs]`` section maps
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
30 multiple recipients to a single repository::
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
31
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
32 [usersubs]
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
33 # key is subscriber email, value is a comma-separated list of repo patterns
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
34 user@host = pattern
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
35
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
36 [reposubs]
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
37 # key is repo pattern, value is a comma-separated list of subscriber emails
9105
6188f2cc4a37 notify: fix indentation in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 9104
diff changeset
38 pattern = user@host
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
39
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
40 A ``pattern`` is a ``glob`` matching the absolute path to a repository,
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
41 optionally combined with a revset expression. A revset expression, if
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
42 present, is separated from the glob by a hash. Example::
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
43
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
44 [reposubs]
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
45 */widgets#branch(release) = qa-team@example.com
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
46
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
47 This sends to ``qa-team@example.com`` whenever a changeset on the ``release``
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
48 branch triggers a notification in any repository ending in ``widgets``.
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
49
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
50 In order to place them under direct user management, ``[usersubs]`` and
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
51 ``[reposubs]`` sections may be placed in a separate ``hgrc`` file and
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
52 incorporated by reference::
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
53
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
54 [notify]
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
55 config = /path/to/subscriptionsfile
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
56
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
57 Notifications will not be sent until the ``notify.test`` value is set
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
58 to ``False``; see below.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
59
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
60 Notifications content can be tweaked with the following configuration entries:
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
61
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
62 notify.test
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
63 If ``True``, print messages to stdout instead of sending them. Default: True.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
64
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
65 notify.sources
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
66 Space-separated list of change sources. Notifications are activated only
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
67 when a changeset's source is in this list. Sources may be:
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
68
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
69 :``serve``: changesets received via http or ssh
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
70 :``pull``: changesets received via ``hg pull``
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
71 :``unbundle``: changesets received via ``hg unbundle``
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
72 :``push``: changesets sent or received via ``hg push``
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
73 :``bundle``: changesets sent via ``hg unbundle``
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
74
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
75 Default: serve.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
76
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
77 notify.strip
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
78 Number of leading slashes to strip from url paths. By default, notifications
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
79 reference repositories with their absolute path. ``notify.strip`` lets you
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
80 turn them into relative paths. For example, ``notify.strip=3`` will change
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
81 ``/long/path/repository`` into ``repository``. Default: 0.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
82
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
83 notify.domain
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
84 Default email domain for sender or recipients with no explicit domain.
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
85 It is also used for the domain part of the ``Message-Id`` when using
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
86 ``notify.messageidseed``.
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
87
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
88 notify.messageidseed
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
89 Create deterministic ``Message-Id`` headers for the mails based on the seed
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
90 and the revision identifier of the first commit in the changeset.
7127
9df67ee30ef5 help: better documentation intro for a few extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7116
diff changeset
91
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
92 notify.style
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
93 Style file to use when formatting emails.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
94
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
95 notify.template
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
96 Template to use when formatting emails.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
97
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
98 notify.incoming
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
99 Template to use when run as an incoming hook, overriding ``notify.template``.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
100
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
101 notify.outgoing
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
102 Template to use when run as an outgoing hook, overriding ``notify.template``.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
103
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
104 notify.changegroup
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
105 Template to use when running as a changegroup hook, overriding
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
106 ``notify.template``.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
107
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
108 notify.maxdiff
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
109 Maximum number of diff lines to include in notification email. Set to 0
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
110 to disable the diff, or -1 to include all of it. Default: 300.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
111
37777
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
112 notify.maxdiffstat
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
113 Maximum number of diffstat lines to include in notification email. Set to -1
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
114 to include all of it. Default: -1.
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
115
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
116 notify.maxsubject
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
117 Maximum number of characters in email's subject line. Default: 67.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
118
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
119 notify.diffstat
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
120 Set to True to include a diffstat before diff content. Default: True.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
121
38028
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
122 notify.showfunc
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
123 If set, override ``diff.showfunc`` for the diff content. Default: None.
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
124
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
125 notify.merge
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
126 If True, send notifications for merge changesets. Default: True.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
127
15561
ca572e94d8e7 notify: add option for writing to mbox
Mads Kiilerich <mads@kiilerich.com>
parents: 14940
diff changeset
128 notify.mbox
ca572e94d8e7 notify: add option for writing to mbox
Mads Kiilerich <mads@kiilerich.com>
parents: 14940
diff changeset
129 If set, append mails to this mbox file instead of sending. Default: None.
ca572e94d8e7 notify: add option for writing to mbox
Mads Kiilerich <mads@kiilerich.com>
parents: 14940
diff changeset
130
15654
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
131 notify.fromauthor
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
132 If set, use the committer of the first changeset in a changegroup for
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
133 the "From" field of the notification mail. If not set, take the user
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
134 from the pushing repo. Default: False.
15654
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
135
44627
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
136 notify.reply-to-predecessor (EXPERIMENTAL)
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
137 If set and the changeset has a predecessor in the repository, try to thread
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
138 the notification mail with the predecessor. This adds the "In-Reply-To" header
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
139 to the notification mail with a reference to the predecessor with the smallest
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
140 revision number. Mail threads can still be torn, especially when changesets
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
141 are folded.
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
142
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
143 This option must be used in combination with ``notify.messageidseed``.
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
144
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
145 If set, the following entries will also be used to customize the
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
146 notifications:
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
147
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
148 email.from
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
149 Email ``From`` address to use if none can be found in the generated
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
150 email content.
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
151
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
152 web.baseurl
16950
0fdd8193c8b5 notify: various fixes to docstring
David Champion <dgc@uchicago.edu>
parents: 16500
diff changeset
153 Root repository URL to combine with repository paths when making
14940
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
154 references. See also ``notify.strip``.
d78b92353f26 notify: rewrite user documentation
Patrick Mezard <pmezard@gmail.com>
parents: 14869
diff changeset
155
9068
27a41250a9ce notify: wrapped docstrings at 78 characters
Martin Geisler <mg@lazybytes.net>
parents: 8935
diff changeset
156 '''
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
157 from __future__ import absolute_import
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
158
40290
091f9b8a1051 notify: just use email.errors
Yuya Nishihara <yuya@tcha.org>
parents: 40284
diff changeset
159 import email.errors as emailerrors
43327
ac33550f63e8 py3: use stdlib's parseaddr() to get sender header in notify extension
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43326
diff changeset
160 import email.utils as emailutils
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
161 import fnmatch
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
162 import hashlib
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
163 import socket
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
164 import time
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
165
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28951
diff changeset
166 from mercurial.i18n import _
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
167 from mercurial import (
40304
f6ef89cf8234 notify: a ton of encoding dancing to deal with the email module
Augie Fackler <augie@google.com>
parents: 40290
diff changeset
168 encoding,
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
169 error,
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35633
diff changeset
170 logcmdutil,
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
171 mail,
44627
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
172 obsutil,
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
173 patch,
43164
c32531444cdc notify: cast hash to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
174 pycompat,
33738
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
175 registrar,
28416
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
176 util,
d3c8183f429e notify: use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
177 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
178 from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
179 dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
180 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
181 )
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
182
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29240
diff changeset
183 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
184 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
185 # be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
186 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
187 testedwith = b'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16683
diff changeset
188
33738
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
189 configtable = {}
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
190 configitem = registrar.configitem(configtable)
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
191
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
192 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
193 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
194 b'changegroup',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
195 default=None,
34754
a0a727104eed configitem: register the 'notify.changegroup' config
Boris Feld <boris.feld@octobus.net>
parents: 34753
diff changeset
196 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
197 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
198 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
199 b'config',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
200 default=None,
33738
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
201 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
202 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
203 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
204 b'diffstat',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
205 default=True,
33739
b30da11d9233 configitems: register the 'notify.diffstat' config
Boris Feld <boris.feld@octobus.net>
parents: 33738
diff changeset
206 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
207 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
208 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
209 b'domain',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
210 default=None,
33740
a853325102a0 configitems: register the 'notify.domain' config
Boris Feld <boris.feld@octobus.net>
parents: 33739
diff changeset
211 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
212 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
213 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
214 b'messageidseed',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
215 default=None,
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
216 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
217 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
218 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
219 b'fromauthor',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
220 default=None,
33741
b14be4deac06 configitems: register the 'notify.fromauthor' config
Boris Feld <boris.feld@octobus.net>
parents: 33740
diff changeset
221 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
222 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
223 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
224 b'incoming',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
225 default=None,
34752
b811f06b144d configitem: register the 'notify.incoming' config
Boris Feld <boris.feld@octobus.net>
parents: 33750
diff changeset
226 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
227 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
228 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
229 b'maxdiff',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
230 default=300,
33742
66860180b009 configitems: register the 'notify.maxdiff' config
Boris Feld <boris.feld@octobus.net>
parents: 33741
diff changeset
231 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
232 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
233 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
234 b'maxdiffstat',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
235 default=-1,
37777
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
236 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
237 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
238 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
239 b'maxsubject',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
240 default=67,
33743
3d08f4810690 configitems: register the 'notify.maxsubject' config
Boris Feld <boris.feld@octobus.net>
parents: 33742
diff changeset
241 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
242 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
243 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
244 b'mbox',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
245 default=None,
33744
b76dc3e6bf99 configitems: register the 'notify.mbox' config
Boris Feld <boris.feld@octobus.net>
parents: 33743
diff changeset
246 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
247 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
248 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
249 b'merge',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
250 default=True,
33745
8bf8ed0deab8 configitems: register the 'notify.merge' config
Boris Feld <boris.feld@octobus.net>
parents: 33744
diff changeset
251 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
252 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
253 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
254 b'outgoing',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
255 default=None,
34753
12a69c806382 configitem: register the 'notify.outgoing' config
Boris Feld <boris.feld@octobus.net>
parents: 34752
diff changeset
256 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
257 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
258 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
259 b'reply-to-predecessor',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
260 default=False,
44627
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
261 )
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
262 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
263 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
264 b'sources',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
265 default=b'serve',
33746
20189ba5fddf configitems: register the 'notify.sources' config
Boris Feld <boris.feld@octobus.net>
parents: 33745
diff changeset
266 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
267 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
268 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
269 b'showfunc',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
270 default=None,
38028
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
271 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
272 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
273 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
274 b'strip',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
275 default=0,
33747
71665bbe82c1 configitems: register the 'notify.strip' config
Boris Feld <boris.feld@octobus.net>
parents: 33746
diff changeset
276 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
277 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
278 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
279 b'style',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
280 default=None,
33748
c27fac1ca8ed configitems: register the 'notify.style' config
Boris Feld <boris.feld@octobus.net>
parents: 33747
diff changeset
281 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
282 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
283 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
284 b'template',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
285 default=None,
33749
ff4a11ff7aa3 configitems: register the 'notify.template' config
Boris Feld <boris.feld@octobus.net>
parents: 33748
diff changeset
286 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
287 configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
288 b'notify',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
289 b'test',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
290 default=True,
33750
a0e28577f7d4 configitems: register the 'notify.test' config
Boris Feld <boris.feld@octobus.net>
parents: 33749
diff changeset
291 )
33738
2069a8c336b9 configitems: register the 'notify.config' config
Boris Feld <boris.feld@octobus.net>
parents: 32839
diff changeset
292
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
293 # template for single changeset can include email headers.
40283
c7a363ca04b9 notify: add some b prefixes
Augie Fackler <augie@google.com>
parents: 38028
diff changeset
294 single_template = b'''
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
295 Subject: changeset in {webroot}: {desc|firstline|strip}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
296 From: {author}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
297
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
298 changeset {node|short} in {root}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
299 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
300 description:
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
301 \t{desc|tabindent|strip}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
302 '''.lstrip()
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
303
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
304 # template for multiple changesets should not contain email headers,
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
305 # because only first set of headers will be used and result will look
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
306 # strange.
40283
c7a363ca04b9 notify: add some b prefixes
Augie Fackler <augie@google.com>
parents: 38028
diff changeset
307 multiple_template = b'''
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
308 changeset {node|short} in {root}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
309 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
310 summary: {desc|firstline}
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
311 '''
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
312
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
313 deftemplates = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
314 b'changegroup': multiple_template,
4498
4dfb9f232a63 Fixed indentation in hgext/notify.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4479
diff changeset
315 }
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
316
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
317
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
318 class notifier(object):
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
319 '''email notification class.'''
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
320
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
321 def __init__(self, ui, repo, hooktype):
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
322 self.ui = ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
323 cfg = self.ui.config(b'notify', b'config')
2329
90368f89340a notify: add debug output. do not fail if no config file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2326
diff changeset
324 if cfg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
325 self.ui.readconfig(cfg, sections=[b'usersubs', b'reposubs'])
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
326 self.repo = repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
327 self.stripcount = int(self.ui.config(b'notify', b'strip'))
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
328 self.root = self.strip(self.repo.root)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 self.domain = self.ui.config(b'notify', b'domain')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
330 self.mbox = self.ui.config(b'notify', b'mbox')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
331 self.test = self.ui.configbool(b'notify', b'test')
7116
e981725da3fe notify: mime-encode messages
Christian Ebert <blacktrash@gmx.net>
parents: 6979
diff changeset
332 self.charsets = mail._charsets(self.ui)
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
333 self.subs = self.subscribers()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
334 self.merge = self.ui.configbool(b'notify', b'merge')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
335 self.showfunc = self.ui.configbool(b'notify', b'showfunc')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 self.messageidseed = self.ui.config(b'notify', b'messageidseed')
44627
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
337 self.reply = self.ui.configbool(b'notify', b'reply-to-predecessor')
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
338
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
339 if self.reply and not self.messageidseed:
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
340 raise error.Abort(
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
341 _(
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
342 b'notify.reply-to-predecessor used without '
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
343 b'notify.messageidseed'
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
344 )
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
345 )
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
346
38028
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
347 if self.showfunc is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
348 self.showfunc = self.ui.configbool(b'diff', b'showfunc')
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
349
28951
1bba1b43525a notify: do not load style file if template is specified (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 28416
diff changeset
350 mapfile = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
351 template = self.ui.config(b'notify', hooktype) or self.ui.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
352 b'notify', b'template'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
353 )
28951
1bba1b43525a notify: do not load style file if template is specified (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 28416
diff changeset
354 if not template:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
355 mapfile = self.ui.config(b'notify', b'style')
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
356 if not mapfile and not template:
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
357 template = deftemplates.get(hooktype) or single_template
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35633
diff changeset
358 spec = logcmdutil.templatespec(template, mapfile)
35954
386c1e45e671 logcmdutil: drop default arguments from changesetdisplayer/templater() calls
Yuya Nishihara <yuya@tcha.org>
parents: 35888
diff changeset
359 self.t = logcmdutil.changesettemplater(self.ui, self.repo, spec)
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
360
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
361 def strip(self, path):
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
362 '''strip leading slashes from local path, turn into web-safe path.'''
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
363
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
364 path = util.pconvert(path)
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
365 count = self.stripcount
2326
d0ba2f6b9d97 notify: fix off by one error.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2296
diff changeset
366 while count > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
367 c = path.find(b'/')
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
368 if c == -1:
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
369 break
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
370 path = path[c + 1 :]
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
371 count -= 1
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
372 return path
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
373
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
374 def fixmail(self, addr):
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
375 '''try to clean up email addresses.'''
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
376
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
377 addr = stringutil.email(addr.strip())
4094
fbf0e9acfd83 notify: don't try to fix addresses if notify.domain is not set
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4077
diff changeset
378 if self.domain:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
379 a = addr.find(b'@localhost')
4094
fbf0e9acfd83 notify: don't try to fix addresses if notify.domain is not set
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4077
diff changeset
380 if a != -1:
fbf0e9acfd83 notify: don't try to fix addresses if notify.domain is not set
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4077
diff changeset
381 addr = addr[:a]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
382 if b'@' not in addr:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
383 return addr + b'@' + self.domain
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
384 return addr
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
385
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
386 def subscribers(self):
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
387 '''return list of email addresses of subscribers to this repo.'''
8154
06f1e4e309ed notify: turned a set-like dict into a real set
Martin Geisler <mg@lazybytes.net>
parents: 8142
diff changeset
388 subs = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
389 for user, pats in self.ui.configitems(b'usersubs'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
390 for pat in pats.split(b','):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
391 if b'#' in pat:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
392 pat, revs = pat.split(b'#', 1)
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
393 else:
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
394 revs = None
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
395 if fnmatch.fnmatch(self.repo.root, pat.strip()):
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
396 subs.add((self.fixmail(user), revs))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
397 for pat, users in self.ui.configitems(b'reposubs'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
398 if b'#' in pat:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
399 pat, revs = pat.split(b'#', 1)
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
400 else:
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
401 revs = None
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
402 if fnmatch.fnmatch(self.repo.root, pat):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
403 for user in users.split(b','):
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
404 subs.add((self.fixmail(user), revs))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
405 return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
406 (mail.addressencode(self.ui, s, self.charsets, self.test), r)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
407 for s, r in sorted(subs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
408 ]
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
409
9486
dd8d10c36c9c notify: make it possible to pass extra info into templates
Bryan O'Sullivan <bos@serpentine.com>
parents: 9327
diff changeset
410 def node(self, ctx, **props):
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
411 '''format one changeset, unless it is a suppressed merge.'''
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
412 if not self.merge and len(ctx.parents()) > 1:
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
413 return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
414 self.t.show(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
415 ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
416 changes=ctx.changeset(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
417 baseurl=self.ui.config(b'web', b'baseurl'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
418 root=self.repo.root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
419 webroot=self.root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
420 **props
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
421 )
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
422 return True
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
423
2230
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
424 def skipsource(self, source):
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
425 '''true if incoming changes from this source should be skipped.'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 ok_sources = self.ui.config(b'notify', b'sources').split()
2230
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
427 return source not in ok_sources
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
428
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
429 def send(self, ctx, count, data):
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
430 '''send message.'''
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
431
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
432 # Select subscribers by revset
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
433 subs = set()
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
434 for sub, spec in self.subs:
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
435 if spec is None:
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
436 subs.add(sub)
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
437 continue
48717
ae27a0684e75 notify: don't produce errors if a revision is not found
Anton Shestakov <av6@dwimlabs.net>
parents: 45942
diff changeset
438 try:
ae27a0684e75 notify: don't produce errors if a revision is not found
Anton Shestakov <av6@dwimlabs.net>
parents: 45942
diff changeset
439 revs = self.repo.revs(b'%r and %d:', spec, ctx.rev())
ae27a0684e75 notify: don't produce errors if a revision is not found
Anton Shestakov <av6@dwimlabs.net>
parents: 45942
diff changeset
440 except error.RepoLookupError:
ae27a0684e75 notify: don't produce errors if a revision is not found
Anton Shestakov <av6@dwimlabs.net>
parents: 45942
diff changeset
441 continue
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
442 if len(revs):
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
443 subs.add(sub)
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
444 continue
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
445 if len(subs) == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
446 self.ui.debug(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
447 b'notify: no subscribers to selected repo and revset\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
448 )
17754
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
449 return
19e9bf7c0927 notify: support revset selection for subscriptions
Michal Sznajder <michalsznajder@gmail.com>
parents: 16951
diff changeset
450
9313
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
451 try:
43326
ef81de93143e py3: use a BytesParser in notify extension
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43322
diff changeset
452 msg = mail.parsebytes(data)
40284
46b55f279571 notify: adapt to new location of email module's errors
Augie Fackler <augie@google.com>
parents: 40283
diff changeset
453 except emailerrors.MessageParseError as inst:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26503
diff changeset
454 raise error.Abort(inst)
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
455
7116
e981725da3fe notify: mime-encode messages
Christian Ebert <blacktrash@gmx.net>
parents: 6979
diff changeset
456 # store sender and subject
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
457 sender = msg['From']
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
458 subject = msg['Subject']
41404
43f9b8c0574b notify: be more defensive aboute None values
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40304
diff changeset
459 if sender is not None:
43328
416041f97cc3 py3: decode email headers with mail.headdecode() in notify extension
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43327
diff changeset
460 sender = mail.headdecode(sender)
41404
43f9b8c0574b notify: be more defensive aboute None values
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40304
diff changeset
461 if subject is not None:
43328
416041f97cc3 py3: decode email headers with mail.headdecode() in notify extension
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43327
diff changeset
462 subject = mail.headdecode(subject)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
463 del msg['From'], msg['Subject']
9313
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
464
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
465 if not msg.is_multipart():
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
466 # create fresh mime message from scratch
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
467 # (multipart templates must take care of this themselves)
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
468 headers = msg.items()
43329
33506cb43642 py3: decode payload of notify email
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43328
diff changeset
469 payload = msg.get_payload(decode=pycompat.ispy3)
9313
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
470 # for notification prefer readability over data precision
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
471 msg = mail.mimeencode(self.ui, payload, self.charsets, self.test)
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
472 # reinstate custom headers
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
473 for k, v in headers:
8736b1c853ff notify: do not mime encode multipart templates
Christian Ebert <blacktrash@gmx.net>
parents: 8935
diff changeset
474 msg[k] = v
7116
e981725da3fe notify: mime-encode messages
Christian Ebert <blacktrash@gmx.net>
parents: 6979
diff changeset
475
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
476 msg['Date'] = encoding.strfromlocal(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
477 dateutil.datestr(format=b"%a, %d %b %Y %H:%M:%S %1%2")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
478 )
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
479
7705
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
480 # try to make subject line exist and be useful
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
481 if not subject:
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
482 if count > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
483 subject = _(b'%s: %d new changesets') % (self.root, count)
7705
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
484 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
485 s = ctx.description().lstrip().split(b'\n', 1)[0].rstrip()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
486 subject = b'%s: %s' % (self.root, s)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
487 maxsubject = int(self.ui.config(b'notify', b'maxsubject'))
13202
d83566f4453b notify: use util.ellipsis() to truncate long subject
Yuya Nishihara <yuya@tcha.org>
parents: 10282
diff changeset
488 if maxsubject:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
489 subject = stringutil.ellipsis(subject, maxsubject)
43575
67b4439c09b2 mail: let headencode() return a native string
Denis Laxalde <denis@laxalde.org>
parents: 43506
diff changeset
490 msg['Subject'] = mail.headencode(
67b4439c09b2 mail: let headencode() return a native string
Denis Laxalde <denis@laxalde.org>
parents: 43506
diff changeset
491 self.ui, subject, self.charsets, self.test
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
492 )
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
493
7705
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
494 # try to make message have proper sender
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
495 if not sender:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
496 sender = self.ui.config(b'email', b'from') or self.ui.username()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
497 if b'@' not in sender or b'@localhost' in sender:
7705
c55e68e8f256 notify: remove subfunctions that are called only once
Christian Ebert <blacktrash@gmx.net>
parents: 7658
diff changeset
498 sender = self.fixmail(sender)
43576
14b96072797d mail: let addressencode() / addrlistencode() return native strings
Denis Laxalde <denis@laxalde.org>
parents: 43575
diff changeset
499 msg['From'] = mail.addressencode(
14b96072797d mail: let addressencode() / addrlistencode() return native strings
Denis Laxalde <denis@laxalde.org>
parents: 43575
diff changeset
500 self.ui, sender, self.charsets, self.test
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
501 )
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
502
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
503 msg['X-Hg-Notification'] = 'changeset %s' % ctx
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
504 if not msg['Message-Id']:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
505 msg['Message-Id'] = messageid(ctx, self.domain, self.messageidseed)
44627
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
506 if self.reply:
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
507 unfi = self.repo.unfiltered()
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
508 has_node = unfi.changelog.index.has_node
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
509 predecessors = [
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
510 unfi[ctx2]
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
511 for ctx2 in obsutil.allpredecessors(unfi.obsstore, [ctx.node()])
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
512 if ctx2 != ctx.node() and has_node(ctx2)
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
513 ]
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
514 if predecessors:
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
515 # There is at least one predecessor, so which to pick?
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
516 # Ideally, there is a unique root because changesets have
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
517 # been evolved/rebased one step at a time. In this case,
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
518 # just picking the oldest known changeset provides a stable
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
519 # base. It doesn't help when changesets are folded. Any
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
520 # better solution would require storing more information
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
521 # in the repository.
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
522 pred = min(predecessors, key=lambda ctx: ctx.rev())
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
523 msg['In-Reply-To'] = messageid(
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
524 pred, self.domain, self.messageidseed
947e6df4ff77 notify: optional mail threading based on obsmarker
Joerg Sonnenberger <joerg@bec.de>
parents: 43576
diff changeset
525 )
43576
14b96072797d mail: let addressencode() / addrlistencode() return native strings
Denis Laxalde <denis@laxalde.org>
parents: 43575
diff changeset
526 msg['To'] = ', '.join(sorted(subs))
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
527
43322
7d912413a3ae py3: use as_bytes() method of EmailMessage
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43164
diff changeset
528 msgtext = msg.as_bytes() if pycompat.ispy3 else msg.as_string()
7498
64840fcb79e1 notify: no charset conversion when testing
Christian Ebert <blacktrash@gmx.net>
parents: 7369
diff changeset
529 if self.test:
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
530 self.ui.write(msgtext)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
531 if not msgtext.endswith(b'\n'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
532 self.ui.write(b'\n')
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
533 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
534 self.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
535 _(b'notify: sending %d subscribers %d changes\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
536 % (len(subs), count)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
537 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
538 mail.sendmail(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
539 self.ui,
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43329
diff changeset
540 emailutils.parseaddr(msg['From'])[1],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
541 subs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
542 msgtext,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
543 mbox=self.mbox,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
544 )
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
545
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
546 def diff(self, ctx, ref=None):
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
547
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
548 maxdiff = int(self.ui.config(b'notify', b'maxdiff'))
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13202
diff changeset
549 prev = ctx.p1().node()
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23454
diff changeset
550 if ref:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23454
diff changeset
551 ref = ref.node()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23454
diff changeset
552 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23454
diff changeset
553 ref = ctx.node()
38028
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
554 diffopts = patch.diffallopts(self.ui)
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
555 diffopts.showfunc = self.showfunc
d1134ca5b1a3 notify: add option to include function names in the diff output
Joerg Sonnenberger <joerg@bec.de>
parents: 37795
diff changeset
556 chunks = patch.diff(self.repo, prev, ref, opts=diffopts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
557 difflines = b''.join(chunks).splitlines()
6979
a3fd4aa154af notify: fix diffstat printing
divy@chelsio.com
parents: 6974
diff changeset
558
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 if self.ui.configbool(b'notify', b'diffstat'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
560 maxdiffstat = int(self.ui.config(b'notify', b'maxdiffstat'))
3096
f422c8265ae5 Add support for diffstat in commit emails, and move diffstat from
Matt Doar <matt@xensource.com>
parents: 3017
diff changeset
561 s = patch.diffstat(difflines)
4077
1305ba7dee88 Prevent type exception on concatenation if diffstat returns None.
Sean Dague <sean@dague.net>
parents: 3739
diff changeset
562 # s may be nil, don't include the header if it is
1305ba7dee88 Prevent type exception on concatenation if diffstat returns None.
Sean Dague <sean@dague.net>
parents: 3739
diff changeset
563 if s:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
564 if maxdiffstat >= 0 and s.count(b"\n") > maxdiffstat + 1:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
565 s = s.split(b"\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
566 msg = _(b'\ndiffstat (truncated from %d to %d lines):\n\n')
37777
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
567 self.ui.write(msg % (len(s) - 2, maxdiffstat))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
568 self.ui.write(b"\n".join(s[:maxdiffstat] + s[-2:]))
37777
a4cac7b0ea4f notify: add maxdiffstat option to truncate long file lists
Joerg Sonnenberger <joerg@bec.de>
parents: 37084
diff changeset
569 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
570 self.ui.write(_(b'\ndiffstat:\n\n%s') % s)
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
571
6305
e8d447d91cdb notify: print diffstat even if maxline == 0
Benoît Allard <benoit@aeteurope.nl>
parents: 6229
diff changeset
572 if maxdiff == 0:
e8d447d91cdb notify: print diffstat even if maxline == 0
Benoît Allard <benoit@aeteurope.nl>
parents: 6229
diff changeset
573 return
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
574 elif maxdiff > 0 and len(difflines) > maxdiff:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
575 msg = _(b'\ndiffs (truncated from %d to %d lines):\n\n')
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
576 self.ui.write(msg % (len(difflines), maxdiff))
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
577 difflines = difflines[:maxdiff]
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
578 elif difflines:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
579 self.ui.write(_(b'\ndiffs (%d lines):\n\n') % len(difflines))
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
580
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
581 self.ui.write(b"\n".join(difflines))
2201
f15056b29472 patch queue: notify.patch
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
582
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
583
2230
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
584 def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
585 """send email notifications to interested subscribers.
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
586
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
587 if used as changegroup hook, send one email for all changesets in
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44627
diff changeset
588 changegroup. else send one email per changeset."""
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
589
2203
9569eea1707c add email notification hook. hook written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2201
diff changeset
590 n = notifier(ui, repo, hooktype)
37794
04d648b53e3e notify: access the initial revision on an unfiltered repository (issue5821)
Boris Feld <boris.feld@octobus.net>
parents: 37793
diff changeset
591 ctx = repo.unfiltered()[node]
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
592
2329
90368f89340a notify: add debug output. do not fail if no config file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2326
diff changeset
593 if not n.subs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
594 ui.debug(b'notify: no subscribers to repository %s\n' % n.root)
2329
90368f89340a notify: add debug output. do not fail if no config file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2326
diff changeset
595 return
90368f89340a notify: add debug output. do not fail if no config file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2326
diff changeset
596 if n.skipsource(source):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
597 ui.debug(b'notify: changes have source "%s" - skipping\n' % source)
2230
332950340788 localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2225
diff changeset
598 return
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
599
3739
16f8e7d1dd54 fix notify with new ui buffering
Matt Mackall <mpm@selenic.com>
parents: 3679
diff changeset
600 ui.pushbuffer()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
601 data = b''
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
602 count = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
603 author = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
604 if hooktype == b'changegroup' or hooktype == b'outgoing':
37793
a07fab68621f notify: use changelog API to iterate over revision number (issue5821)
Boris Feld <boris.feld@octobus.net>
parents: 37777
diff changeset
605 for rev in repo.changelog.revs(start=ctx.rev()):
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
606 if n.node(repo[rev]):
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
607 count += 1
15654
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
608 if not author:
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
609 author = repo[rev].user()
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
610 else:
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
611 data += ui.popbuffer()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
612 ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
613 _(b'notify: suppressing notification for merge %d:%s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
614 % (rev, repo[rev].hex()[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
615 )
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
616 ui.pushbuffer()
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
617 if count:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
618 n.diff(ctx, repo[b'tip'])
37795
68748c2c761b notify: only notify for non-filtered revision
Boris Feld <boris.feld@octobus.net>
parents: 37794
diff changeset
619 elif ctx.rev() in repo:
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
620 if not n.node(ctx):
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
621 ui.popbuffer()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
622 ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
623 _(b'notify: suppressing notification for merge %d:%s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
624 % (ctx.rev(), ctx.hex()[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
625 )
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
626 return
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
627 count += 1
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
628 n.diff(ctx)
26503
5a84a453b503 notify: fix fromauthor setting for 'incoming' hook type (issue4194)
Bruce Cran <bruce.cran@gmail.com>
parents: 25660
diff changeset
629 if not author:
5a84a453b503 notify: fix fromauthor setting for 'incoming' hook type (issue4194)
Bruce Cran <bruce.cran@gmail.com>
parents: 25660
diff changeset
630 author = ctx.user()
7726
2486980fe211 notify: use contexts more pervasively
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7705
diff changeset
631
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
632 data += ui.popbuffer()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
633 fromauthor = ui.config(b'notify', b'fromauthor')
15654
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
634 if author and fromauthor:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
635 data = b'\n'.join([b'From: %s' % author, data])
15654
2a7fa7c641d8 notify: change behavior of "changegroup" hook
Nikolaus Schueler <nikolaus.schueler@lantiq.com>
parents: 15561
diff changeset
636
9516
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
637 if count:
f8048c334066 notify: permit suppression of merge changeset notification
David Champion <dgc@uchicago.edu>
parents: 9487
diff changeset
638 n.send(ctx, count, data)
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
639
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
640
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
641 def messageid(ctx, domain, messageidseed):
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
642 if domain and messageidseed:
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
643 host = domain
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
644 else:
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
645 host = encoding.strtolocal(socket.getfqdn())
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
646 if messageidseed:
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
647 messagehash = hashlib.sha512(ctx.hex() + messageidseed)
43164
c32531444cdc notify: cast hash to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
648 messageid = b'<hg.%s@%s>' % (
c32531444cdc notify: cast hash to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
649 pycompat.sysbytes(messagehash.hexdigest()[:64]),
c32531444cdc notify: cast hash to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
650 host,
c32531444cdc notify: cast hash to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
651 )
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
652 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
653 messageid = b'<hg.%s.%d.%d@%s>' % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
654 ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
655 int(time.time()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
656 hash(ctx.repo().root),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
657 host,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42904
diff changeset
658 )
42904
d26a6706b070 notify: add option for deterministic message-id generation
Joerg Sonnenberger <joerg@bec.de>
parents: 41404
diff changeset
659 return encoding.strfromlocal(messageid)