annotate hgext/patchbomb.py @ 8683:99eb4dcb37ce

walk: refactor walk plan - never is gone - reorder tests more cleanly - rename nomatches to exact for clearer semantics
author Matt Mackall <mpm@selenic.com>
date Sun, 31 May 2009 17:54:18 -0500
parents 8c7f1afad064
children 0289f384e1e5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8252
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
1 # patchbomb.py - sending Mercurial changesets as patch emails
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
2 #
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
4 #
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
5 # This software may be used and distributed according to the terms of the
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
6 # GNU General Public License version 2, incorporated herein by reference.
9674d64b6416 patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8208
diff changeset
7
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
8 '''sending Mercurial changesets as a series of patch emails
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
9
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
10 The series is started off with a "[PATCH 0 of N]" introduction, which
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
11 describes the series as a whole.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
12
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
13 Each patch email has a Subject line of "[PATCH M of N] ...", using the
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
14 first line of the changeset description as the subject text. The
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
15 message contains two or three body parts:
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
16
8471
e88cc16ba603 patchbomb: fix help to reflect actual operation
Cédric Duval <cedricduval@free.fr>
parents: 8331
diff changeset
17 The changeset description.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
18
7547
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
19 [Optional] The result of running diffstat on the patch.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
20
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
21 The patch itself, as generated by "hg export".
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
22
8510
f3ad1ed099e1 patchbomb: fix inexact description of the messages threading
Cédric Duval <cedricduval@free.fr>
parents: 8473
diff changeset
23 Each message refers to the first in the series using the In-Reply-To
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
24 and References headers, so they will show up as a sequence in threaded
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
25 mail and news readers, and in mail archives.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
26
8511
32ff5ba0d312 patchbomb: clarify diffstat usage
Cédric Duval <cedricduval@free.fr>
parents: 8510
diff changeset
27 With the -d/--diffstat option, you will be prompted for each changeset
32ff5ba0d312 patchbomb: clarify diffstat usage
Cédric Duval <cedricduval@free.fr>
parents: 8510
diff changeset
28 with a diffstat summary and the changeset summary, so you can be sure
32ff5ba0d312 patchbomb: clarify diffstat usage
Cédric Duval <cedricduval@free.fr>
parents: 8510
diff changeset
29 you are sending the right changes.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
30
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
31 To enable this extension:
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
32
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
33 [extensions]
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
34 hgext.patchbomb =
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
35
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
36 To configure other defaults, add a section like this to your hgrc
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
37 file:
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
38
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
39 [email]
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
40 from = My Name <my@email>
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
41 to = recipient1, recipient2, ...
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
42 cc = cc1, cc2, ...
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
43 bcc = bcc1, bcc2, ...
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
44
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
45 Then you can use the "hg email" command to mail a series of changesets
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
46 as a patchbomb.
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
47
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
48 To avoid sending patches prematurely, it is a good idea to first run
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7889
diff changeset
49 the "email" command with the "-n" option (test only). You will be
8512
b87e5ad94229 patchbomb: minor typo and language fixes
Cédric Duval <cedricduval@free.fr>
parents: 8511
diff changeset
50 prompted for an email recipient address, a subject and an introductory
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7889
diff changeset
51 message describing the patches of your patchbomb. Then when all is
8512
b87e5ad94229 patchbomb: minor typo and language fixes
Cédric Duval <cedricduval@free.fr>
parents: 8511
diff changeset
52 done, patchbomb messages are displayed. If the PAGER environment
b87e5ad94229 patchbomb: minor typo and language fixes
Cédric Duval <cedricduval@free.fr>
parents: 8511
diff changeset
53 variable is set, your pager will be fired up once for each patchbomb
b87e5ad94229 patchbomb: minor typo and language fixes
Cédric Duval <cedricduval@free.fr>
parents: 8511
diff changeset
54 message, so you can verify everything is alright.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
55
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
56 The -m/--mbox option is also very useful. Instead of previewing each
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
57 patchbomb message in a pager or sending the messages directly, it will
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
58 create a UNIX mailbox file with the patch emails. This mailbox file
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
59 can be previewed with any mail user agent which supports UNIX mbox
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
60 files, e.g. with mutt:
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
61
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
62 % mutt -R -f mbox
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
63
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
64 When you are previewing the patchbomb messages, you can use `formail'
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
65 (a utility that is commonly installed as part of the procmail
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
66 package), to send each message out:
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
67
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
68 % formail -s sendmail -bm -t < mbox
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6548
diff changeset
69
7694
2ceeb1423544 added information to patchbomb help pointing users to hgrc(5) to configure the [smtp] section in order to send patchbombs
Bill Barry <after.fallout@gmail.com>
parents: 7685
diff changeset
70 That should be all. Now your patchbomb is on its way out.
2ceeb1423544 added information to patchbomb help pointing users to hgrc(5) to configure the [smtp] section in order to send patchbombs
Bill Barry <after.fallout@gmail.com>
parents: 7685
diff changeset
71
2ceeb1423544 added information to patchbomb help pointing users to hgrc(5) to configure the [smtp] section in order to send patchbombs
Bill Barry <after.fallout@gmail.com>
parents: 7685
diff changeset
72 You can also either configure the method option in the email section
8512
b87e5ad94229 patchbomb: minor typo and language fixes
Cédric Duval <cedricduval@free.fr>
parents: 8511
diff changeset
73 to be a sendmail compatible mailer or fill out the [smtp] section so
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
74 that the patchbomb extension can automatically send patchbombs
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
75 directly from the commandline. See the [email] and [smtp] sections in
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
76 hgrc(5) for details.'''
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
77
6478
a135374ed5fc patchbomb: fix cStringIO import (spotted by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 6447
diff changeset
78 import os, errno, socket, tempfile, cStringIO
7192
f31ba106fc19 patchbomb: mime-encode clean utf-8 patches (issue814)
Christian Ebert <blacktrash@gmx.net>
parents: 7115
diff changeset
79 import email.MIMEMultipart, email.MIMEBase
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
80 import email.Utils, email.Encoders, email.Generator
7685
161412a3341c patchbomb: respect diff settings
Martin Geisler <mg@daimi.au.dk>
parents: 7616
diff changeset
81 from mercurial import cmdutil, commands, hg, mail, patch, util
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3887
diff changeset
82 from mercurial.i18n import _
6211
f89fd07fc51d Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 5973
diff changeset
83 from mercurial.node import bin
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
84
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
85 def prompt(ui, prompt, default=None, rest=': ', empty_ok=False):
8208
32a2a1e244f1 ui: make interactive a method
Matt Mackall <mpm@selenic.com>
parents: 8188
diff changeset
86 if not ui.interactive():
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
87 return default
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
88 if default:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
89 prompt += ' [%s]' % default
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
90 prompt += rest
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
91 while True:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
92 r = ui.prompt(prompt, default=default)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
93 if r:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
94 return r
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
95 if default is not None:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
96 return default
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
97 if empty_ok:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
98 return r
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
99 ui.warn(_('Please enter a valid value.\n'))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
100
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
101 def cdiffstat(ui, summary, patchlines):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
102 s = patch.diffstat(patchlines)
7547
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
103 if summary:
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
104 ui.write(summary, '\n')
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
105 ui.write(s, '\n')
7600
f7739cf3833c lowercase prompts
Martin Geisler <mg@daimi.au.dk>
parents: 7547
diff changeset
106 ans = prompt(ui, _('does the diffstat above look okay? '), 'y')
7547
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
107 if not ans.lower().startswith('y'):
4949729ee9ee python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7413
diff changeset
108 raise util.Abort(_('diffstat rejected'))
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
109 return s
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
110
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
111 def makepatch(ui, repo, patch, opts, _charsets, idx, total, patchname=None):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
112
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
113 desc = []
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
114 node = None
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
115 body = ''
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
116
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
117 for line in patch:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
118 if line.startswith('#'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
119 if line.startswith('# Node ID'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
120 node = line.split()[-1]
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
121 continue
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
122 if line.startswith('diff -r') or line.startswith('diff --git'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
123 break
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
124 desc.append(line)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
125
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
126 if not patchname and not node:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
127 raise ValueError
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
128
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
129 if opts.get('attach'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
130 body = ('\n'.join(desc[1:]).strip() or
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
131 'Patch subject is complete summary.')
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
132 body += '\n\n\n'
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
133
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
134 if opts.get('plain'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
135 while patch and patch[0].startswith('# '):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
136 patch.pop(0)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
137 if patch:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
138 patch.pop(0)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
139 while patch and not patch[0].strip():
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
140 patch.pop(0)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
141
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
142 if opts.get('diffstat'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
143 body += cdiffstat(ui, '\n'.join(desc), patch) + '\n\n'
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
144
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
145 if opts.get('attach') or opts.get('inline'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
146 msg = email.MIMEMultipart.MIMEMultipart()
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
147 if body:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
148 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
149 p = mail.mimetextpatch('\n'.join(patch), 'x-patch', opts.get('test'))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
150 binnode = bin(node)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
151 # if node is mq patch, it will have patch file name as tag
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
152 if not patchname:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
153 patchtags = [t for t in repo.nodetags(binnode)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
154 if t.endswith('.patch') or t.endswith('.diff')]
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
155 if patchtags:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
156 patchname = patchtags[0]
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
157 elif total > 1:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
158 patchname = cmdutil.make_filename(repo, '%b-%n.patch',
7359
b0fa5dbd9cdd patchbomb: fix patch name generation in patch series
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7354
diff changeset
159 binnode, seqno=idx, total=total)
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
160 else:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
161 patchname = cmdutil.make_filename(repo, '%b.patch', binnode)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
162 disposition = 'inline'
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
163 if opts.get('attach'):
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
164 disposition = 'attachment'
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
165 p['Content-Disposition'] = disposition + '; filename=' + patchname
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
166 msg.attach(p)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
167 else:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
168 body += '\n'.join(patch)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
169 msg = mail.mimetextpatch(body, display=opts.get('test'))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
170
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
171 subj = desc[0].strip().rstrip('. ')
7360
42f1b8cb9a60 patchbomb: add option to send intro email for a single patch (issue1120)
Chris Winter <elwintro@gmail.com>
parents: 7359
diff changeset
172 if total == 1 and not opts.get('intro'):
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
173 subj = '[PATCH] ' + (opts.get('subject') or subj)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
174 else:
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
175 tlen = len(str(total))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
176 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
177 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
178 msg['X-Mercurial-Node'] = node
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
179 return msg, subj
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
180
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
181 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
182 '''send changesets by email
1204
b0f6053df539 patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1154
diff changeset
183
4283
8625504f507c Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents: 4280
diff changeset
184 By default, diffs are sent in the format generated by hg export,
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7889
diff changeset
185 one per message. The series starts with a "[PATCH 0 of N]"
4283
8625504f507c Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents: 4280
diff changeset
186 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
187
07f931af5f40 add documentation for email command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1670
diff changeset
188 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
189 the first line of the changeset description as the subject text.
8471
e88cc16ba603 patchbomb: fix help to reflect actual operation
Cédric Duval <cedricduval@free.fr>
parents: 8331
diff changeset
190 The message contains two or three parts. First, the changeset
e88cc16ba603 patchbomb: fix help to reflect actual operation
Cédric Duval <cedricduval@free.fr>
parents: 8331
diff changeset
191 description. Next, (optionally) if the diffstat program is
8473
69f51fd9fb48 patchbomb: make diffstat usage clearer
Cédric Duval <cedricduval@free.fr>
parents: 8472
diff changeset
192 installed and -d/--diffstat is used, the result of running
69f51fd9fb48 patchbomb: make diffstat usage clearer
Cédric Duval <cedricduval@free.fr>
parents: 8472
diff changeset
193 diffstat on the patch. Finally, the patch itself, as generated by
69f51fd9fb48 patchbomb: make diffstat usage clearer
Cédric Duval <cedricduval@free.fr>
parents: 8472
diff changeset
194 "hg export".
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
195
8472
223363bb6d66 patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents: 8471
diff changeset
196 By default the patch is included as text in the email body for
223363bb6d66 patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents: 8471
diff changeset
197 easy reviewing. Using the -a/--attach option will instead create
223363bb6d66 patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents: 8471
diff changeset
198 an attachment for the patch. With -i/--inline an inline attachment
223363bb6d66 patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents: 8471
diff changeset
199 will be created.
223363bb6d66 patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents: 8471
diff changeset
200
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
201 With -o/--outgoing, emails will be generated for patches not found
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
202 in the destination repository (or only those which are ancestors
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
203 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
204
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
205 With -b/--bundle, changesets are selected as for --outgoing, but a
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
206 single email containing a binary Mercurial bundle as an attachment
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
207 will be sent.
4280
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
208
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
209 Examples:
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
210
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
211 hg email -r 3000 # send patch 3000 only
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
212 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
213 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
214 hg email 3000 # send patch 3000 (deprecated)
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
215
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
216 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
217 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
218 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
219 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
220
a9336520a4ee Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents: 4279
diff changeset
221 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
222 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
223 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
224 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
225
7997
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
226 Before using this command, you will need to enable email in your
8eb9f495e150 patchbomb: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
227 hgrc. See the [email] section in hgrc(5) for details.
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
228 '''
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
229
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
230 _charsets = mail._charsets(ui)
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
231
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
232 def outgoing(dest, revs):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
233 '''Return the revisions present locally but not in dest'''
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
234 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
235 revs = [repo.lookup(rev) for rev in revs]
8188
f3abe032fc89 add cmdutil.remoteui
Matt Mackall <mpm@selenic.com>
parents: 8160
diff changeset
236 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
237 ui.status(_('comparing with %s\n') % dest)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
238 o = repo.findoutgoing(other)
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
239 if not o:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
240 ui.status(_("no changes found\n"))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
241 return []
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
242 o = repo.changelog.nodesbetween(o, revs or None)[0]
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
243 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
244
7615
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
245 def getpatches(revs):
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
246 for r in cmdutil.revrange(repo, revs):
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
247 output = cStringIO.StringIO()
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7807
diff changeset
248 patch.export(repo, [r], fp=output,
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7807
diff changeset
249 opts=patch.diffopts(ui, opts))
7615
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
250 yield output.getvalue().split('\n')
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
251
4279
126d1967a3f8 Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents: 4278
diff changeset
252 def getbundle(dest):
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
253 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-')
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
254 tmpfn = os.path.join(tmpdir, 'bundle')
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
255 try:
4279
126d1967a3f8 Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents: 4278
diff changeset
256 commands.bundle(ui, repo, tmpfn, dest, **opts)
5752
84a6e463b948 patchbomb: read bundle file in binary mode
Patrick Mezard <pmezard@gmail.com>
parents: 5643
diff changeset
257 return open(tmpfn, 'rb').read()
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
258 finally:
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
259 try:
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
260 os.unlink(tmpfn)
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
261 except:
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
262 pass
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
263 os.rmdir(tmpdir)
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
264
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
265 if not (opts.get('test') or opts.get('mbox')):
5472
23889160905a Catch smtp exceptions
Christian Ebert <blacktrash@gmx.net>
parents: 4887
diff changeset
266 # really sending
4489
a11e13d50645 patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4486
diff changeset
267 mail.validateconfig(ui)
a11e13d50645 patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4486
diff changeset
268
5643
eae4553b2763 patchbomb: make "hg email -b" w/o destination work as advertised
Christian Ebert <blacktrash@gmx.net>
parents: 5479
diff changeset
269 if not (revs or opts.get('rev')
7353
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
270 or opts.get('outgoing') or opts.get('bundle')
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
271 or opts.get('patches')):
4493
ead2fa544cbf patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents: 4492
diff changeset
272 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: 4492
diff changeset
273
4492
c15955bde7dd patchbomb: Fix typo.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4491
diff changeset
274 if opts.get('outgoing') and opts.get('bundle'):
5746
d3ef7e86bc3b patchbomb: break lines > 80 chars (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5677
diff changeset
275 raise util.Abort(_("--outgoing mode always on with --bundle;"
d3ef7e86bc3b patchbomb: break lines > 80 chars (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5677
diff changeset
276 " do not re-specify --outgoing"))
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
277
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
278 if opts.get('outgoing') or opts.get('bundle'):
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
279 if len(revs) > 1:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
280 raise util.Abort(_("too many destinations"))
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
281 dest = revs and revs[0] or None
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
282 revs = []
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
283
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
284 if opts.get('rev'):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
285 if revs:
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
286 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
287 revs = opts.get('rev')
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
288
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
289 if opts.get('outgoing'):
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
290 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
291 if opts.get('bundle'):
126d1967a3f8 Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents: 4278
diff changeset
292 opts['revs'] = revs
4262
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
293
f51317e24114 Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents: 4144
diff changeset
294 # start
4566
087b3ae4f08a patchbomb: add --date option
Bryan O'Sullivan <bos@serpentine.com>
parents: 4565
diff changeset
295 if opts.get('date'):
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
296 start_time = util.parsedate(opts.get('date'))
4566
087b3ae4f08a patchbomb: add --date option
Bryan O'Sullivan <bos@serpentine.com>
parents: 4565
diff changeset
297 else:
087b3ae4f08a patchbomb: add --date option
Bryan O'Sullivan <bos@serpentine.com>
parents: 4565
diff changeset
298 start_time = util.makedate()
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
299
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
300 def genmsgid(id):
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3473
diff changeset
301 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
302
5753
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
303 def getdescription(body, sender):
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
304 if opts.get('desc'):
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
305 body = open(opts.get('desc')).read()
5753
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
306 else:
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
307 ui.write(_('\nWrite the introductory message for the '
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
308 'patch series.\n\n'))
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
309 body = ui.edit(body, sender)
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
310 return body
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
311
7353
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
312 def getpatchmsgs(patches, patchnames=None):
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
313 jumbo = []
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
314 msgs = []
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
315
5746
d3ef7e86bc3b patchbomb: break lines > 80 chars (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5677
diff changeset
316 ui.write(_('This patch series consists of %d patches.\n\n')
d3ef7e86bc3b patchbomb: break lines > 80 chars (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5677
diff changeset
317 % len(patches))
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
318
7353
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
319 name = None
7616
b9bd6f789633 use enumerate instead of zip
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7615
diff changeset
320 for i, p in enumerate(patches):
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
321 jumbo.extend(p)
7353
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
322 if patchnames:
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
323 name = patchnames[i]
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
324 msg = makepatch(ui, repo, p, opts, _charsets, i + 1,
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
325 len(patches), name)
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
326 msgs.append(msg)
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
327
7360
42f1b8cb9a60 patchbomb: add option to send intro email for a single patch (issue1120)
Chris Winter <elwintro@gmail.com>
parents: 7359
diff changeset
328 if len(patches) > 1 or opts.get('intro'):
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
329 tlen = len(str(len(patches)))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
330
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
331 subj = '[PATCH %0*d of %d] %s' % (
5786
c69ef6fdb092 patchbomb: simplify some line continuations
Christian Ebert <blacktrash@gmx.net>
parents: 5785
diff changeset
332 tlen, 0, len(patches),
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
333 opts.get('subject') or
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
334 prompt(ui, 'Subject:',
5786
c69ef6fdb092 patchbomb: simplify some line continuations
Christian Ebert <blacktrash@gmx.net>
parents: 5785
diff changeset
335 rest=' [PATCH %0*d of %d] ' % (tlen, 0, len(patches))))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
336
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
337 body = ''
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
338 if opts.get('diffstat'):
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
339 d = cdiffstat(ui, _('Final summary:\n'), jumbo)
5785
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
340 if d:
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
341 body = '\n' + d
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
342
5753
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
343 body = getdescription(body, sender)
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
344 msg = mail.mimeencode(ui, body, _charsets, opts.get('test'))
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
345 msg['Subject'] = mail.headencode(ui, subj, _charsets,
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
346 opts.get('test'))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
347
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
348 msgs.insert(0, (msg, subj))
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
349 return msgs
2704
99e7cf6bd2f7 make introductory message of patch series text/plain
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
350
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
351 def getbundlemsgs(bundle):
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
352 subj = (opts.get('subject')
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
353 or prompt(ui, 'Subject:', 'A bundle for your repository'))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
354
5753
ea1016b32e94 patchbomb: make --bundle respect --desc
Patrick Mezard <pmezard@gmail.com>
parents: 5752
diff changeset
355 body = getdescription('', sender)
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
356 msg = email.MIMEMultipart.MIMEMultipart()
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
357 if body:
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
358 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
359 datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle')
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
360 datapart.set_payload(bundle)
7889
5ac1a72e5b74 patchbomb: option to set the name of bundle attachment (issue1452)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7874
diff changeset
361 bundlename = '%s.hg' % opts.get('bundlename', 'bundle')
4284
a04141f51056 Add a filename for the bundle
John Goerzen <jgoerzen@complete.org>
parents: 4283
diff changeset
362 datapart.add_header('Content-Disposition', 'attachment',
7889
5ac1a72e5b74 patchbomb: option to set the name of bundle attachment (issue1452)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7874
diff changeset
363 filename=bundlename)
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
364 email.Encoders.encode_base64(datapart)
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
365 msg.attach(datapart)
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
366 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
367 return [(msg, subj)]
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
368
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
369 sender = (opts.get('from') or ui.config('email', 'from') or
2198
564034552f7f rename [patchbomb] section to [email] section in hgrc. old name still ok.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2165
diff changeset
370 ui.config('patchbomb', 'from') or
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
371 prompt(ui, 'From', ui.username()))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
372
7615
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
373 # internal option used by pbranches
7353
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
374 patches = opts.get('patches')
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
375 if patches:
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
376 msgs = getpatchmsgs(patches, opts.get('patchnames'))
982b55ec80be patchbomb: make `hg email` reusable for other patch sources
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7352
diff changeset
377 elif opts.get('bundle'):
4279
126d1967a3f8 Add common bundle/outgoing options to hg email
John Goerzen <jgoerzen@complete.org>
parents: 4278
diff changeset
378 msgs = getbundlemsgs(getbundle(dest))
4278
cfe886c14ddf Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents: 4262
diff changeset
379 else:
7615
ab39d1813e51 patch: export shouldn't close files received as a parameter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7600
diff changeset
380 msgs = getpatchmsgs(list(getpatches(revs)))
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
381
1154
c3cb9f39a91f patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents: 1136
diff changeset
382 def getaddrs(opt, prpt, default = None):
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
383 addrs = opts.get(opt) or (ui.config('email', opt) or
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
384 ui.config('patchbomb', opt) or
7354
cad454f295b0 patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7353
diff changeset
385 prompt(ui, prpt, default)).split(',')
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
386 return [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
387 for a in addrs if a.strip()]
4485
82bc6aef8b43 patchbomb: Don't prompt for headers until sure we have revs to export.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4284
diff changeset
388
1154
c3cb9f39a91f patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents: 1136
diff changeset
389 to = getaddrs('to', 'To')
c3cb9f39a91f patchbomb: fix up confusion between strings and lists of strings.
bos@serpentine.internal.keyresearch.com
parents: 1136
diff changeset
390 cc = getaddrs('cc', 'Cc', '')
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
391
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
392 bcc = opts.get('bcc') or (ui.config('email', 'bcc') or
2679
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
393 ui.config('patchbomb', 'bcc') or '').split(',')
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
394 bcc = [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
395 for a in bcc if a.strip()]
2679
f1de91be1d87 optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents: 2443
diff changeset
396
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
397 ui.write('\n')
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
398
8025
1280934dd2dd patchbomb: Support initial in-reply-to header
Henrik Stuart <henrik.stuart at edlund.dk>
parents: 7997
diff changeset
399 parent = opts.get('in_reply_to') or None
8514
252232621165 patchbomb: with --in-reply-to, still thread message under first in series
Cédric Duval <cedricduval@free.fr>
parents: 8512
diff changeset
400 first = True
2443
bd9c39e8f38b patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents: 2292
diff changeset
401
1827
26dd4ae77b7b get patchbomb extension to use demandload. speeds up hg startup by 50%.
Vadim Gelfer <vadim.gelger@gmail.com>
parents: 1702
diff changeset
402 sender_addr = email.Utils.parseaddr(sender)[1]
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
403 sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
5973
ea77f6f77514 patchbomb: undo backout and fix bugs in the earlier patch
Matt Mackall <mpm@selenic.com>
parents: 5948
diff changeset
404 sendmail = None
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
405 for m, subj in msgs:
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
406 try:
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
407 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
408 except TypeError:
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
409 m['Message-Id'] = genmsgid('patchbomb')
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
410 if parent:
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
411 m['In-Reply-To'] = parent
7413
0b6428da1f22 email: add References field in the header
Benoit Allard <benoit@aeteurope.nl>
parents: 7360
diff changeset
412 m['References'] = parent
8514
252232621165 patchbomb: with --in-reply-to, still thread message under first in series
Cédric Duval <cedricduval@free.fr>
parents: 8512
diff changeset
413 if first:
876
14cfaaec2e8e Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents: 875
diff changeset
414 parent = m['Message-Id']
8514
252232621165 patchbomb: with --in-reply-to, still thread message under first in series
Cédric Duval <cedricduval@free.fr>
parents: 8512
diff changeset
415 first = False
252232621165 patchbomb: with --in-reply-to, still thread message under first in series
Cédric Duval <cedricduval@free.fr>
parents: 8512
diff changeset
416
8160
094e0d982c8a patchbomb: add user agent header to mails
Henrik Stuart <hg@hstuart.dk>
parents: 8076
diff changeset
417 m['User-Agent'] = 'Mercurial-patchbomb/%s' % util.version()
8520
8c7f1afad064 patchbomb: don't localize Date headers
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8514
diff changeset
418 m['Date'] = email.Utils.formatdate(start_time[0])
2443
bd9c39e8f38b patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents: 2292
diff changeset
419
4027
2601ac9c54f0 patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents: 3473
diff changeset
420 start_time = (start_time[0] + 1, start_time[1])
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
421 m['From'] = sender
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
422 m['To'] = ', '.join(to)
5785
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
423 if cc:
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
424 m['Cc'] = ', '.join(cc)
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
425 if bcc:
38cd1ce8650d patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents: 5758
diff changeset
426 m['Bcc'] = ', '.join(bcc)
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
427 if opts.get('test'):
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
428 ui.status(_('Displaying '), subj, ' ...\n')
4596
8e37342cb05d patchbomb: flush ui before delegating to pager.
Patrick Mezard <pmezard@gmail.com>
parents: 4142
diff changeset
429 ui.flush()
4599
88fc92b0b821 patchbomb: page patchbomb messages only if PAGER is defined.
Patrick Mezard <pmezard@gmail.com>
parents: 4597
diff changeset
430 if 'PAGER' in os.environ:
6548
962eb403165b replace usage of os.popen() with util.popen()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6478
diff changeset
431 fp = util.popen(os.environ['PAGER'], 'w')
4599
88fc92b0b821 patchbomb: page patchbomb messages only if PAGER is defined.
Patrick Mezard <pmezard@gmail.com>
parents: 4597
diff changeset
432 else:
88fc92b0b821 patchbomb: page patchbomb messages only if PAGER is defined.
Patrick Mezard <pmezard@gmail.com>
parents: 4597
diff changeset
433 fp = ui
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
434 generator = email.Generator.Generator(fp, mangle_from_=False)
1871
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
435 try:
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
436 generator.flatten(m, 0)
1871
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
437 fp.write('\n')
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
438 except IOError, inst:
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
439 if inst.errno != errno.EPIPE:
258e3a7955b8 patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1846
diff changeset
440 raise
4599
88fc92b0b821 patchbomb: page patchbomb messages only if PAGER is defined.
Patrick Mezard <pmezard@gmail.com>
parents: 4597
diff changeset
441 if fp is not ui:
88fc92b0b821 patchbomb: page patchbomb messages only if PAGER is defined.
Patrick Mezard <pmezard@gmail.com>
parents: 4597
diff changeset
442 fp.close()
5818
77775ae8d5d9 patchbomb: consistently use opts.get
Christian Ebert <blacktrash@gmx.net>
parents: 5817
diff changeset
443 elif opts.get('mbox'):
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
444 ui.status(_('Writing '), subj, ' ...\n')
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5866
diff changeset
445 fp = open(opts.get('mbox'), 'In-Reply-To' in m and 'ab+' or 'wb+')
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
446 generator = email.Generator.Generator(fp, mangle_from_=True)
6229
c3182eeb70ea dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
447 date = util.datestr(start_time, '%a %b %d %H:%M:%S %Y')
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
448 fp.write('From %s %s\n' % (sender_addr, date))
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
449 generator.flatten(m, 0)
1702
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
450 fp.write('\n\n')
e291d9a30bef add --mbox output to patchbomb
Johannes Stezenbach <js@linuxtv.org>
parents: 1691
diff changeset
451 fp.close()
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
452 else:
5973
ea77f6f77514 patchbomb: undo backout and fix bugs in the earlier patch
Matt Mackall <mpm@selenic.com>
parents: 5948
diff changeset
453 if not sendmail:
ea77f6f77514 patchbomb: undo backout and fix bugs in the earlier patch
Matt Mackall <mpm@selenic.com>
parents: 5948
diff changeset
454 sendmail = mail.connect(ui)
7115
c5c2d43b01da patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents: 7095
diff changeset
455 ui.status(_('Sending '), subj, ' ...\n')
2790
58a679745b38 mailbomb: add a comment and remove the bcc in a more pythonic way
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2732
diff changeset
456 # 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: 2732
diff changeset
457 del m['Bcc']
6447
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
458 fp = cStringIO.StringIO()
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
459 generator = email.Generator.Generator(fp, mangle_from_=False)
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
460 generator.flatten(m, 0)
9d2ce19bdacd patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6229
diff changeset
461 sendmail(sender, to + bcc + cc, fp.getvalue())
875
d3f836bf6cc1 Add patchbomb script.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
462
7352
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
463 emailopts = [
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
464 ('a', 'attach', None, _('send patches as attachments')),
5819
89ea99c7bdfd patchbomb: attachment options changed
Dennis Schoen <ds@1d10t.de>
parents: 5818
diff changeset
465 ('i', 'inline', None, _('send patches as inline attachments')),
7807
bd8f44638847 help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents: 7694
diff changeset
466 ('', 'bcc', [], _('email addresses of blind carbon copy recipients')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
467 ('c', 'cc', [], _('email addresses of copy recipients')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
468 ('d', 'diffstat', None, _('add diffstat output to messages')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
469 ('', 'date', '', _('use the given date as the sending date')),
4887
2f09df302f30 patchbomb: add --desc, to specify a file containing a series description
Bryan O'Sullivan <bos@serpentine.com>
parents: 4730
diff changeset
470 ('', 'desc', '', _('use the given file as the series description')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
471 ('f', 'from', '', _('email address of sender')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
472 ('n', 'test', None, _('print messages that would be sent')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
473 ('m', 'mbox', '',
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
474 _('write messages to mbox file instead of sending them')),
7352
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
475 ('s', 'subject', '',
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
476 _('subject of first message (intro or single patch)')),
8025
1280934dd2dd patchbomb: Support initial in-reply-to header
Henrik Stuart <henrik.stuart at edlund.dk>
parents: 7997
diff changeset
477 ('', 'in-reply-to', '',
8331
03cfc6ea93df patchbomb: fix quotes in help string
Martin Geisler <mg@lazybytes.net>
parents: 8252
diff changeset
478 _('message identifier to reply to')),
7352
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
479 ('t', 'to', [], _('email addresses of recipients')),
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
480 ]
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
481
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
482
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
483 cmdtable = {
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
484 "email":
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
485 (patchbomb,
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
486 [('g', 'git', None, _('use git extended diff format')),
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
487 ('', 'plain', None, _('omit hg patch header')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
488 ('o', 'outgoing', None,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
489 _('send changes not found in the target repository')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
490 ('b', 'bundle', None,
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
491 _('send changes not in target as a binary bundle')),
7889
5ac1a72e5b74 patchbomb: option to set the name of bundle attachment (issue1452)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7874
diff changeset
492 ('', 'bundlename', 'bundle',
5ac1a72e5b74 patchbomb: option to set the name of bundle attachment (issue1452)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7874
diff changeset
493 _('file name of the bundle attachment')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
494 ('r', 'rev', [], _('a revision to send')),
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
495 ('', 'force', None,
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
496 _('run even when remote repository is unrelated '
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
497 '(with -b/--bundle)')),
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
498 ('', 'base', [],
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
499 _('a base changeset to specify instead of a destination '
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8025
diff changeset
500 '(with -b/--bundle)')),
7360
42f1b8cb9a60 patchbomb: add option to send intro email for a single patch (issue1120)
Chris Winter <elwintro@gmail.com>
parents: 7359
diff changeset
501 ('', 'intro', None,
42f1b8cb9a60 patchbomb: add option to send intro email for a single patch (issue1120)
Chris Winter <elwintro@gmail.com>
parents: 7359
diff changeset
502 _('send an introduction email for a single patch')),
7352
6c336e7dc145 patchbomb: make options to email command reusable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7322
diff changeset
503 ] + emailopts + commands.remoteopts,
4730
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
504 _('hg email [OPTION]... [DEST]...'))
eadfaa9ec487 Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
505 }