Mercurial > hg > mercurial-crew-with-dirclash
annotate hgext/patchbomb.py @ 4521:d634b61e9cec
Add some more smart when initializing destination repository
author | Edouard Gomez <ed.gomez@free.fr> |
---|---|
date | Thu, 07 Jun 2007 23:16:10 +0200 |
parents | ead2fa544cbf |
children | d48e1b5f8265 |
rev | line source |
---|---|
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
1 # Command for sending a collection of Mercurial changesets as a series |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
2 # of patch emails. |
875 | 3 # |
4 # The series is started off with a "[PATCH 0 of N]" introduction, | |
5 # which describes the series as a whole. | |
6 # | |
7 # Each patch email has a Subject line of "[PATCH M of N] ...", using | |
8 # the first line of the changeset description as the subject text. | |
9 # The message contains two or three body parts: | |
10 # | |
11 # The remainder of the changeset description. | |
12 # | |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
13 # [Optional] If the diffstat program is installed, the result of |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
14 # running diffstat on the patch. |
875 | 15 # |
16 # The patch itself, as generated by "hg export". | |
17 # | |
18 # Each message refers to all of its predecessors using the In-Reply-To | |
19 # and References headers, so they will show up as a sequence in | |
20 # threaded mail and news readers, and in mail archives. | |
21 # | |
22 # For each changeset, you will be prompted with a diffstat summary and | |
23 # the changeset summary, so you can be sure you are sending the right | |
24 # changes. | |
25 # | |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
26 # To enable this extension: |
875 | 27 # |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
28 # [extensions] |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
29 # hgext.patchbomb = |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
30 # |
877
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
31 # To configure other defaults, add a section like this to your hgrc |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
32 # file: |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
33 # |
2926
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
34 # [email] |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
35 # from = My Name <my@email> |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
36 # to = recipient1, recipient2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
37 # cc = cc1, cc2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
38 # bcc = bcc1, bcc2, ... |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
39 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
40 # Then you can use the "hg email" command to mail a series of changesets |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
41 # as a patchbomb. |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
42 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
43 # To avoid sending patches prematurely, it is a good idea to first run |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
44 # the "email" command with the "-n" option (test only). You will be |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
45 # prompted for an email recipient address, a subject an an introductory |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
46 # message describing the patches of your patchbomb. Then when all is |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
47 # done, your pager will be fired up once for each patchbomb message, so |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
48 # you can verify everything is alright. |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
49 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
50 # The "-m" (mbox) option is also very useful. Instead of previewing |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
51 # each patchbomb message in a pager or sending the messages directly, |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
52 # it will create a UNIX mailbox file with the patch emails. This |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
53 # mailbox file can be previewed with any mail user agent which supports |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
54 # UNIX mbox files, i.e. with mutt: |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
55 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
56 # % mutt -R -f mbox |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
57 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
58 # When you are previewing the patchbomb messages, you can use `formail' |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
59 # (a utility that is commonly installed as part of the procmail package), |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
60 # to send each message out: |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
61 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
62 # % formail -s sendmail -bm -t < mbox |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
63 # |
13cd2cdeff6a
hgext: more patchbomb documentation
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
2909
diff
changeset
|
64 # That should be all. Now your patchbomb is on its way out. |
875 | 65 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
66 import os, errno, socket, tempfile |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
67 import email.MIMEMultipart, email.MIMEText, email.MIMEBase |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
68 import email.Utils, email.Encoders |
4029 | 69 from mercurial import cmdutil, commands, hg, mail, ui, patch, util |
3893 | 70 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
|
71 from mercurial.node import * |
875 | 72 |
73 def patchbomb(ui, repo, *revs, **opts): | |
4283
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
74 '''send changesets by email |
1672
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
75 |
4283
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
76 By default, diffs are sent in the format generated by hg export, |
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
77 one per message. The series starts with a "[PATCH 0 of N]" |
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
78 introduction, which describes the series as a whole. |
1672
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
79 |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
80 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
|
81 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
|
82 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
|
83 the changeset description. Next, (optionally) if the diffstat |
07f931af5f40
add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1670
diff
changeset
|
84 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
|
85 Finally, the patch itself, as generated by "hg export". |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
86 |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
87 With --outgoing, emails will be generated for patches not |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
88 found in the destination repository (or only those which are |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
89 ancestors of the specified revisions if any are provided) |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
90 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
91 With --bundle, changesets are selected as for --outgoing, |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
92 but a single email containing a binary Mercurial bundle as an |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
93 attachment will be sent. |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
94 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
95 Examples: |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
96 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
97 hg email -r 3000 # send patch 3000 only |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
98 hg email -r 3000 -r 3001 # send patches 3000 and 3001 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
99 hg email -r 3000:3005 # send patches 3000 through 3005 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
100 hg email 3000 # send patch 3000 (deprecated) |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
101 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
102 hg email -o # send all patches not in default |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
103 hg email -o DEST # send all patches not in DEST |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
104 hg email -o -r 3000 # send all ancestors of 3000 not in default |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
105 hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
106 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
107 hg email -b # send bundle of all patches not in default |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
108 hg email -b DEST # send bundle of all patches not in DEST |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
109 hg email -b -r 3000 # bundle of all ancestors of 3000 not in default |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
110 hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
111 |
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
112 Before using this command, you will need to enable email in your hgrc. |
4283
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
113 See the [email] section in hgrc(5) for details. |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
114 ''' |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
115 |
875 | 116 def prompt(prompt, default = None, rest = ': ', empty_ok = False): |
4480
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
117 try: |
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
118 # readline gives raw_input editing capabilities, but is not |
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
119 # present on windows |
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
120 import readline |
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
121 except ImportError: pass |
6b84c8d2f66f
patchbomb: Defer the import of readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4479
diff
changeset
|
122 |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
123 if default: prompt += ' [%s]' % default |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
124 prompt += rest |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
125 while True: |
875 | 126 r = raw_input(prompt) |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
127 if r: return r |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
128 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
|
129 if empty_ok: return r |
1670
fe19c54ee403
add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1669
diff
changeset
|
130 ui.warn(_('Please enter a valid value.\n')) |
875 | 131 |
132 def confirm(s): | |
133 if not prompt(s, default = 'y', rest = '? ').lower().startswith('y'): | |
134 raise ValueError | |
135 | |
3093
f422c8265ae5
Add support for diffstat in commit emails, and move diffstat from
Matt Doar <matt@xensource.com>
parents:
3051
diff
changeset
|
136 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
|
137 s = patch.diffstat(patchlines) |
875 | 138 if s: |
139 if summary: | |
140 ui.write(summary, '\n') | |
141 ui.write(s, '\n') | |
1670
fe19c54ee403
add _ to several strings
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1669
diff
changeset
|
142 confirm(_('Does the diffstat above look okay')) |
875 | 143 return s |
144 | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
145 def makepatch(patch, idx, total): |
875 | 146 desc = [] |
147 node = None | |
1135
e455d91f6259
Variable 'body' was missing in patchbomb script.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1118
diff
changeset
|
148 body = '' |
875 | 149 for line in patch: |
150 if line.startswith('#'): | |
151 if line.startswith('# Node ID'): node = line.split()[-1] | |
152 continue | |
3051
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
153 if (line.startswith('diff -r') |
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
154 or line.startswith('diff --git')): |
51b7f792e473
Detect git patches in patchbomb makepatch function
Brendan Cully <brendan@kublai.com>
parents:
3027
diff
changeset
|
155 break |
875 | 156 desc.append(line) |
157 if not node: raise ValueError | |
1118
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
158 |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
159 #body = ('\n'.join(desc[1:]).strip() or |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
160 # 'Patch subject is complete summary.') |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
161 #body += '\n\n\n' |
63b5f68d8167
patchbomb: eliminate silly complete summary message
mpm@selenic.com
parents:
1032
diff
changeset
|
162 |
1604
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
163 if opts['plain']: |
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
164 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
|
165 if patch: patch.pop(0) |
da3f1121721b
add --plain option to patchbomb.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1603
diff
changeset
|
166 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
|
167 if opts['diffstat']: |
25430c523677
Polish patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
876
diff
changeset
|
168 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
|
169 if opts['attach']: |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
170 msg = email.MIMEMultipart.MIMEMultipart() |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
171 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
|
172 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
|
173 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
|
174 # 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
|
175 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
|
176 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
|
177 if patchname: |
084f07cacba0
patchbomb: add content-disposition to make display inline and add filename
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2706
diff
changeset
|
178 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
|
179 elif total > 1: |
3247
1e2941fda520
patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents:
3093
diff
changeset
|
180 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
|
181 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
|
182 else: |
3247
1e2941fda520
patchbomb: update --attach to use cmdutil.make_filename
Brendan Cully <brendan@kublai.com>
parents:
3093
diff
changeset
|
183 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
|
184 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
|
185 msg.attach(p) |
2706
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
186 else: |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
187 body += '\n'.join(patch) |
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
188 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
|
189 |
4142
ba3e13306f70
patchbomb: Strip more than one trailing dot (and spaces between them)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4141
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 else: |
3291
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
194 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
|
195 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj) |
875 | 196 msg['Subject'] = subj |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
197 msg['X-Mercurial-Node'] = node |
875 | 198 return msg |
199 | |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
200 def outgoing(dest, revs): |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
201 '''Return the revisions present locally but not in dest''' |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
202 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
|
203 revs = [repo.lookup(rev) for rev in revs] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
204 other = hg.repository(ui, dest) |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
205 ui.status(_('comparing with %s\n') % dest) |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
206 o = repo.findoutgoing(other) |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
207 if not o: |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
208 ui.status(_("no changes found\n")) |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
209 return [] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
210 o = repo.changelog.nodesbetween(o, revs or None)[0] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
211 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
|
212 |
4279
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
213 def getbundle(dest): |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
214 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-') |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
215 tmpfn = os.path.join(tmpdir, 'bundle') |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
216 try: |
4279
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
217 commands.bundle(ui, repo, tmpfn, dest, **opts) |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
218 return open(tmpfn).read() |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
219 finally: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
220 try: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
221 os.unlink(tmpfn) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
222 except: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
223 pass |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
224 os.rmdir(tmpdir) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
225 |
4483
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4480
diff
changeset
|
226 if not opts['test']: |
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4480
diff
changeset
|
227 mail.validateconfig(ui) |
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4480
diff
changeset
|
228 |
4487
ead2fa544cbf
patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
229 if not (revs or opts.get('rev') or opts.get('outgoing')): |
ead2fa544cbf
patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
230 raise util.Abort(_('specify at least one changeset with -r or -o')) |
ead2fa544cbf
patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
231 |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
232 commands.setremoteconfig(ui, opts) |
4486
c15955bde7dd
patchbomb: Fix typo.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4485
diff
changeset
|
233 if opts.get('outgoing') and opts.get('bundle'): |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
234 raise util.Abort(_("--outgoing mode always on with --bundle; do not re-specify --outgoing")) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
235 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
236 if opts.get('outgoing') or opts.get('bundle'): |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
237 if len(revs) > 1: |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
238 raise util.Abort(_("too many destinations")) |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
239 dest = revs and revs[0] or None |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
240 revs = [] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
241 |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
242 if opts.get('rev'): |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
243 if revs: |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
244 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
|
245 revs = opts.get('rev') |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
246 |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
247 if opts.get('outgoing'): |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
248 revs = outgoing(dest, opts.get('rev')) |
4279
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
249 if opts.get('bundle'): |
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
250 opts['revs'] = revs |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
251 |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
252 # start |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
253 start_time = util.makedate() |
875 | 254 |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
255 def genmsgid(id): |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
256 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn()) |
875 | 257 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
258 def getexportmsgs(): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
259 patches = [] |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
260 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
261 class exportee: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
262 def __init__(self, container): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
263 self.lines = [] |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
264 self.container = container |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
265 self.name = 'email' |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
266 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
267 def write(self, data): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
268 self.lines.append(data) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
269 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
270 def close(self): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
271 self.container.append(''.join(self.lines).split('\n')) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
272 self.lines = [] |
3291
0b5d626b354e
[patchbomb] prepend leading zeros in the "[PATCH N of M]" string
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
3247
diff
changeset
|
273 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
274 commands.export(ui, repo, *revs, **{'output': exportee(patches), |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
275 'switch_parent': False, |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
276 'text': None, |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
277 'git': opts.get('git')}) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
278 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
279 jumbo = [] |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
280 msgs = [] |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
281 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
282 ui.write(_('This patch series consists of %d patches.\n\n') % len(patches)) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
283 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
284 for p, i in zip(patches, xrange(len(patches))): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
285 jumbo.extend(p) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
286 msgs.append(makepatch(p, i + 1, len(patches))) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
287 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
288 if len(patches) > 1: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
289 tlen = len(str(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
|
290 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
291 subj = '[PATCH %0*d of %d] %s' % ( |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
292 tlen, 0, |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
293 len(patches), |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
294 opts['subject'] or |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
295 prompt('Subject:', rest = ' [PATCH %0*d of %d] ' % (tlen, 0, |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
296 len(patches)))) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
297 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
298 body = '' |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
299 if opts['diffstat']: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
300 d = cdiffstat(_('Final summary:\n'), jumbo) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
301 if d: body = '\n' + d |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
302 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
303 ui.write(_('\nWrite the introductory message for the patch series.\n\n')) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
304 body = ui.edit(body, sender) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
305 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
306 msg = email.MIMEText.MIMEText(body) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
307 msg['Subject'] = subj |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
308 |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
309 msgs.insert(0, msg) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
310 return msgs |
2704
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
311 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
312 def getbundlemsgs(bundle): |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
313 subj = opts['subject'] or \ |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
314 prompt('Subject:', default='A bundle for your repository') |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
315 ui.write(_('\nWrite the introductory message for the bundle.\n\n')) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
316 body = ui.edit('', sender) |
2704
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
317 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
318 msg = email.MIMEMultipart.MIMEMultipart() |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
319 if body: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
320 msg.attach(email.MIMEText.MIMEText(body, 'plain')) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
321 datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle') |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
322 datapart.set_payload(bundle) |
4284
a04141f51056
Add a filename for the bundle
John Goerzen <jgoerzen@complete.org>
parents:
4283
diff
changeset
|
323 datapart.add_header('Content-Disposition', 'attachment', |
a04141f51056
Add a filename for the bundle
John Goerzen <jgoerzen@complete.org>
parents:
4283
diff
changeset
|
324 filename='bundle.hg') |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
325 email.Encoders.encode_base64(datapart) |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
326 msg.attach(datapart) |
2704
99e7cf6bd2f7
make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
327 msg['Subject'] = subj |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
328 return [msg] |
1845
cfe689ab3f06
Patchbomb only sends introductory message [0 of N] if there are multiple patches.
Lee Cantey <lcantey@gmail.com>
parents:
1827
diff
changeset
|
329 |
4485
6d2d1dcd5f74
patchbomb: Hoist sender config higher.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4483
diff
changeset
|
330 sender = (opts['from'] or ui.config('email', 'from') or |
6d2d1dcd5f74
patchbomb: Hoist sender config higher.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4483
diff
changeset
|
331 ui.config('patchbomb', 'from') or |
6d2d1dcd5f74
patchbomb: Hoist sender config higher.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4483
diff
changeset
|
332 prompt('From', ui.username())) |
6d2d1dcd5f74
patchbomb: Hoist sender config higher.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4483
diff
changeset
|
333 |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
334 if opts.get('bundle'): |
4279
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
335 msgs = getbundlemsgs(getbundle(dest)) |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
336 else: |
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
337 msgs = getexportmsgs() |
875 | 338 |
4479
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
339 def getaddrs(opt, prpt, default = None): |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
340 addrs = opts[opt] or (ui.config('email', opt) or |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
341 ui.config('patchbomb', opt) or |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
342 prompt(prpt, default = default)).split(',') |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
343 return [a.strip() for a in addrs if a.strip()] |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
344 |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
345 to = getaddrs('to', 'To') |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
346 cc = getaddrs('cc', 'Cc', '') |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
347 |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
348 bcc = opts['bcc'] or (ui.config('email', 'bcc') or |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
349 ui.config('patchbomb', 'bcc') or '').split(',') |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
350 bcc = [a.strip() for a in bcc if a.strip()] |
82bc6aef8b43
patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4284
diff
changeset
|
351 |
875 | 352 ui.write('\n') |
353 | |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
354 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
|
355 mailer = mail.connect(ui) |
875 | 356 parent = None |
2443
bd9c39e8f38b
patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2292
diff
changeset
|
357 |
1827
26dd4ae77b7b
get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents:
1702
diff
changeset
|
358 sender_addr = email.Utils.parseaddr(sender)[1] |
875 | 359 for m in msgs: |
360 try: | |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
361 m['Message-Id'] = genmsgid(m['X-Mercurial-Node']) |
875 | 362 except TypeError: |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
363 m['Message-Id'] = genmsgid('patchbomb') |
875 | 364 if parent: |
365 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
|
366 else: |
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
367 parent = m['Message-Id'] |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
368 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
|
369 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
|
370 |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
371 start_time = (start_time[0] + 1, start_time[1]) |
875 | 372 m['From'] = sender |
373 m['To'] = ', '.join(to) | |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
374 if cc: m['Cc'] = ', '.join(cc) |
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
375 if bcc: m['Bcc'] = ', '.join(bcc) |
875 | 376 if opts['test']: |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
377 ui.status('Displaying ', m['Subject'], ' ...\n') |
875 | 378 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
|
379 try: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
380 fp.write(m.as_string(0)) |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
381 fp.write('\n') |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
382 except IOError, inst: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
383 if inst.errno != errno.EPIPE: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
384 raise |
875 | 385 fp.close() |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
386 elif opts['mbox']: |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
387 ui.status('Writing ', m['Subject'], ' ...\n') |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
388 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
|
389 date = util.datestr(date=start_time, |
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3468
diff
changeset
|
390 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
|
391 fp.write('From %s %s\n' % (sender_addr, date)) |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
392 fp.write(m.as_string(0)) |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
393 fp.write('\n\n') |
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
394 fp.close() |
875 | 395 else: |
1702
e291d9a30bef
add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents:
1691
diff
changeset
|
396 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
|
397 # 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
|
398 del m['Bcc'] |
2909
20b95aef3fe0
Move ui.sendmail to mail.connect/sendmail
Matt Mackall <mpm@selenic.com>
parents:
2785
diff
changeset
|
399 mailer.sendmail(sender, to + bcc + cc, m.as_string(0)) |
875 | 400 |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
401 cmdtable = { |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
402 'email': |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
403 (patchbomb, |
2706
4af7b178976a
patchbomb: optionally send patches as inline attachments
Christian Ebert <blacktrash@gmx.net>
parents:
2705
diff
changeset
|
404 [('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
|
405 ('', 'bcc', [], 'email addresses of blind copy recipients'), |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
406 ('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
|
407 ('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
|
408 ('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
|
409 ('f', 'from', '', 'email address of sender'), |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
410 ('', 'plain', None, 'omit hg patch header'), |
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
411 ('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
|
412 ('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
|
413 ('o', 'outgoing', None, _('send changes not found in the target repository')), |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4257
diff
changeset
|
414 ('b', 'bundle', None, _('send changes not in target as a binary bundle')), |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
415 ('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
|
416 ('s', 'subject', '', 'subject of first message (intro or single patch)'), |
4279
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
417 ('t', 'to', [], 'email addresses of recipients'), |
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
418 ('', 'force', None, _('run even when remote repository is unrelated (with -b)')), |
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
419 ('', 'base', [], |
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
420 _('a base changeset to specify instead of a destination (with -b)'))] |
126d1967a3f8
Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents:
4278
diff
changeset
|
421 + commands.remoteopts, |
4257
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
422 "hg email [OPTION]... [DEST]...") |
1669
91d40fc959f0
turn patchbomb script into an extension module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1604
diff
changeset
|
423 } |