Mercurial > hg
annotate hgext/patchbomb.py @ 43117:8ff1ecfadcd1
cleanup: join string literals that are already on one line
Thanks to Kyle for noticing this and for providing the regular
expression to run on the codebase.
This patch has been reviewed by the test suite and they approved of
it.
# skip-blame: fallout from mass reformatting
Differential Revision: https://phab.mercurial-scm.org/D7028
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 08 Oct 2019 15:06:18 -0700 |
parents | f1c5358f0d65 |
children | 3460eee570f7 |
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 |
10263 | 6 # GNU General Public License version 2 or any later version. |
8252
9674d64b6416
patchbomb: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents:
8208
diff
changeset
|
7 |
8935
f4f0e902b750
extensions: change descriptions for hook-providing extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8934
diff
changeset
|
8 '''command to send changesets as (a series of) patch emails |
6666
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 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
13 Each patch email has a Subject line of "[PATCH M of N] ...", using the |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
14 first line of the changeset description as the subject text. The |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
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 |
9300
ad95ea1c975a
patchbomb: use a list instead of indented paragraphs
Martin Geisler <mg@lazybytes.net>
parents:
9289
diff
changeset
|
17 - The changeset description. |
ad95ea1c975a
patchbomb: use a list instead of indented paragraphs
Martin Geisler <mg@lazybytes.net>
parents:
9289
diff
changeset
|
18 - [Optional] The result of running diffstat on the patch. |
10973
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
10734
diff
changeset
|
19 - The patch itself, as generated by :hg:`export`. |
6666
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
20 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
21 Each message refers to the first in the series using the In-Reply-To |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
22 and References headers, so they will show up as a sequence in threaded |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
23 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
|
24 |
13838
c5709dfa5c1e
patchbomb, help/hgweb: do not refer to config files as hgrc files
Martin Geisler <mg@aragost.com>
parents:
13400
diff
changeset
|
25 To configure other defaults, add a section like this to your |
c5709dfa5c1e
patchbomb, help/hgweb: do not refer to config files as hgrc files
Martin Geisler <mg@aragost.com>
parents:
13400
diff
changeset
|
26 configuration file:: |
6666
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
27 |
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
28 [email] |
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
29 from = My Name <my@email> |
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
30 to = recipient1, recipient2, ... |
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
31 cc = cc1, cc2, ... |
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
32 bcc = bcc1, bcc2, ... |
11150
f66ca4431eb9
patchbomb: Reply-To support
Cédric Duval <cedricduval@free.fr>
parents:
10973
diff
changeset
|
33 reply-to = address1, address2, ... |
6666
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
34 |
10284
b08ffd27dfc8
patchbomb: document [patchbomb] config section for addresses
Christian Ebert <blacktrash@gmx.net>
parents:
10263
diff
changeset
|
35 Use ``[patchbomb]`` as configuration section name if you need to |
b08ffd27dfc8
patchbomb: document [patchbomb] config section for addresses
Christian Ebert <blacktrash@gmx.net>
parents:
10263
diff
changeset
|
36 override global ``[email]`` address settings. |
b08ffd27dfc8
patchbomb: document [patchbomb] config section for addresses
Christian Ebert <blacktrash@gmx.net>
parents:
10263
diff
changeset
|
37 |
10973
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
10734
diff
changeset
|
38 Then you can use the :hg:`email` command to mail a series of |
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
10734
diff
changeset
|
39 changesets as a patchbomb. |
6666
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6548
diff
changeset
|
40 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
41 You can also either configure the method option in the email section |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
42 to be a sendmail compatible mailer or fill out the [smtp] section so |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
43 that the patchbomb extension can automatically send patchbombs |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
44 directly from the commandline. See the [email] and [smtp] sections in |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
45 hgrc(5) for details. |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
46 |
27697
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
47 By default, :hg:`email` will prompt for a ``To`` or ``CC`` header if |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
48 you do not supply one via configuration or the command line. You can |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
49 override this to never prompt by configuring an empty value:: |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
50 |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
51 [email] |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
52 cc = |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
53 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
54 You can control the default inclusion of an introduction message with the |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
55 ``patchbomb.intro`` configuration option. The configuration is always |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
56 overwritten by command line flags like --intro and --desc:: |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
57 |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
58 [patchbomb] |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
59 intro=auto # include introduction message if more than 1 patch (default) |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
60 intro=never # never include an introduction message |
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
61 intro=always # always include an introduction message |
23488
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
62 |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
63 You can specify a template for flags to be added in subject prefixes. Flags |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
64 specified by --flag option are exported as ``{flags}`` keyword:: |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
65 |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
66 [patchbomb] |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
67 flagtemplate = "{separate(' ', |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
68 ifeq(branch, 'default', '', branch|upper), |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
69 flags)}" |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
70 |
23488
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
71 You can set patchbomb to always ask for confirmation by setting |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
72 ``patchbomb.confirm`` to true. |
9071
141e3ef20d84
patchbomb: wrapped docstrings at 78 characters
Martin Geisler <mg@lazybytes.net>
parents:
9047
diff
changeset
|
73 ''' |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
74 from __future__ import absolute_import |
875 | 75 |
39032
8979626089bb
patchbomb: use email.encoders instead of email.Encoders
Augie Fackler <augie@google.com>
parents:
39027
diff
changeset
|
76 import email.encoders as emailencoders |
36435
f449138a52df
py3: use email.generator module instead of email.Generator
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36410
diff
changeset
|
77 import email.generator as emailgen |
38472
d17d1ee1d602
patchbomb: use email.mime.base instead of email.MIMEBase
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38471
diff
changeset
|
78 import email.mime.base as emimebase |
38471
91228d9ae7c8
patchbomb: use email.mime.multipart instead of email.MIMEMultipart
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38403
diff
changeset
|
79 import email.mime.multipart as emimemultipart |
36448
39c9f339b692
py3: use email.utils module instead of email.Utils
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36446
diff
changeset
|
80 import email.utils as eutil |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
81 import errno |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
82 import os |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
83 import socket |
19810
c80feeb715d1
python2.4: fix imports of sub-packages of the email package
Augie Fackler <raf@durin42.com>
parents:
19791
diff
changeset
|
84 |
29205
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
28981
diff
changeset
|
85 from mercurial.i18n import _ |
43085
eef9a2d67051
py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
86 from mercurial.pycompat import open |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
87 from mercurial import ( |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
88 cmdutil, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
89 commands, |
36449
a918c996a881
py3: use encoding.strtolocal() to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36448
diff
changeset
|
90 encoding, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
91 error, |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
92 formatter, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
93 hg, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
94 mail, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
95 node as nodemod, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
96 patch, |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
97 pycompat, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31490
diff
changeset
|
98 registrar, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
99 scmutil, |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
100 templater, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
101 util, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
102 ) |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
103 from mercurial.utils import dateutil |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
104 |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28474
diff
changeset
|
105 stringio = util.stringio |
875 | 106 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
107 cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31490
diff
changeset
|
108 command = registrar.command(cmdtable) |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
109 |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
110 configtable = {} |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
111 configitem = registrar.configitem(configtable) |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
112 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
113 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
114 b'patchbomb', b'bundletype', default=None, |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
115 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
116 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
117 b'patchbomb', b'bcc', default=None, |
34760
3819809198c6
configitems: register the 'patchbomb.bcc' config
Boris Feld <boris.feld@octobus.net>
parents:
34116
diff
changeset
|
118 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
119 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
120 b'patchbomb', b'cc', default=None, |
34761
cb1ea7ef773d
configitems: register the 'patchbomb.cc' config
Boris Feld <boris.feld@octobus.net>
parents:
34760
diff
changeset
|
121 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
122 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
123 b'patchbomb', b'confirm', default=False, |
34112
4ec0029b76e8
configitems: register the 'patchbomb.confirm' config
Boris Feld <boris.feld@octobus.net>
parents:
34111
diff
changeset
|
124 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
125 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
126 b'patchbomb', b'flagtemplate', default=None, |
34113
a6fa5af781a4
configitems: register the 'patchbomb.flagtemplate' config
Boris Feld <boris.feld@octobus.net>
parents:
34112
diff
changeset
|
127 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
128 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
129 b'patchbomb', b'from', default=None, |
34114
7e2adac3dd60
configitems: register the 'patchbomb.from' config
Boris Feld <boris.feld@octobus.net>
parents:
34113
diff
changeset
|
130 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
131 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
132 b'patchbomb', b'intro', default=b'auto', |
34115
97a3bb5aff25
configitems: register the 'patchbomb.intro' config
Boris Feld <boris.feld@octobus.net>
parents:
34114
diff
changeset
|
133 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
134 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 b'patchbomb', b'publicurl', default=None, |
34116
aeb956e7729f
configitems: register the 'patchbomb.publicurl' config
Boris Feld <boris.feld@octobus.net>
parents:
34115
diff
changeset
|
136 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
137 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
138 b'patchbomb', b'reply-to', default=None, |
34762
9223a437fdb6
configitems: register the 'patchbomb.reply-to' config
Boris Feld <boris.feld@octobus.net>
parents:
34761
diff
changeset
|
139 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
140 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
141 b'patchbomb', b'to', default=None, |
34911
645b6684cf5b
configitems: register 'email.to' and 'patchbomb.to'
Yuya Nishihara <yuya@tcha.org>
parents:
34762
diff
changeset
|
142 ) |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
143 |
39022
b95538a21613
patchbomb: work around email module really wanting to write unicode data
Augie Fackler <augie@google.com>
parents:
38776
diff
changeset
|
144 if pycompat.ispy3: |
b95538a21613
patchbomb: work around email module really wanting to write unicode data
Augie Fackler <augie@google.com>
parents:
38776
diff
changeset
|
145 _bytesgenerator = emailgen.BytesGenerator |
b95538a21613
patchbomb: work around email module really wanting to write unicode data
Augie Fackler <augie@google.com>
parents:
38776
diff
changeset
|
146 else: |
39104
2e578eced958
patchbomb: really use BytesGenerator API
Yuya Nishihara <yuya@tcha.org>
parents:
39038
diff
changeset
|
147 _bytesgenerator = emailgen.Generator |
39022
b95538a21613
patchbomb: work around email module really wanting to write unicode data
Augie Fackler <augie@google.com>
parents:
38776
diff
changeset
|
148 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29285
diff
changeset
|
149 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24568
diff
changeset
|
150 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24568
diff
changeset
|
151 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24568
diff
changeset
|
152 # leave the attribute unspecified. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
153 testedwith = b'ships-with-hg-core' |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
154 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
155 |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
156 def _addpullheader(seq, ctx): |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
157 """Add a header pointing to a public URL where the changeset is available |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
158 """ |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
159 repo = ctx.repo() |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
160 # experimental config: patchbomb.publicurl |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
161 # waiting for some logic that check that the changeset are available on the |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
162 # destination before patchbombing anything. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
163 publicurl = repo.ui.config(b'patchbomb', b'publicurl') |
32825
16ff5c6066a6
patchbomb: look for non-empty publicurl, not a non-None one
Augie Fackler <augie@google.com>
parents:
32824
diff
changeset
|
164 if publicurl: |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
165 return b'Available At %s\n# hg pull %s -r %s' % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
166 publicurl, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
167 publicurl, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
168 ctx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
169 ) |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
170 return None |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
171 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
172 |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
173 def uisetup(ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
174 cmdutil.extraexport.append(b'pullurl') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 cmdutil.extraexportmap[b'pullurl'] = _addpullheader |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
177 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
32826
diff
changeset
|
178 def reposetup(ui, repo): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
32826
diff
changeset
|
179 if not repo.local(): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
32826
diff
changeset
|
180 return |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 repo._wlockfreeprefix.add(b'last-email.txt') |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
182 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
183 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
184 def prompt(ui, prompt, default=None, rest=b':'): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
185 if default: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
186 prompt += b' [%s]' % default |
15166
9ec9dd8d1b24
patchbomb: drop loop in prompt
Matt Mackall <mpm@selenic.com>
parents:
15165
diff
changeset
|
187 return ui.prompt(prompt + rest, default) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
189 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
190 def introwanted(ui, opts, number): |
15164
7bddec632821
patchbomb: make it easy for the user to decline sending an intro message.
Greg Ward <greg@gerg.ca>
parents:
15162
diff
changeset
|
191 '''is an introductory message apparently wanted?''' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
192 introconfig = ui.config(b'patchbomb', b'intro') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 if opts.get(b'intro') or opts.get(b'desc'): |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
194 intro = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
195 elif introconfig == b'always': |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
196 intro = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
197 elif introconfig == b'never': |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
198 intro = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 elif introconfig == b'auto': |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
39118
diff
changeset
|
200 intro = number > 1 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
201 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
202 ui.write_err( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 _(b'warning: invalid patchbomb.intro value "%s"\n') % introconfig |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
204 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
205 ui.write_err(_(b'(should be one of always, never, auto)\n')) |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
39118
diff
changeset
|
206 intro = number > 1 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
207 return intro |
10734
7a0502a6f9a1
patchbomb: --desc implies --intro
Cédric Duval <cedricduval@free.fr>
parents:
10611
diff
changeset
|
208 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
209 |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
210 def _formatflags(ui, repo, rev, flags): |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
211 """build flag string optionally by template""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 tmpl = ui.config(b'patchbomb', b'flagtemplate') |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
213 if not tmpl: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
214 return b' '.join(flags) |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
215 out = util.stringio() |
43099
f1c5358f0d65
formatter: pass in template spec to templateformatter as argument
Yuya Nishihara <yuya@tcha.org>
parents:
43085
diff
changeset
|
216 spec = formatter.templatespec(b'', templater.unquotestring(tmpl), None) |
f1c5358f0d65
formatter: pass in template spec to templateformatter as argument
Yuya Nishihara <yuya@tcha.org>
parents:
43085
diff
changeset
|
217 with formatter.templateformatter(ui, out, b'patchbombflag', {}, spec) as fm: |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
218 fm.startitem() |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
219 fm.context(ctx=repo[rev]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
220 fm.write(b'flags', b'%s', fm.formatlist(flags, name=b'flag')) |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
221 return out.getvalue() |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
222 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
223 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
224 def _formatprefix(ui, repo, rev, flags, idx, total, numbered): |
31183
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
225 """build prefix to patch subject""" |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
226 flag = _formatflags(ui, repo, rev, flags) |
31183
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
227 if flag: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
228 flag = b' ' + flag |
31183
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
229 |
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
230 if not numbered: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
231 return b'[PATCH%s]' % flag |
31183
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
232 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 tlen = len(b"%d" % total) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
234 return b'[PATCH %0*d of %d%s]' % (tlen, idx, total, flag) |
31183
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
235 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
236 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
237 def makepatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
238 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
239 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
240 rev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
241 patchlines, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
242 opts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
243 _charsets, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
244 idx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
245 total, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
246 numbered, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
247 patchname=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
248 ): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
249 |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
250 desc = [] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
251 node = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
252 body = b'' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
253 |
12199
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
254 for line in patchlines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
255 if line.startswith(b'#'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
256 if line.startswith(b'# Node ID'): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
257 node = line.split()[-1] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
258 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
259 if line.startswith(b'diff -r') or line.startswith(b'diff --git'): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
260 break |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
261 desc.append(line) |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
262 |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
263 if not patchname and not node: |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
264 raise ValueError |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
265 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
266 if opts.get(b'attach') and not opts.get(b'body'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
267 body = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
268 b'\n'.join(desc[1:]).strip() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
269 or b'Patch subject is complete summary.' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
270 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
271 body += b'\n\n\n' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
272 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
273 if opts.get(b'plain'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
274 while patchlines and patchlines[0].startswith(b'# '): |
12199
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
275 patchlines.pop(0) |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
276 if patchlines: |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
277 patchlines.pop(0) |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
278 while patchlines and not patchlines[0].strip(): |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
279 patchlines.pop(0) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
280 |
30407
e1677cc29da6
patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents:
29841
diff
changeset
|
281 ds = patch.diffstat(patchlines) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
282 if opts.get(b'diffstat'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
283 body += ds + b'\n\n' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
284 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
285 addattachment = opts.get(b'attach') or opts.get(b'inline') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
286 if not addattachment or opts.get(b'body'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
287 body += b'\n'.join(patchlines) |
16307
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
288 |
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
289 if addattachment: |
38471
91228d9ae7c8
patchbomb: use email.mime.multipart instead of email.MIMEMultipart
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38403
diff
changeset
|
290 msg = emimemultipart.MIMEMultipart() |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
291 if body: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
292 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get(b'test'))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
293 p = mail.mimetextpatch( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
294 b'\n'.join(patchlines), b'x-patch', opts.get(b'test') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
295 ) |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
296 binnode = nodemod.bin(node) |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8520
diff
changeset
|
297 # if node is mq patch, it will have the patch file's name as a tag |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
298 if not patchname: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
299 patchtags = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
300 t |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
301 for t in repo.nodetags(binnode) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
302 if t.endswith(b'.patch') or t.endswith(b'.diff') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
303 ] |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
304 if patchtags: |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
305 patchname = patchtags[0] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
306 elif total > 1: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
307 patchname = cmdutil.makefilename( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
308 repo[node], b'%b-%n.patch', seqno=idx, total=total |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
309 ) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
310 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
311 patchname = cmdutil.makefilename(repo[node], b'%b.patch') |
39038
2161faf0d24b
patchbomb: use native strings when determining attachment disposition
Augie Fackler <augie@google.com>
parents:
39035
diff
changeset
|
312 disposition = r'inline' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
313 if opts.get(b'attach'): |
39038
2161faf0d24b
patchbomb: use native strings when determining attachment disposition
Augie Fackler <augie@google.com>
parents:
39035
diff
changeset
|
314 disposition = r'attachment' |
2161faf0d24b
patchbomb: use native strings when determining attachment disposition
Augie Fackler <augie@google.com>
parents:
39035
diff
changeset
|
315 p[r'Content-Disposition'] = ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
316 disposition + r'; filename=' + encoding.strfromlocal(patchname) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
317 ) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
318 msg.attach(p) |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
319 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
320 msg = mail.mimetextpatch(body, display=opts.get(b'test')) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
321 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
322 prefix = _formatprefix( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 ui, repo, rev, opts.get(b'flag'), idx, total, numbered |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
324 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
325 subj = desc[0].strip().rstrip(b'. ') |
15164
7bddec632821
patchbomb: make it easy for the user to decline sending an intro message.
Greg Ward <greg@gerg.ca>
parents:
15162
diff
changeset
|
326 if not numbered: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
327 subj = b' '.join([prefix, opts.get(b'subject') or subj]) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
328 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
329 subj = b' '.join([prefix, subj]) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
330 msg[b'Subject'] = mail.headencode(ui, subj, _charsets, opts.get(b'test')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 msg[b'X-Mercurial-Node'] = node |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
332 msg[b'X-Mercurial-Series-Index'] = b'%i' % idx |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
333 msg[b'X-Mercurial-Series-Total'] = b'%i' % total |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
334 return msg, subj, ds |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
335 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
336 |
23210
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
337 def _getpatches(repo, revs, **opts): |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
338 """return a list of patches for a list of revisions |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
339 |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
340 Each patch in the list is itself a list of lines. |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
341 """ |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
342 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
343 prev = repo[b'.'].rev() |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
344 for r in revs: |
23210
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
345 if r == prev and (repo[None].files() or repo[None].deleted()): |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
346 ui.warn(_(b'warning: working directory has uncommitted changes\n')) |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28474
diff
changeset
|
347 output = stringio() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
348 cmdutil.exportfile( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
349 repo, [r], output, opts=patch.difffeatureopts(ui, opts, git=True) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
350 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
351 yield output.getvalue().split(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
352 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
353 |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
354 def _getbundle(repo, dest, **opts): |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
355 """return a bundle containing changesets missing in "dest" |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
356 |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
357 The `opts` keyword-arguments are the same as the one accepted by the |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
358 `bundle` command. |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
359 |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
360 The bundle is a returned as a single in-memory binary blob. |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
361 """ |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
362 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
363 tmpdir = pycompat.mkdtemp(prefix=b'hg-email-bundle-') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
364 tmpfn = os.path.join(tmpdir, b'bundle') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
365 btype = ui.config(b'patchbomb', b'bundletype') |
26563
d4a1bfe1de63
patchbomb: add a 'bundletype' config under 'patchbomb'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26546
diff
changeset
|
366 if btype: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
367 opts[r'type'] = btype |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
368 try: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
369 commands.bundle(ui, repo, tmpfn, dest, **opts) |
27767
ddfb8887212d
patchbomb: replace file I/O with util.readfile
Bryan O'Sullivan <bryano@fb.com>
parents:
27697
diff
changeset
|
370 return util.readfile(tmpfn) |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
371 finally: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
372 try: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
373 os.unlink(tmpfn) |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
374 except OSError: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
375 pass |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
376 os.rmdir(tmpdir) |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
377 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
378 |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
379 def _getdescription(repo, defaultbody, sender, **opts): |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
380 """obtain the body of the introduction message and return it |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
381 |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
382 This is also used for the body of email with an attached bundle. |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
383 |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
384 The body can be obtained either from the command line option or entered by |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
385 the user through the editor. |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
386 """ |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
387 ui = repo.ui |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
388 if opts.get(r'desc'): |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
389 body = open(opts.get(r'desc')).read() |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
390 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
391 ui.write( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
392 _(b'\nWrite the introductory message for the patch series.\n\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
393 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
394 body = ui.edit( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 defaultbody, sender, repopath=repo.path, action=b'patchbombbody' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
396 ) |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
397 # Save series description in case sendmail fails |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
398 msgfile = repo.vfs(b'last-email.txt', b'wb') |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
399 msgfile.write(body) |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
400 msgfile.close() |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
401 return body |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
402 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
403 |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
404 def _getbundlemsgs(repo, sender, bundle, **opts): |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
405 """Get the full email for sending a given bundle |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
406 |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
407 This function returns a list of "email" tuples (subject, content, None). |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
408 The list is always one message long in that case. |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
409 """ |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
410 ui = repo.ui |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
411 _charsets = mail._charsets(ui) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
412 subj = opts.get(r'subject') or prompt( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 ui, b'Subject:', b'A bundle for your repository' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
414 ) |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
415 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
416 body = _getdescription(repo, b'', sender, **opts) |
38471
91228d9ae7c8
patchbomb: use email.mime.multipart instead of email.MIMEMultipart
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38403
diff
changeset
|
417 msg = emimemultipart.MIMEMultipart() |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
418 if body: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
419 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get(r'test'))) |
39034
751caa6a2936
patchbomb: use sysstrs when describing content-type
Augie Fackler <augie@google.com>
parents:
39033
diff
changeset
|
420 datapart = emimebase.MIMEBase(r'application', r'x-mercurial-bundle') |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
421 datapart.set_payload(bundle) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
422 bundlename = b'%s.hg' % opts.get(r'bundlename', b'bundle') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
423 datapart.add_header( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
424 r'Content-Disposition', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
425 r'attachment', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
426 filename=encoding.strfromlocal(bundlename), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
427 ) |
39032
8979626089bb
patchbomb: use email.encoders instead of email.Encoders
Augie Fackler <augie@google.com>
parents:
39027
diff
changeset
|
428 emailencoders.encode_base64(datapart) |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
429 msg.attach(datapart) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
430 msg[b'Subject'] = mail.headencode(ui, subj, _charsets, opts.get(r'test')) |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
431 return [(msg, subj, None)] |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
432 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
433 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
434 def _makeintro(repo, sender, revs, patches, **opts): |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
435 """make an introduction email, asking the user for content if needed |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
436 |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
437 email is returned as (subject, body, cumulative-diffstat)""" |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
438 ui = repo.ui |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
439 _charsets = mail._charsets(ui) |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
440 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
441 # use the last revision which is likely to be a bookmarked head |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
442 prefix = _formatprefix( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
443 ui, repo, revs.last(), opts.get(r'flag'), 0, len(patches), numbered=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
444 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
445 subj = opts.get(r'subject') or prompt( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
446 ui, b'(optional) Subject: ', rest=prefix, default=b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
447 ) |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
448 if not subj: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
449 return None # skip intro if the user doesn't bother |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
450 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
451 subj = prefix + b' ' + subj |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
452 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 body = b'' |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
454 if opts.get(r'diffstat'): |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
455 # generate a cumulative diffstat of the whole patch series |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
456 diffstat = patch.diffstat(sum(patches, [])) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
457 body = b'\n' + diffstat |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
458 else: |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
459 diffstat = None |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
460 |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
461 body = _getdescription(repo, body, sender, **opts) |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
462 msg = mail.mimeencode(ui, body, _charsets, opts.get(r'test')) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
463 msg[b'Subject'] = mail.headencode(ui, subj, _charsets, opts.get(r'test')) |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
464 return (msg, subj, diffstat) |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
465 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
466 |
31185
bbb5d2aa0bf0
patchbomb: build patch texts by _getpatchmsgs()
Yuya Nishihara <yuya@tcha.org>
parents:
31184
diff
changeset
|
467 def _getpatchmsgs(repo, sender, revs, patchnames=None, **opts): |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
468 """return a list of emails from a list of patches |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
469 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
470 This involves introduction message creation if necessary. |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
471 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
472 This function returns a list of "email" tuples (subject, content, None). |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
473 """ |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
474 bytesopts = pycompat.byteskwargs(opts) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
475 ui = repo.ui |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
476 _charsets = mail._charsets(ui) |
31185
bbb5d2aa0bf0
patchbomb: build patch texts by _getpatchmsgs()
Yuya Nishihara <yuya@tcha.org>
parents:
31184
diff
changeset
|
477 patches = list(_getpatches(repo, revs, **opts)) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
478 msgs = [] |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
479 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
480 ui.write(_(b'this patch series consists of %d patches.\n\n') % len(patches)) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
481 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
482 # build the intro message, or skip it if the user declines |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
483 if introwanted(ui, bytesopts, len(patches)): |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
484 msg = _makeintro(repo, sender, revs, patches, **opts) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
485 if msg: |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
486 msgs.append(msg) |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
487 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
488 # are we going to send more than one message? |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
489 numbered = len(msgs) + len(patches) > 1 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
490 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
491 # now generate the actual patch messages |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
492 name = None |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
493 assert len(revs) == len(patches) |
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
494 for i, (r, p) in enumerate(zip(revs, patches)): |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
495 if patchnames: |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
496 name = patchnames[i] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
497 msg = makepatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
498 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
499 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
500 r, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
501 p, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
502 bytesopts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
503 _charsets, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
504 i + 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
505 len(patches), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
506 numbered, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
507 name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
508 ) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
509 msgs.append(msg) |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
510 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
511 return msgs |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
512 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
513 |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
514 def _getoutgoing(repo, dest, revs): |
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
515 '''Return the revisions present locally but not in dest''' |
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
516 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
517 url = ui.expandpath(dest or b'default-push', dest or b'default') |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
518 url = hg.parseurl(url)[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
519 ui.status(_(b'comparing with %s\n') % util.hidepassword(url)) |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
520 |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
521 revs = [r for r in revs if r >= 0] |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
522 if not revs: |
35674
e711906aa42c
patchbomb: use 'tiprev' when appropriate
Boris Feld <boris.feld@octobus.net>
parents:
35466
diff
changeset
|
523 revs = [repo.changelog.tiprev()] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
524 revs = repo.revs(b'outgoing(%s) and ::%ld', dest or b'', revs) |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
525 if not revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
526 ui.status(_(b"no changes found\n")) |
24567
13f0af2a5a4c
patchbomb: return outgoing revs as a smartset
Yuya Nishihara <yuya@tcha.org>
parents:
24306
diff
changeset
|
527 return revs |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
528 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
529 |
39117
4899c6d22dff
patchbomb: extract function for generating message-id
Augie Fackler <raf@durin42.com>
parents:
39104
diff
changeset
|
530 def _msgid(node, timestamp): |
39118
1415b78869eb
patchbomb: allow using HGHOSTNAME to force a hostname
Augie Fackler <raf@durin42.com>
parents:
39117
diff
changeset
|
531 hostname = encoding.strtolocal(socket.getfqdn()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
532 hostname = encoding.environ.get(b'HGHOSTNAME', hostname) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
533 return b'<%s.%d@%s>' % (node, timestamp, hostname) |
39117
4899c6d22dff
patchbomb: extract function for generating message-id
Augie Fackler <raf@durin42.com>
parents:
39104
diff
changeset
|
534 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
535 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
536 emailopts = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
537 (b'', b'body', None, _(b'send patches as inline message text (default)')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
538 (b'a', b'attach', None, _(b'send patches as attachments')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
539 (b'i', b'inline', None, _(b'send patches as inline attachments')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
540 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
541 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
542 b'bcc', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
543 [], |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
544 _(b'email addresses of blind carbon copy recipients'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
545 _(b'EMAIL'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
546 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
547 (b'c', b'cc', [], _(b'email addresses of copy recipients'), _(b'EMAIL')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
548 (b'', b'confirm', None, _(b'ask for confirmation before sending')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
549 (b'd', b'diffstat', None, _(b'add diffstat output to messages')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
550 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
551 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
552 b'date', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
553 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
554 _(b'use the given date as the sending date'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
555 _(b'DATE'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
556 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
557 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
558 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
559 b'desc', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
560 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
561 _(b'use the given file as the series description'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
562 _(b'FILE'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
563 ), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
564 (b'f', b'from', b'', _(b'email address of sender'), _(b'EMAIL')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
565 (b'n', b'test', None, _(b'print messages that would be sent')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
566 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
567 b'm', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
568 b'mbox', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
570 _(b'write messages to mbox file instead of sending them'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
571 _(b'FILE'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
572 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
573 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
574 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
575 b'reply-to', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
576 [], |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
577 _(b'email addresses replies should be sent to'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
578 _(b'EMAIL'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
579 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
580 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
581 b's', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
582 b'subject', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
583 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
584 _(b'subject of first message (intro or single patch)'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
585 _(b'TEXT'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
586 ), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
587 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
588 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
589 b'in-reply-to', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
590 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
591 _(b'message identifier to reply to'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
592 _(b'MSGID'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
593 ), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
594 (b'', b'flag', [], _(b'flags to add in subject prefixes'), _(b'FLAG')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
595 (b't', b'to', [], _(b'email addresses of recipients'), _(b'EMAIL')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
596 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
597 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
598 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
599 @command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
600 b'email', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
601 [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
602 (b'g', b'git', None, _(b'use git extended diff format')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
603 (b'', b'plain', None, _(b'omit hg patch header')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
604 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
605 b'o', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
606 b'outgoing', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
607 None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
608 _(b'send changes not found in the target repository'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
609 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
610 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
611 b'b', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
612 b'bundle', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
613 None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 _(b'send changes not in target as a binary bundle'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
615 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
616 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
617 b'B', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
618 b'bookmark', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
619 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
620 _(b'send changes only reachable by given bookmark'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 _(b'BOOKMARK'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
622 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
623 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
624 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
625 b'bundlename', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
626 b'bundle', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
627 _(b'name of the bundle attachment file'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
628 _(b'NAME'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
629 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
630 (b'r', b'rev', [], _(b'a revision to send'), _(b'REV')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
631 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
632 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
633 b'force', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
634 None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
635 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
636 b'run even when remote repository is unrelated ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
637 b'(with -b/--bundle)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
638 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
639 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
640 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
641 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
642 b'base', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
643 [], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
644 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
645 b'a base changeset to specify instead of a destination ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
646 b'(with -b/--bundle)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
647 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
648 _(b'REV'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
649 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
650 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
651 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
652 b'intro', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
653 None, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
654 _(b'send an introduction email for a single patch'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
655 ), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
656 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
657 + emailopts |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
658 + cmdutil.remoteopts, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
659 _(b'hg email [OPTION]... [DEST]...'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
660 helpcategory=command.CATEGORY_IMPORT_EXPORT, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
661 ) |
27150
88aaddb1af88
patchbomb: rename email function
timeless <timeless@mozdev.org>
parents:
26626
diff
changeset
|
662 def email(ui, repo, *revs, **opts): |
4283
8625504f507c
Slight refining to help text in patchbomb.py
John Goerzen <jgoerzen@complete.org>
parents:
4280
diff
changeset
|
663 '''send changesets by email |
1204
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
664 |
11193
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
11183
diff
changeset
|
665 By default, diffs are sent in the format generated by |
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
11183
diff
changeset
|
666 :hg:`export`, one per message. The series starts with a "[PATCH 0 |
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
11183
diff
changeset
|
667 of N]" 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
|
668 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
669 Each patch email has a Subject line of "[PATCH M of N] ...", using |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
670 the first line of the changeset description as the subject text. |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
671 The message contains two or three parts. First, the changeset |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
672 description. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
673 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
674 With the -d/--diffstat option, if the diffstat program is |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
675 installed, the result of running diffstat on the patch is inserted. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
676 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
677 Finally, the patch itself, as generated by :hg:`export`. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
678 |
17880
9f6044119166
patchbomb: -c is not an alias for the --confirm option
Julian Cowley <julian@lava.net>
parents:
17859
diff
changeset
|
679 With the -d/--diffstat or --confirm options, you will be presented |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
680 with a final summary of all messages and asked for confirmation before |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
681 the messages are sent. |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
682 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
683 By default the patch is included as text in the email body for |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
684 easy reviewing. Using the -a/--attach option will instead create |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
685 an attachment for the patch. With -i/--inline an inline attachment |
16307
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
686 will be created. You can include a patch both as text in the email |
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
687 body and as a regular or an inline attachment by combining the |
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
688 -a/--attach or -i/--inline with the --body option. |
8472
223363bb6d66
patchbomb: describe --attach and --inline options in help
Martin Geisler <mg@lazybytes.net>
parents:
8471
diff
changeset
|
689 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
690 With -B/--bookmark changesets reachable by the given bookmark are |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
691 selected. |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
692 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
693 With -o/--outgoing, emails will be generated for patches not found |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
694 in the destination repository (or only those which are ancestors |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
695 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
|
696 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
697 With -b/--bundle, changesets are selected as for --outgoing, but a |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
698 single email containing a binary Mercurial bundle as an attachment |
26563
d4a1bfe1de63
patchbomb: add a 'bundletype' config under 'patchbomb'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26546
diff
changeset
|
699 will be sent. Use the ``patchbomb.bundletype`` config option to |
d4a1bfe1de63
patchbomb: add a 'bundletype' config under 'patchbomb'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26546
diff
changeset
|
700 control the bundle type as with :hg:`bundle --type`. |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
701 |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
702 With -m/--mbox, instead of previewing each patchbomb message in a |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
703 pager or sending the messages directly, it will create a UNIX |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
704 mailbox file with the patch emails. This mailbox file can be |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
705 previewed with any mail user agent which supports UNIX mbox |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
706 files. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
707 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
708 With -n/--test, all steps will run, but mail will not be sent. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
709 You will be prompted for an email recipient address, a subject and |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
710 an introductory message describing the patches of your patchbomb. |
31489
5b2e1689b24d
patchbomb: use modern pager to display -n/--test result (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
31187
diff
changeset
|
711 Then when all is done, patchbomb messages are displayed. |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
712 |
13198
e71b2aa74ce3
patchbomb: save introductory message in .hg/last-email.txt
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12839
diff
changeset
|
713 In case email sending fails, you will find a backup of your series |
23488
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
714 introductory message in ``.hg/last-email.txt``. |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
715 |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
716 The default behavior of this command can be customized through |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
717 configuration. (See :hg:`help patchbomb` for details) |
13198
e71b2aa74ce3
patchbomb: save introductory message in .hg/last-email.txt
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12839
diff
changeset
|
718 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
719 Examples:: |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
720 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
721 hg email -r 3000 # send patch 3000 only |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
722 hg email -r 3000 -r 3001 # send patches 3000 and 3001 |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
723 hg email -r 3000:3005 # send patches 3000 through 3005 |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
724 hg email 3000 # send patch 3000 (deprecated) |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
725 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
726 hg email -o # send all patches not in default |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
727 hg email -o DEST # send all patches not in DEST |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
728 hg email -o -r 3000 # send all ancestors of 3000 not in default |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
729 hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
730 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
731 hg email -B feature # send all ancestors of feature bookmark |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
732 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
733 hg email -b # send bundle of all patches not in default |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
734 hg email -b DEST # send bundle of all patches not in DEST |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
735 hg email -b -r 3000 # bundle of all ancestors of 3000 not in default |
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
736 hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
737 |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
738 hg email -o -m mbox && # generate an mbox file... |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
739 mutt -R -f mbox # ... and view it with mutt |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
740 hg email -o -m mbox && # generate an mbox file ... |
12839
d85e30889f26
patchbomb: fix stray backslash in docstring
Martin Geisler <mg@lazybytes.net>
parents:
12794
diff
changeset
|
741 formail -s sendmail \\ # ... and use formail to send from the mbox |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
742 -bm -t < mbox # ... using sendmail |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
743 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
744 Before using this command, you will need to enable email in your |
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
745 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
|
746 ''' |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
747 opts = pycompat.byteskwargs(opts) |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
748 |
7115
c5c2d43b01da
patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents:
7095
diff
changeset
|
749 _charsets = mail._charsets(ui) |
c5c2d43b01da
patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents:
7095
diff
changeset
|
750 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
751 bundle = opts.get(b'bundle') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
752 date = opts.get(b'date') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
753 mbox = opts.get(b'mbox') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
754 outgoing = opts.get(b'outgoing') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
755 rev = opts.get(b'rev') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
756 bookmark = opts.get(b'bookmark') |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
757 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
758 if not (opts.get(b'test') or mbox): |
5472
23889160905a
Catch smtp exceptions
Christian Ebert <blacktrash@gmx.net>
parents:
4887
diff
changeset
|
759 # really sending |
4489
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
760 mail.validateconfig(ui) |
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
761 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
762 if not (revs or rev or outgoing or bundle or bookmark): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
763 raise error.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
764 _(b'specify at least one changeset with -B, -r or -o') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
765 ) |
4493
ead2fa544cbf
patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents:
4492
diff
changeset
|
766 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
767 if outgoing and bundle: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
768 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
769 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
770 b"--outgoing mode always on with --bundle;" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
771 b" do not re-specify --outgoing" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
772 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
773 ) |
32695
0841382d114a
patchbomb: avoid -r and -B options at the same time
David Demelier <demelier.david@gmail.com>
parents:
32639
diff
changeset
|
774 if rev and bookmark: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
775 raise error.Abort(_(b"-r and -B are mutually exclusive")) |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4262
diff
changeset
|
776 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
777 if outgoing or bundle: |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
778 if len(revs) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
779 raise error.Abort(_(b"too many destinations")) |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
780 if revs: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
781 dest = revs[0] |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
782 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
783 dest = None |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
784 revs = [] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
785 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
786 if rev: |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
787 if revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
788 raise error.Abort(_(b'use only one form to specify the revision')) |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
789 revs = rev |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
790 elif bookmark: |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
791 if bookmark not in repo._bookmarks: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
792 raise error.Abort(_(b"bookmark '%s' not found") % bookmark) |
38131
46c2b19a1263
scmutil: move repair.stripbmrevset as scmutil.bookmarkrevs (API)
David Demelier <markand@malikania.fr>
parents:
37603
diff
changeset
|
793 revs = scmutil.bookmarkrevs(repo, bookmark) |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
794 |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
795 revs = scmutil.revrange(repo, revs) |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
796 if outgoing: |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
797 revs = _getoutgoing(repo, dest, revs) |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
798 if bundle: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
799 opts[b'revs'] = [b"%d" % r for r in revs] |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
800 |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
801 # check if revision exist on the public destination |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
802 publicurl = repo.ui.config(b'patchbomb', b'publicurl') |
32825
16ff5c6066a6
patchbomb: look for non-empty publicurl, not a non-None one
Augie Fackler <augie@google.com>
parents:
32824
diff
changeset
|
803 if publicurl: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
804 repo.ui.debug(b'checking that revision exist in the public repo\n') |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
805 try: |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
806 publicpeer = hg.peer(repo, {}, publicurl) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
807 except error.RepoError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
808 repo.ui.write_err( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
809 _(b'unable to access public repo: %s\n') % publicurl |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
810 ) |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
811 raise |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
812 if not publicpeer.capable(b'known'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
813 repo.ui.debug(b'skipping existence checks: public repo too old\n') |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
814 else: |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
815 out = [repo[r] for r in revs] |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
816 known = publicpeer.known(h.node() for h in out) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
817 missing = [] |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
818 for idx, h in enumerate(out): |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
819 if not known[idx]: |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
820 missing.append(h) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
821 if missing: |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
39118
diff
changeset
|
822 if len(missing) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
823 msg = _(b'public "%s" is missing %s and %i others') |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
824 msg %= (publicurl, missing[0], len(missing) - 1) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
825 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
826 msg = _(b'public url %s is missing %s') |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
827 msg %= (publicurl, missing[0]) |
36410
67ec4ad815e6
patchbomb: resolve revs before evaluating %ld revset
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36204
diff
changeset
|
828 missingrevs = [ctx.rev() for ctx in missing] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
829 revhint = b' '.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
830 b'-r %s' % h for h in repo.set(b'heads(%ld)', missingrevs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
831 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
832 hint = _(b"use 'hg push %s %s'") % (publicurl, revhint) |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
833 raise error.Abort(msg, hint=hint) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
834 |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
835 # start |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
836 if date: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
837 start_time = dateutil.parsedate(date) |
4566
087b3ae4f08a
patchbomb: add --date option
Bryan O'Sullivan <bos@serpentine.com>
parents:
4565
diff
changeset
|
838 else: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
839 start_time = dateutil.makedate() |
875 | 840 |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
841 def genmsgid(id): |
39117
4899c6d22dff
patchbomb: extract function for generating message-id
Augie Fackler <raf@durin42.com>
parents:
39104
diff
changeset
|
842 return _msgid(id[:20], int(start_time[0])) |
875 | 843 |
25825
577b050caada
patchbomb: mark ancient option deprecated
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
844 # deprecated config: patchbomb.from |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
845 sender = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
846 opts.get(b'from') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
847 or ui.config(b'email', b'from') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
848 or ui.config(b'patchbomb', b'from') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
849 or prompt(ui, b'From', ui.username()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
850 ) |
875 | 851 |
31184
e3ab7c717129
patchbomb: drop internal option for pbranch extension (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31183
diff
changeset
|
852 if bundle: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
853 stropts = pycompat.strkwargs(opts) |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
854 bundledata = _getbundle(repo, dest, **stropts) |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
855 bundleopts = stropts.copy() |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
856 bundleopts.pop(r'bundle', None) # already processed |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
857 msgs = _getbundlemsgs(repo, sender, bundledata, **bundleopts) |
4278
cfe886c14ddf
Add ability to send bundles to patchbomb extension
John Goerzen <jgoerzen@complete.org>
parents:
4262
diff
changeset
|
858 else: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
859 msgs = _getpatchmsgs(repo, sender, revs, **pycompat.strkwargs(opts)) |
875 | 860 |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
861 showaddrs = [] |
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
862 |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
863 def getaddrs(header, ask=False, default=None): |
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
864 configkey = header.lower() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
865 opt = header.replace(b'-', b'_').lower() |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
866 addrs = opts.get(opt) |
11150
f66ca4431eb9
patchbomb: Reply-To support
Cédric Duval <cedricduval@free.fr>
parents:
10973
diff
changeset
|
867 if addrs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
868 showaddrs.append(b'%s: %s' % (header, b', '.join(addrs))) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
869 return mail.addrlistencode(ui, addrs, _charsets, opts.get(b'test')) |
9947
4600e6222efb
patchbomb: fix parsing of multiple addresses, allow multiple addrs in --to/cc/bcc
Marti Raudsepp <marti@juffo.org>
parents:
9818
diff
changeset
|
870 |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
871 # not on the command line: fallback to config and then maybe ask |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
872 addr = ui.config(b'email', configkey) or ui.config( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
873 b'patchbomb', configkey |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
874 ) |
27697
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
875 if not addr: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
876 specified = ui.hasconfig(b'email', configkey) or ui.hasconfig( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
877 b'patchbomb', configkey |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
878 ) |
27697
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
879 if not specified and ask: |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
880 addr = prompt(ui, header, default=default) |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
881 if addr: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
882 showaddrs.append(b'%s: %s' % (header, addr)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
883 return mail.addrlistencode(ui, [addr], _charsets, opts.get(b'test')) |
32826
3abba5bc3454
patchbomb: make getaddrs function easier to work with
Augie Fackler <augie@google.com>
parents:
32825
diff
changeset
|
884 elif default: |
3abba5bc3454
patchbomb: make getaddrs function easier to work with
Augie Fackler <augie@google.com>
parents:
32825
diff
changeset
|
885 return mail.addrlistencode( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
886 ui, [default], _charsets, opts.get(b'test') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
887 ) |
32826
3abba5bc3454
patchbomb: make getaddrs function easier to work with
Augie Fackler <augie@google.com>
parents:
32825
diff
changeset
|
888 return [] |
9947
4600e6222efb
patchbomb: fix parsing of multiple addresses, allow multiple addrs in --to/cc/bcc
Marti Raudsepp <marti@juffo.org>
parents:
9818
diff
changeset
|
889 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
890 to = getaddrs(b'To', ask=True) |
15164
7bddec632821
patchbomb: make it easy for the user to decline sending an intro message.
Greg Ward <greg@gerg.ca>
parents:
15162
diff
changeset
|
891 if not to: |
7bddec632821
patchbomb: make it easy for the user to decline sending an intro message.
Greg Ward <greg@gerg.ca>
parents:
15162
diff
changeset
|
892 # we can get here in non-interactive mode |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
893 raise error.Abort(_(b'no recipient addresses provided')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
894 cc = getaddrs(b'Cc', ask=True, default=b'') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
895 bcc = getaddrs(b'Bcc') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
896 replyto = getaddrs(b'Reply-To') |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
897 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
898 confirm = ui.configbool(b'patchbomb', b'confirm') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
899 confirm |= bool(opts.get(b'diffstat') or opts.get(b'confirm')) |
23488
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
900 |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
901 if confirm: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
902 ui.write(_(b'\nFinal summary:\n\n'), label=b'patchbomb.finalsummary') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
903 ui.write((b'From: %s\n' % sender), label=b'patchbomb.from') |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
904 for addr in showaddrs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
905 ui.write(b'%s\n' % addr, label=b'patchbomb.to') |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
906 for m, subj, ds in msgs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
907 ui.write((b'Subject: %s\n' % subj), label=b'patchbomb.subject') |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
908 if ds: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
909 ui.write(ds, label=b'patchbomb.diffstats') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
910 ui.write(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
911 if ui.promptchoice( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
912 _(b'are you sure you want to send (yn)?$$ &Yes $$ &No') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
913 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
914 raise error.Abort(_(b'patchbomb canceled')) |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
915 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
916 ui.write(b'\n') |
875 | 917 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
918 parent = opts.get(b'in_reply_to') or None |
8826
2aff285b902f
patchbomb: do not assume the presence of angle brackets around msg-id
Cédric Duval <cedricduval@free.fr>
parents:
8761
diff
changeset
|
919 # angle brackets may be omitted, they're not semantically part of the msg-id |
2aff285b902f
patchbomb: do not assume the presence of angle brackets around msg-id
Cédric Duval <cedricduval@free.fr>
parents:
8761
diff
changeset
|
920 if parent is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
921 if not parent.startswith(b'<'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
922 parent = b'<' + parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
923 if not parent.endswith(b'>'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
924 parent += b'>' |
8826
2aff285b902f
patchbomb: do not assume the presence of angle brackets around msg-id
Cédric Duval <cedricduval@free.fr>
parents:
8761
diff
changeset
|
925 |
36450
d478c8cd89d1
py3: convert bytes to str using encoding.strfromlocal
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36449
diff
changeset
|
926 sender_addr = eutil.parseaddr(encoding.strfromlocal(sender))[1] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
927 sender = mail.addressencode(ui, sender, _charsets, opts.get(b'test')) |
5973
ea77f6f77514
patchbomb: undo backout and fix bugs in the earlier patch
Matt Mackall <mpm@selenic.com>
parents:
5948
diff
changeset
|
928 sendmail = None |
21726
fae032549ca2
patchbomb: always use message-id of first patch for series-id
Augie Fackler <raf@durin42.com>
parents:
21724
diff
changeset
|
929 firstpatch = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
930 progress = ui.makeprogress( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
931 _(b'sending'), unit=_(b'emails'), total=len(msgs) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
932 ) |
12265
1ed2dc9d4368
patchbomb: show progress when sending emails or writing mbox
Yuya Nishihara <yuya@tcha.org>
parents:
12264
diff
changeset
|
933 for i, (m, subj, ds) in enumerate(msgs): |
875 | 934 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
935 m[b'Message-Id'] = genmsgid(m[b'X-Mercurial-Node']) |
21726
fae032549ca2
patchbomb: always use message-id of first patch for series-id
Augie Fackler <raf@durin42.com>
parents:
21724
diff
changeset
|
936 if not firstpatch: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
937 firstpatch = m[b'Message-Id'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
938 m[b'X-Mercurial-Series-Id'] = firstpatch |
875 | 939 except TypeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
940 m[b'Message-Id'] = genmsgid(b'patchbomb') |
875 | 941 if parent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
942 m[b'In-Reply-To'] = parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
943 m[b'References'] = parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
944 if not parent or b'X-Mercurial-Node' not in m: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
945 parent = m[b'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
|
946 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
947 m[b'User-Agent'] = b'Mercurial-patchbomb/%s' % util.version() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
948 m[b'Date'] = eutil.formatdate(start_time[0], localtime=True) |
2443
bd9c39e8f38b
patchbomb does not handle email time stamp plattform independent
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2292
diff
changeset
|
949 |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3473
diff
changeset
|
950 start_time = (start_time[0] + 1, start_time[1]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
951 m[b'From'] = sender |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
952 m[b'To'] = b', '.join(to) |
5785
38cd1ce8650d
patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents:
5758
diff
changeset
|
953 if cc: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
954 m[b'Cc'] = b', '.join(cc) |
5785
38cd1ce8650d
patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents:
5758
diff
changeset
|
955 if bcc: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
956 m[b'Bcc'] = b', '.join(bcc) |
11150
f66ca4431eb9
patchbomb: Reply-To support
Cédric Duval <cedricduval@free.fr>
parents:
10973
diff
changeset
|
957 if replyto: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
958 m[b'Reply-To'] = b', '.join(replyto) |
38776
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
959 # Fix up all headers to be native strings. |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
960 # TODO(durin42): this should probably be cleaned up above in the future. |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
961 if pycompat.ispy3: |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
962 for hdr, val in list(m.items()): |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
963 change = False |
38776
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
964 if isinstance(hdr, bytes): |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
965 del m[hdr] |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
966 hdr = pycompat.strurl(hdr) |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
967 change = True |
38776
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
968 if isinstance(val, bytes): |
65ed2fcb9032
patchbomb: ensure all headers and values given to email mod are native strings
Augie Fackler <augie@google.com>
parents:
38472
diff
changeset
|
969 val = pycompat.strurl(val) |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
970 if not change: |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
971 # prevent duplicate headers |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
972 del m[hdr] |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
973 change = True |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
974 if change: |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
975 m[hdr] = val |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
976 if opts.get(b'test'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
977 ui.status(_(b'displaying '), subj, b' ...\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
978 ui.pager(b'email') |
39104
2e578eced958
patchbomb: really use BytesGenerator API
Yuya Nishihara <yuya@tcha.org>
parents:
39038
diff
changeset
|
979 generator = _bytesgenerator(ui, mangle_from_=False) |
1871
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
980 try: |
6447
9d2ce19bdacd
patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6229
diff
changeset
|
981 generator.flatten(m, 0) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
982 ui.write(b'\n') |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25202
diff
changeset
|
983 except IOError as inst: |
1871
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
984 if inst.errno != errno.EPIPE: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
985 raise |
15560
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
986 else: |
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
987 if not sendmail: |
29285
63a3749147af
mail: unsupport smtp.verifycert (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29205
diff
changeset
|
988 sendmail = mail.connect(ui, mbox=mbox) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
989 ui.status(_(b'sending '), subj, b' ...\n') |
38403
8ce3f91d5f6f
patchbomb: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38402
diff
changeset
|
990 progress.update(i, item=subj) |
15560
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
991 if not mbox: |
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
992 # Exim does not remove the Bcc field |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
993 del m[b'Bcc'] |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28474
diff
changeset
|
994 fp = stringio() |
39104
2e578eced958
patchbomb: really use BytesGenerator API
Yuya Nishihara <yuya@tcha.org>
parents:
39038
diff
changeset
|
995 generator = _bytesgenerator(fp, mangle_from_=False) |
6447
9d2ce19bdacd
patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6229
diff
changeset
|
996 generator.flatten(m, 0) |
39027
8919cc4f63b4
patchbomb: python 3 really wants those email addresses in unicode
Augie Fackler <augie@google.com>
parents:
39022
diff
changeset
|
997 alldests = to + bcc + cc |
8919cc4f63b4
patchbomb: python 3 really wants those email addresses in unicode
Augie Fackler <augie@google.com>
parents:
39022
diff
changeset
|
998 alldests = [encoding.strfromlocal(d) for d in alldests] |
8919cc4f63b4
patchbomb: python 3 really wants those email addresses in unicode
Augie Fackler <augie@google.com>
parents:
39022
diff
changeset
|
999 sendmail(sender_addr, alldests, fp.getvalue()) |
875 | 1000 |
38403
8ce3f91d5f6f
patchbomb: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38402
diff
changeset
|
1001 progress.complete() |