annotate hgext/patchbomb.py @ 4257:f51317e24114

Add --outgoing option to patchbomb
author Brendan Cully <brendan@kublai.com>
date Thu, 22 Mar 2007 10:40:28 -0700
parents 03e9c22a6489
children cfe886c14ddf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
3 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
4 # The series is started off with a "[PATCH 0 of N]" introduction,
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
5 # which describes the series as a whole.
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
6 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
7 # Each patch email has a Subject line of "[PATCH M of N] ...", using
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
8 # the first line of the changeset description as the subject text.
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
9 # The message contains two or three body parts:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
10 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
11 # The remainder of the changeset description.
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
15 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
16 # The patch itself, as generated by "hg export".
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
17 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
18 # Each message refers to all of its predecessors using the In-Reply-To
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
19 # and References headers, so they will show up as a sequence in
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
20 # threaded mail and news readers, and in mail archives.
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
21 #
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
22 # For each changeset, you will be prompted with a diffstat summary and
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
23 # the changeset summary, so you can be sure you are sending the right
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
24 # changes.
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
25 #
2926
13cd2cdeff6a hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 2909
diff changeset
26 # To enable this extension:
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
65
4029
9210fba03d16 merge with -stable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 4027 3963
diff changeset
66 import os, errno, socket
3886
abaee83ce0a6 Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents: 3468
diff changeset
67 import email.MIMEMultipart, email.MIMEText, email.Utils
4029
9210fba03d16 merge with -stable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 4027 3963
diff changeset
68 from mercurial import cmdutil, commands, hg, mail, ui, patch, util
3893
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3887
diff changeset
69 from mercurial.i18n import _
2707
084f07cacba0 patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2706
diff changeset
70 from mercurial.node import *
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
71
1204
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
72 try:
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
73 # 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
74 # present on windows
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
75 import readline
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
76 except ImportError: pass
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
77
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
78 def patchbomb(ui, repo, *revs, **opts):
1672
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
79 '''send changesets as a series of patch emails
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
80
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
81 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
82 describes the series as a whole.
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
83
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
84 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
85 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
86 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
87 the changeset description. Next, (optionally) if the diffstat
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
88 program is installed, the result of running diffstat on the patch.
4257
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
89 Finally, the patch itself, as generated by "hg export".
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
90
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
91 With --outgoing, emails will be generated for patches not
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
92 found in the target repository (or only those which are
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
93 ancestors of the specified revisions if any are provided)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
94 '''
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
95
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
96 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
97 if default: prompt += ' [%s]' % default
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
98 prompt += rest
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
99 while True:
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
100 r = raw_input(prompt)
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
101 if r: return r
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
102 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
103 if empty_ok: return r
1670
fe19c54ee403 add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1669
diff changeset
104 ui.warn(_('Please enter a valid value.\n'))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
105
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
106 def confirm(s):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
107 if not prompt(s, default = 'y', rest = '? ').lower().startswith('y'):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
108 raise ValueError
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
109
3093
f422c8265ae5 Add support for diffstat in commit emails, and move diffstat from
Matt Doar <matt@xensource.com>
parents: 3051
diff changeset
110 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
111 s = patch.diffstat(patchlines)
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
112 if s:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
113 if summary:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
114 ui.write(summary, '\n')
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
115 ui.write(s, '\n')
1670
fe19c54ee403 add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1669
diff changeset
116 confirm(_('Does the diffstat above look okay'))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
117 return s
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
118
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
119 def makepatch(patch, idx, total):
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
120 desc = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
121 node = None
1135
e455d91f6259 Variable 'body' was missing in patchbomb script.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1118
diff changeset
122 body = ''
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
123 for line in patch:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
124 if line.startswith('#'):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
125 if line.startswith('# Node ID'): node = line.split()[-1]
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
126 continue
3051
51b7f792e473 Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents: 3027
diff changeset
127 if (line.startswith('diff -r')
51b7f792e473 Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents: 3027
diff changeset
128 or line.startswith('diff --git')):
51b7f792e473 Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents: 3027
diff changeset
129 break
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
130 desc.append(line)
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
131 if not node: raise ValueError
1118
63b5f68d8167 patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents: 1032
diff changeset
132
63b5f68d8167 patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents: 1032
diff changeset
133 #body = ('\n'.join(desc[1:]).strip() or
63b5f68d8167 patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents: 1032
diff changeset
134 # 'Patch subject is complete summary.')
63b5f68d8167 patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents: 1032
diff changeset
135 #body += '\n\n\n'
63b5f68d8167 patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents: 1032
diff changeset
136
1604
da3f1121721b add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1603
diff changeset
137 if opts['plain']:
da3f1121721b add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1603
diff changeset
138 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
139 if patch: patch.pop(0)
da3f1121721b add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1603
diff changeset
140 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
141 if opts['diffstat']:
25430c523677 Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents: 876
diff changeset
142 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
143 if opts['attach']:
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
144 msg = email.MIMEMultipart.MIMEMultipart()
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
145 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
146 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
147 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
148 # 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
149 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
150 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
151 if patchname:
084f07cacba0 patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2706
diff changeset
152 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
153 elif total > 1:
3247
1e2941fda520 patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents: 3093
diff changeset
154 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
155 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
156 else:
3247
1e2941fda520 patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents: 3093
diff changeset
157 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
158 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
159 msg.attach(p)
2706
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
160 else:
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
161 body += '\n'.join(patch)
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
162 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
163
4142
ba3e13306f70 patchbomb: Strip more than one trailing dot (and spaces between them)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4141
diff changeset
164 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
165 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
166 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
167 else:
3291
0b5d626b354e [patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3247
diff changeset
168 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
169 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj)
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
170 msg['Subject'] = subj
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
171 msg['X-Mercurial-Node'] = node
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
172 return msg
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
173
4257
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
174 def outgoing(dest, revs):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
175 '''Return the revisions present locally but not in dest'''
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
176 dest = ui.expandpath(dest or 'default-push', dest or 'default')
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
177 revs = [repo.lookup(rev) for rev in revs]
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
178 other = hg.repository(ui, dest)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
179 ui.status(_('comparing with %s\n') % dest)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
180 o = repo.findoutgoing(other)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
181 if not o:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
182 ui.status(_("no changes found\n"))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
183 return []
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
184 o = repo.changelog.nodesbetween(o, revs or None)[0]
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
185 return [str(repo.changelog.rev(r)) for r in o]
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
186
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
187 # option handling
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
188 commands.setremoteconfig(ui, opts)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
189 if opts.get('outgoing'):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
190 if len(revs) > 1:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
191 raise util.Abort(_("too many destinations"))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
192 dest = revs and revs[0] or None
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
193 revs = []
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
194
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
195 if opts.get('rev'):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
196 if revs:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
197 raise util.Abort(_('use only one form to specify the revision'))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
198 revs = opts.get('rev')
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
199
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
200 if opts.get('outgoing'):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
201 revs = outgoing(dest, opts.get('rev'))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
202
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
203 # start
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3468
diff changeset
204 start_time = util.makedate()
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
205
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
206 def genmsgid(id):
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3468
diff changeset
207 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
208
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
209 patches = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
210
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
211 class exportee:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
212 def __init__(self, container):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
213 self.lines = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
214 self.container = container
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
215 self.name = 'email'
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
216
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
217 def write(self, data):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
218 self.lines.append(data)
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
219
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
220 def close(self):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
221 self.container.append(''.join(self.lines).split('\n'))
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
222 self.lines = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
223
1669
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
224 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
225 'switch_parent': False,
3027
5a17423f88d7 Add --git support to hg email
Brendan Cully <brendan@kublai.com>
parents: 2930
diff changeset
226 'text': None,
5a17423f88d7 Add --git support to hg email
Brendan Cully <brendan@kublai.com>
parents: 2930
diff changeset
227 'git': opts.get('git')})
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
228
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
229 jumbo = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
230 msgs = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
231
1670
fe19c54ee403 add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1669
diff changeset
232 ui.write(_('This patch series consists of %d patches.\n\n') % len(patches))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
233
3468
0e68608bd11d use xrange instead of range
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3291
diff changeset
234 for p, i in zip(patches, xrange(len(patches))):
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
235 jumbo.extend(p)
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
236 msgs.append(makepatch(p, i + 1, len(patches)))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
237
2198
564034552f7f rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2165
diff changeset
238 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
239 ui.config('patchbomb', 'from') or
877
25430c523677 Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents: 876
diff changeset
240 prompt('From', ui.username()))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
241
1154
c3cb9f39a91f patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents: 1136
diff changeset
242 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
243 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
244 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
245 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
246 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
247 to = getaddrs('to', 'To')
c3cb9f39a91f patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents: 1136
diff changeset
248 cc = getaddrs('cc', 'Cc', '')
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
249
2679
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
250 bcc = opts['bcc'] or (ui.config('email', 'bcc') or
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
251 ui.config('patchbomb', 'bcc') or '').split(',')
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
252 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
253
1845
cfe689ab3f06 Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents: 1827
diff changeset
254 if len(patches) > 1:
3291
0b5d626b354e [patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3247
diff changeset
255 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
256
0b5d626b354e [patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3247
diff changeset
257 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
258 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
259 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
260 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
261 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
262 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
263
3876
ff49da8bd6ae patchbomb: use ui.edit to compose summary mail
Brendan Cully <brendan@kublai.com>
parents: 3468
diff changeset
264 body = ''
1845
cfe689ab3f06 Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents: 1827
diff changeset
265 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
266 d = cdiffstat(_('Final summary:\n'), jumbo)
3876
ff49da8bd6ae patchbomb: use ui.edit to compose summary mail
Brendan Cully <brendan@kublai.com>
parents: 3468
diff changeset
267 if d: body = '\n' + d
2704
99e7cf6bd2f7 make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
268
3876
ff49da8bd6ae patchbomb: use ui.edit to compose summary mail
Brendan Cully <brendan@kublai.com>
parents: 3468
diff changeset
269 ui.write(_('\nWrite the introductory message for the patch series.\n\n'))
ff49da8bd6ae patchbomb: use ui.edit to compose summary mail
Brendan Cully <brendan@kublai.com>
parents: 3468
diff changeset
270 body = ui.edit(body, sender)
2704
99e7cf6bd2f7 make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
271
99e7cf6bd2f7 make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
272 msg = email.MIMEText.MIMEText(body)
99e7cf6bd2f7 make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
273 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
274
cfe689ab3f06 Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents: 1827
diff changeset
275 msgs.insert(0, msg)
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
276
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
277 ui.write('\n')
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
278
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
279 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
280 mailer = mail.connect(ui)
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
281 parent = None
2443
bd9c39e8f38b patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents: 2292
diff changeset
282
1827
26dd4ae77b7b get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents: 1702
diff changeset
283 sender_addr = email.Utils.parseaddr(sender)[1]
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
284 for m in msgs:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
285 try:
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
286 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
287 except TypeError:
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
288 m['Message-Id'] = genmsgid('patchbomb')
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
289 if parent:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
290 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
291 else:
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
292 parent = m['Message-Id']
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3468
diff changeset
293 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
294 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
295
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3468
diff changeset
296 start_time = (start_time[0] + 1, start_time[1])
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
297 m['From'] = sender
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
298 m['To'] = ', '.join(to)
2679
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
299 if cc: m['Cc'] = ', '.join(cc)
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
300 if bcc: m['Bcc'] = ', '.join(bcc)
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
301 if opts['test']:
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
302 ui.status('Displaying ', m['Subject'], ' ...\n')
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
303 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
304 try:
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
305 fp.write(m.as_string(0))
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
306 fp.write('\n')
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
307 except IOError, inst:
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
308 if inst.errno != errno.EPIPE:
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
309 raise
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
310 fp.close()
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
311 elif opts['mbox']:
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
312 ui.status('Writing ', m['Subject'], ' ...\n')
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
313 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
314 date = util.datestr(date=start_time,
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3468
diff changeset
315 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
316 fp.write('From %s %s\n' % (sender_addr, date))
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
317 fp.write(m.as_string(0))
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
318 fp.write('\n\n')
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
319 fp.close()
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
320 else:
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
321 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
322 # 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
323 del m['Bcc']
2909
20b95aef3fe0 Move ui.sendmail to mail.connect/sendmail
Matt Mackall <mpm@selenic.com>
parents: 2785
diff changeset
324 mailer.sendmail(sender, to + bcc + cc, m.as_string(0))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
325
1669
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
326 cmdtable = {
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
327 'email':
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
328 (patchbomb,
2706
4af7b178976a patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents: 2705
diff changeset
329 [('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
330 ('', 'bcc', [], 'email addresses of blind copy recipients'),
2679
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
331 ('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
332 ('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
333 ('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
334 ('f', 'from', '', 'email address of sender'),
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
335 ('', 'plain', None, 'omit hg patch header'),
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
336 ('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
337 ('m', 'mbox', '', 'write messages to mbox file instead of sending them'),
4257
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
338 ('o', 'outgoing', None, _('send changes not found in the target repository')),
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
339 ('r', 'rev', [], _('a revision to send')),
4141
49d7a035235b patchbomb: Allow to specify subject of single-patch-series (issue475)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4027
diff changeset
340 ('s', 'subject', '', 'subject of first message (intro or single patch)'),
4257
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
341 ('t', 'to', [], 'email addresses of recipients')] + commands.remoteopts,
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
342 "hg email [OPTION]... [DEST]...")
1669
91d40fc959f0 turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1604
diff changeset
343 }