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