annotate hgext/patchbomb.py @ 4193:9e3121017fb2

Optimize return value of util._matcher for common command line case This will trigger every time somebody runs something like "hg diff" or "hg status" without any arguments. The important part here is returning util.always as the match function, which is a much simpler (and faster) function than the usual return value, and allows other code to just skip the filtering if it knows all files will match.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 10 Mar 2007 23:01:00 -0300
parents ba3e13306f70
children 03e9c22a6489 8e37342cb05d
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
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
100
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
101 def confirm(s):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
102 if not prompt(s, default = 'y', rest = '? ').lower().startswith('y'):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
103 raise ValueError
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
107 if s:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
108 if summary:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
109 ui.write(summary, '\n')
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
112 return s
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
115 desc = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
118 for line in patch:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
119 if line.startswith('#'):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
120 if line.startswith('# Node ID'): node = line.split()[-1]
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
125 desc.append(line)
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
167 return msg
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
173
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
174 patches = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
175
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
176 class exportee:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
177 def __init__(self, container):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
178 self.lines = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
181
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
182 def write(self, data):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
183 self.lines.append(data)
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
184
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
185 def close(self):
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
186 self.container.append(''.join(self.lines).split('\n'))
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
187 self.lines = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
193
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
194 jumbo = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
195 msgs = []
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
251
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
252 ui.write('\n')
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
259 for m in msgs:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
264 if parent:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
272 m['From'] = sender
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
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 }