Mercurial > hg > mercurial-crew-with-dirclash
annotate hgext/patchbomb.py @ 4204:f9bbcebcacea
"default" is the default branch name
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Tue, 13 Mar 2007 15:02:33 -0300 |
parents | ba3e13306f70 |
children | 03e9c22a6489 8e37342cb05d |
rev | line source |
---|---|
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
1 # Command for sending a collection of Mercurial changesets as a series |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
2 # of patch emails. |
875 | 3 # |
4 # The series is started off with a "[PATCH 0 of N]" introduction, | |
5 # which describes the series as a whole. | |
6 # | |
7 # Each patch email has a Subject line of "[PATCH M of N] ...", using | |
8 # the first line of the changeset description as the subject text. | |
9 # The message contains two or three body parts: | |
10 # | |
11 # The remainder of the changeset description. | |
12 # | |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
13 # [Optional] If the diffstat program is installed, the result of |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
14 # running diffstat on the patch. |
875 | 15 # |
16 # The patch itself, as generated by "hg export". | |
17 # | |
18 # Each message refers to all of its predecessors using the In-Reply-To | |
19 # and References headers, so they will show up as a sequence in | |
20 # threaded mail and news readers, and in mail archives. | |
21 # | |
22 # For each changeset, you will be prompted with a diffstat summary and | |
23 # the changeset summary, so you can be sure you are sending the right | |
24 # changes. | |
25 # | |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
26 # To enable this extension: |
875 | 27 # |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
28 # [extensions] |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
29 # hgext.patchbomb = |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
30 # |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
31 # To configure other defaults, add a section like this to your hgrc |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
32 # file: |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
33 # |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
34 # [email] |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
35 # from = My Name <my@email> |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
36 # to = recipient1, recipient2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
37 # cc = cc1, cc2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
38 # bcc = bcc1, bcc2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
39 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
40 # Then you can use the "hg email" command to mail a series of changesets |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
41 # as a patchbomb. |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
42 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
43 # To avoid sending patches prematurely, it is a good idea to first run |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
44 # the "email" command with the "-n" option (test only). You will be |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
45 # prompted for an email recipient address, a subject an an introductory |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
46 # message describing the patches of your patchbomb. Then when all is |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
47 # done, your pager will be fired up once for each patchbomb message, so |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
48 # you can verify everything is alright. |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
49 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
50 # The "-m" (mbox) option is also very useful. Instead of previewing |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
51 # each patchbomb message in a pager or sending the messages directly, |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
52 # it will create a UNIX mailbox file with the patch emails. This |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
53 # mailbox file can be previewed with any mail user agent which supports |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
54 # UNIX mbox files, i.e. with mutt: |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
55 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
56 # % mutt -R -f mbox |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
57 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
58 # When you are previewing the patchbomb messages, you can use `formail' |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
59 # (a utility that is commonly installed as part of the procmail package), |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
60 # to send each message out: |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
61 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
62 # % formail -s sendmail -bm -t < mbox |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
63 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
64 # That should be all. Now your patchbomb is on its way out. |
875 | 65 |
1827
26dd4ae77b7b
get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents:
1702
diff
changeset
|
66 from mercurial.demandload import * |
26dd4ae77b7b
get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents:
1702
diff
changeset
|
67 demandload(globals(), '''email.MIMEMultipart email.MIMEText email.Utils |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
68 mercurial:cmdutil,commands,hg,mail,ui,patch,util |
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
69 os errno popen2 socket sys tempfile''') |
1671
ba30c17d55f6
forgot to add import statement for _.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
70 from mercurial.i18n import gettext as _ |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
71 from mercurial.node import * |
875 | 72 |
1204
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
73 try: |
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
74 # readline gives raw_input editing capabilities, but is not |
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
75 # present on windows |
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
76 import readline |
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
77 except ImportError: pass |
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
78 |
875 | 79 def patchbomb(ui, repo, *revs, **opts): |
1672
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
80 '''send changesets as a series of patch emails |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
81 |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
82 The series starts with a "[PATCH 0 of N]" introduction, which |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
83 describes the series as a whole. |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
84 |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
85 Each patch email has a Subject line of "[PATCH M of N] ...", using |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
86 the first line of the changeset description as the subject text. |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
87 The message contains two or three body parts. First, the rest of |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
88 the changeset description. Next, (optionally) if the diffstat |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
89 program is installed, the result of running diffstat on the patch. |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
90 Finally, the patch itself, as generated by "hg export".''' |
875 | 91 def prompt(prompt, default = None, rest = ': ', empty_ok = False): |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
92 if default: prompt += ' [%s]' % default |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
93 prompt += rest |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
94 while True: |
875 | 95 r = raw_input(prompt) |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
96 if r: return r |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
97 if default is not None: return default |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
98 if empty_ok: return r |
1670
fe19c54ee403
add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1669
diff
changeset
|
99 ui.warn(_('Please enter a valid value.\n')) |
875 | 100 |
101 def confirm(s): | |
102 if not prompt(s, default = 'y', rest = '? ').lower().startswith('y'): | |
103 raise ValueError | |
104 | |
3093
f422c8265ae5
Add support for diffstat in commit emails, and move diffstat from
Matt Doar <matt@xensource.com>
parents:
3051
diff
changeset
|
105 def cdiffstat(summary, patchlines): |
f422c8265ae5
Add support for diffstat in commit emails, and move diffstat from
Matt Doar <matt@xensource.com>
parents:
3051
diff
changeset
|
106 s = patch.diffstat(patchlines) |
875 | 107 if s: |
108 if summary: | |
109 ui.write(summary, '\n') | |
110 ui.write(s, '\n') | |
1670
fe19c54ee403
add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1669
diff
changeset
|
111 confirm(_('Does the diffstat above look okay')) |
875 | 112 return s |
113 | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
114 def makepatch(patch, idx, total): |
875 | 115 desc = [] |
116 node = None | |
1135
e455d91f6259
Variable 'body' was missing in patchbomb script.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1118
diff
changeset
|
117 body = '' |
875 | 118 for line in patch: |
119 if line.startswith('#'): | |
120 if line.startswith('# Node ID'): node = line.split()[-1] | |
121 continue | |
3051
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
122 if (line.startswith('diff -r') |
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
123 or line.startswith('diff --git')): |
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
124 break |
875 | 125 desc.append(line) |
126 if not node: raise ValueError | |
1118
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
127 |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
128 #body = ('\n'.join(desc[1:]).strip() or |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
129 # 'Patch subject is complete summary.') |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
130 #body += '\n\n\n' |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
131 |
1604
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
132 if opts['plain']: |
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
133 while patch and patch[0].startswith('# '): patch.pop(0) |
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
134 if patch: patch.pop(0) |
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
135 while patch and not patch[0].strip(): patch.pop(0) |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
136 if opts['diffstat']: |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
137 body += cdiffstat('\n'.join(desc), patch) + '\n\n' |
2706
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
138 if opts['attach']: |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
139 msg = email.MIMEMultipart.MIMEMultipart() |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
140 if body: msg.attach(email.MIMEText.MIMEText(body, 'plain')) |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
141 p = email.MIMEText.MIMEText('\n'.join(patch), 'x-patch') |
2722
10e95059ffd7
patchbomb: fix generation of message-id when sending attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2707
diff
changeset
|
142 binnode = bin(node) |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
143 # if node is mq patch, it will have patch file name as tag |
2722
10e95059ffd7
patchbomb: fix generation of message-id when sending attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2707
diff
changeset
|
144 patchname = [t for t in repo.nodetags(binnode) |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
145 if t.endswith('.patch') or t.endswith('.diff')] |
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
146 if patchname: |
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
147 patchname = patchname[0] |
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
148 elif total > 1: |
3247
1e2941fda520
patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents:
3093
diff
changeset
|
149 patchname = cmdutil.make_filename(repo, '%b-%n.patch', |
2722
10e95059ffd7
patchbomb: fix generation of message-id when sending attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2707
diff
changeset
|
150 binnode, idx, total) |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
151 else: |
3247
1e2941fda520
patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents:
3093
diff
changeset
|
152 patchname = cmdutil.make_filename(repo, '%b.patch', binnode) |
2707
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
153 p['Content-Disposition'] = 'inline; filename=' + patchname |
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
154 msg.attach(p) |
2706
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
155 else: |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
156 body += '\n'.join(patch) |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
157 msg = email.MIMEText.MIMEText(body) |
4141
49d7a035235b
patchbomb: Allow to specify subject of single-patch-series (issue475)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4027
diff
changeset
|
158 |
4142
ba3e13306f70
patchbomb: Strip more than one trailing dot (and spaces between them)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4141
diff
changeset
|
159 subj = desc[0].strip().rstrip('. ') |
1846
4d2791f4ef80
only put numbers on patches if > 1 patch.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1845
diff
changeset
|
160 if total == 1: |
4141
49d7a035235b
patchbomb: Allow to specify subject of single-patch-series (issue475)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4027
diff
changeset
|
161 subj = '[PATCH] ' + (opts['subject'] or subj) |
1846
4d2791f4ef80
only put numbers on patches if > 1 patch.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1845
diff
changeset
|
162 else: |
3291
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
163 tlen = len(str(total)) |
4141
49d7a035235b
patchbomb: Allow to specify subject of single-patch-series (issue475)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4027
diff
changeset
|
164 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj) |
875 | 165 msg['Subject'] = subj |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
166 msg['X-Mercurial-Node'] = node |
875 | 167 return msg |
168 | |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
169 start_time = util.makedate() |
875 | 170 |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
171 def genmsgid(id): |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
172 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn()) |
875 | 173 |
174 patches = [] | |
175 | |
176 class exportee: | |
177 def __init__(self, container): | |
178 self.lines = [] | |
179 self.container = container | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
180 self.name = 'email' |
875 | 181 |
182 def write(self, data): | |
183 self.lines.append(data) | |
184 | |
185 def close(self): | |
186 self.container.append(''.join(self.lines).split('\n')) | |
187 self.lines = [] | |
188 | |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
189 commands.export(ui, repo, *revs, **{'output': exportee(patches), |
1603
5352a5407dc1
make patchbomb work with recent changes to export
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1226
diff
changeset
|
190 'switch_parent': False, |
3027
5a17423f88d7
Add --git support to hg email
Brendan Cully <brendan@kublai.com>
parents:
2930
diff
changeset
|
191 'text': None, |
5a17423f88d7
Add --git support to hg email
Brendan Cully <brendan@kublai.com>
parents:
2930
diff
changeset
|
192 'git': opts.get('git')}) |
875 | 193 |
194 jumbo = [] | |
195 msgs = [] | |
196 | |
1670
fe19c54ee403
add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1669
diff
changeset
|
197 ui.write(_('This patch series consists of %d patches.\n\n') % len(patches)) |
875 | 198 |
3468
0e68608bd11d
use xrange instead of range
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3291
diff
changeset
|
199 for p, i in zip(patches, xrange(len(patches))): |
875 | 200 jumbo.extend(p) |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
201 msgs.append(makepatch(p, i + 1, len(patches))) |
875 | 202 |
2198
564034552f7f
rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2165
diff
changeset
|
203 sender = (opts['from'] or ui.config('email', 'from') or |
564034552f7f
rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2165
diff
changeset
|
204 ui.config('patchbomb', 'from') or |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
205 prompt('From', ui.username())) |
875 | 206 |
1154
c3cb9f39a91f
patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents:
1136
diff
changeset
|
207 def getaddrs(opt, prpt, default = None): |
2198
564034552f7f
rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2165
diff
changeset
|
208 addrs = opts[opt] or (ui.config('email', opt) or |
564034552f7f
rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2165
diff
changeset
|
209 ui.config('patchbomb', opt) or |
1154
c3cb9f39a91f
patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents:
1136
diff
changeset
|
210 prompt(prpt, default = default)).split(',') |
c3cb9f39a91f
patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents:
1136
diff
changeset
|
211 return [a.strip() for a in addrs if a.strip()] |
c3cb9f39a91f
patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents:
1136
diff
changeset
|
212 to = getaddrs('to', 'To') |
c3cb9f39a91f
patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents:
1136
diff
changeset
|
213 cc = getaddrs('cc', 'Cc', '') |
875 | 214 |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
215 bcc = opts['bcc'] or (ui.config('email', 'bcc') or |
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
216 ui.config('patchbomb', 'bcc') or '').split(',') |
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
217 bcc = [a.strip() for a in bcc if a.strip()] |
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
218 |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
219 if len(patches) > 1: |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
220 ui.write(_('\nWrite the introductory message for the patch series.\n\n')) |
875 | 221 |
3291
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
222 tlen = len(str(len(patches))) |
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
223 |
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
224 subj = '[PATCH %0*d of %d] %s' % ( |
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
225 tlen, 0, |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
226 len(patches), |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
227 opts['subject'] or |
3291
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
228 prompt('Subject:', rest = ' [PATCH %0*d of %d] ' % (tlen, 0, |
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
229 len(patches)))) |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
230 |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
231 ui.write(_('Finish with ^D or a dot on a line by itself.\n\n')) |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
232 |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
233 body = [] |
875 | 234 |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
235 while True: |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
236 try: l = raw_input() |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
237 except EOFError: break |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
238 if l == '.': break |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
239 body.append(l) |
875 | 240 |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
241 if opts['diffstat']: |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
242 d = cdiffstat(_('Final summary:\n'), jumbo) |
2704
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
243 if d: body.append('\n' + d) |
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
244 |
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
245 body = '\n'.join(body) + '\n' |
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
246 |
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
247 msg = email.MIMEText.MIMEText(body) |
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
248 msg['Subject'] = subj |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
249 |
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
250 msgs.insert(0, msg) |
875 | 251 |
252 ui.write('\n') | |
253 | |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
254 if not opts['test'] and not opts['mbox']: |
2909
20b95aef3fe0
Move ui.sendmail to mail.connect/sendmail
Matt Mackall <mpm@selenic.com>
parents:
2785
diff
changeset
|
255 mailer = mail.connect(ui) |
875 | 256 parent = None |
2443
bd9c39e8f38b
patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2292
diff
changeset
|
257 |
1827
26dd4ae77b7b
get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents:
1702
diff
changeset
|
258 sender_addr = email.Utils.parseaddr(sender)[1] |
875 | 259 for m in msgs: |
260 try: | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
261 m['Message-Id'] = genmsgid(m['X-Mercurial-Node']) |
875 | 262 except TypeError: |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
263 m['Message-Id'] = genmsgid('patchbomb') |
875 | 264 if parent: |
265 m['In-Reply-To'] = parent | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
266 else: |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
267 parent = m['Message-Id'] |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
268 m['Date'] = util.datestr(date=start_time, |
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
269 format="%a, %d %b %Y %H:%M:%S", timezone=True) |
2443
bd9c39e8f38b
patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2292
diff
changeset
|
270 |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
271 start_time = (start_time[0] + 1, start_time[1]) |
875 | 272 m['From'] = sender |
273 m['To'] = ', '.join(to) | |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
274 if cc: m['Cc'] = ', '.join(cc) |
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
275 if bcc: m['Bcc'] = ', '.join(bcc) |
875 | 276 if opts['test']: |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
277 ui.status('Displaying ', m['Subject'], ' ...\n') |
875 | 278 fp = os.popen(os.getenv('PAGER', 'more'), 'w') |
1871
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
279 try: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
280 fp.write(m.as_string(0)) |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
281 fp.write('\n') |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
282 except IOError, inst: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
283 if inst.errno != errno.EPIPE: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
284 raise |
875 | 285 fp.close() |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
286 elif opts['mbox']: |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
287 ui.status('Writing ', m['Subject'], ' ...\n') |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
288 fp = open(opts['mbox'], m.has_key('In-Reply-To') and 'ab+' or 'wb+') |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
289 date = util.datestr(date=start_time, |
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
290 format='%a %b %d %H:%M:%S %Y', timezone=False) |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
291 fp.write('From %s %s\n' % (sender_addr, date)) |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
292 fp.write(m.as_string(0)) |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
293 fp.write('\n\n') |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
294 fp.close() |
875 | 295 else: |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
296 ui.status('Sending ', m['Subject'], ' ...\n') |
2785
58a679745b38
mailbomb: add a comment and remove the bcc in a more pythonic way
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2731
diff
changeset
|
297 # Exim does not remove the Bcc field |
58a679745b38
mailbomb: add a comment and remove the bcc in a more pythonic way
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2731
diff
changeset
|
298 del m['Bcc'] |
2909
20b95aef3fe0
Move ui.sendmail to mail.connect/sendmail
Matt Mackall <mpm@selenic.com>
parents:
2785
diff
changeset
|
299 mailer.sendmail(sender, to + bcc + cc, m.as_string(0)) |
875 | 300 |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
301 cmdtable = { |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
302 'email': |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
303 (patchbomb, |
2706
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
304 [('a', 'attach', None, 'send patches as inline attachments'), |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
305 ('', 'bcc', [], 'email addresses of blind copy recipients'), |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
306 ('c', 'cc', [], 'email addresses of copy recipients'), |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
307 ('d', 'diffstat', None, 'add diffstat output to messages'), |
3027
5a17423f88d7
Add --git support to hg email
Brendan Cully <brendan@kublai.com>
parents:
2930
diff
changeset
|
308 ('g', 'git', None, _('use git extended diff format')), |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
309 ('f', 'from', '', 'email address of sender'), |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
310 ('', 'plain', None, 'omit hg patch header'), |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
311 ('n', 'test', None, 'print messages that would be sent'), |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
312 ('m', 'mbox', '', 'write messages to mbox file instead of sending them'), |
4141
49d7a035235b
patchbomb: Allow to specify subject of single-patch-series (issue475)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4027
diff
changeset
|
313 ('s', 'subject', '', 'subject of first message (intro or single patch)'), |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
314 ('t', 'to', [], 'email addresses of recipients')], |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
315 "hg email [OPTION]... [REV]...") |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
316 } |