Mercurial > hg
annotate hgext/patchbomb.py @ 43444:c470e699cd00
repoview: move changelog.__contains__() override to filteredchangelog
Differential Revision: https://phab.mercurial-scm.org/D7238
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 05 Nov 2019 14:11:30 -0800 |
parents | 1a0d419ec763 |
children | 9f70512ae2cf |
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 |
38472
d17d1ee1d602
patchbomb: use email.mime.base instead of email.MIMEBase
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38471
diff
changeset
|
77 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
|
78 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
|
79 import email.utils as eutil |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
80 import errno |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
81 import os |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
82 import socket |
19810
c80feeb715d1
python2.4: fix imports of sub-packages of the email package
Augie Fackler <raf@durin42.com>
parents:
19791
diff
changeset
|
83 |
29205
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
28981
diff
changeset
|
84 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
|
85 from mercurial.pycompat import open |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
86 from mercurial import ( |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
87 cmdutil, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
88 commands, |
36449
a918c996a881
py3: use encoding.strtolocal() to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36448
diff
changeset
|
89 encoding, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
90 error, |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
91 formatter, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
92 hg, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
93 mail, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
94 node as nodemod, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
95 patch, |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
96 pycompat, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31490
diff
changeset
|
97 registrar, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
98 scmutil, |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
99 templater, |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
100 util, |
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
101 ) |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
102 from mercurial.utils import dateutil |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
103 |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28474
diff
changeset
|
104 stringio = util.stringio |
875 | 105 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
106 cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31490
diff
changeset
|
107 command = registrar.command(cmdtable) |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
108 |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
109 configtable = {} |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
110 configitem = registrar.configitem(configtable) |
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
111 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
112 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
113 b'patchbomb', b'bundletype', default=None, |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
114 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
115 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 b'patchbomb', b'bcc', default=None, |
34760
3819809198c6
configitems: register the 'patchbomb.bcc' config
Boris Feld <boris.feld@octobus.net>
parents:
34116
diff
changeset
|
117 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
118 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
119 b'patchbomb', b'cc', default=None, |
34761
cb1ea7ef773d
configitems: register the 'patchbomb.cc' config
Boris Feld <boris.feld@octobus.net>
parents:
34760
diff
changeset
|
120 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
121 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
122 b'patchbomb', b'confirm', default=False, |
34112
4ec0029b76e8
configitems: register the 'patchbomb.confirm' config
Boris Feld <boris.feld@octobus.net>
parents:
34111
diff
changeset
|
123 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
124 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
125 b'patchbomb', b'flagtemplate', default=None, |
34113
a6fa5af781a4
configitems: register the 'patchbomb.flagtemplate' config
Boris Feld <boris.feld@octobus.net>
parents:
34112
diff
changeset
|
126 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
127 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
128 b'patchbomb', b'from', default=None, |
34114
7e2adac3dd60
configitems: register the 'patchbomb.from' config
Boris Feld <boris.feld@octobus.net>
parents:
34113
diff
changeset
|
129 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
130 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
131 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
|
132 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
133 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
134 b'patchbomb', b'publicurl', default=None, |
34116
aeb956e7729f
configitems: register the 'patchbomb.publicurl' config
Boris Feld <boris.feld@octobus.net>
parents:
34115
diff
changeset
|
135 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
136 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
137 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
|
138 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
139 configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
140 b'patchbomb', b'to', default=None, |
34911
645b6684cf5b
configitems: register 'email.to' and 'patchbomb.to'
Yuya Nishihara <yuya@tcha.org>
parents:
34762
diff
changeset
|
141 ) |
34111
798b679680aa
configitems: register the 'patchbomb.bundletype' config
Boris Feld <boris.feld@octobus.net>
parents:
34029
diff
changeset
|
142 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29285
diff
changeset
|
143 # 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
|
144 # 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
|
145 # 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
|
146 # leave the attribute unspecified. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 testedwith = b'ships-with-hg-core' |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
148 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
149 |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
150 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
|
151 """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
|
152 """ |
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
153 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
|
154 # 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
|
155 # 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
|
156 # destination before patchbombing anything. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
157 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
|
158 if publicurl: |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
159 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
|
160 publicurl, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
161 publicurl, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
162 ctx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
163 ) |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
164 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
|
165 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
166 |
26546
500386e65759
patchbomb: add experimental config of a "pullurl" and export it
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25826
diff
changeset
|
167 def uisetup(ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 cmdutil.extraexport.append(b'pullurl') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 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
|
170 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
171 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
32826
diff
changeset
|
172 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
|
173 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
|
174 return |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 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
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
177 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
178 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
|
179 if default: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
180 prompt += b' [%s]' % default |
15166
9ec9dd8d1b24
patchbomb: drop loop in prompt
Matt Mackall <mpm@selenic.com>
parents:
15165
diff
changeset
|
181 return ui.prompt(prompt + rest, default) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
182 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
183 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
184 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
|
185 '''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
|
186 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
|
187 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
|
188 intro = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
189 elif introconfig == b'always': |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
190 intro = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
191 elif introconfig == b'never': |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
192 intro = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 elif introconfig == b'auto': |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
39118
diff
changeset
|
194 intro = number > 1 |
23487
c14af817ab76
patchbomb: add a 'patchbomb.intro' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23486
diff
changeset
|
195 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
196 ui.write_err( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
197 _(b'warning: invalid patchbomb.intro value "%s"\n') % introconfig |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
198 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 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
|
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 return intro |
10734
7a0502a6f9a1
patchbomb: --desc implies --intro
Cédric Duval <cedricduval@free.fr>
parents:
10611
diff
changeset
|
202 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
203 |
31187
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
204 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
|
205 """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
|
206 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
|
207 if not tmpl: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
208 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
|
209 out = util.stringio() |
43099
f1c5358f0d65
formatter: pass in template spec to templateformatter as argument
Yuya Nishihara <yuya@tcha.org>
parents:
43085
diff
changeset
|
210 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
|
211 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
|
212 fm.startitem() |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
213 fm.context(ctx=repo[rev]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
214 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
|
215 return out.getvalue() |
6b8e1a08ef1d
patchbomb: add config knob to generate flags by template (issue5354)
Yuya Nishihara <yuya@tcha.org>
parents:
31186
diff
changeset
|
216 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
217 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
218 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
|
219 """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
|
220 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
|
221 if flag: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
222 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
|
223 |
8018b90f8307
patchbomb: factor out function that builds a prefix string to patch subject
Yuya Nishihara <yuya@tcha.org>
parents:
30848
diff
changeset
|
224 if not numbered: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
225 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
|
226 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
227 tlen = len(b"%d" % total) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
228 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
|
229 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
230 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
231 def makepatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
232 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
233 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
234 rev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
235 patchlines, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
236 opts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
237 _charsets, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
238 idx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
239 total, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
240 numbered, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
241 patchname=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
242 ): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
243 |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
244 desc = [] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
245 node = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
246 body = b'' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
247 |
12199
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
248 for line in patchlines: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
249 if line.startswith(b'#'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
250 if line.startswith(b'# Node ID'): |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
251 node = line.split()[-1] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
252 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
253 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
|
254 break |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
255 desc.append(line) |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
256 |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
257 if not patchname and not node: |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
258 raise ValueError |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
259 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
260 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
|
261 body = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
262 b'\n'.join(desc[1:]).strip() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
263 or b'Patch subject is complete summary.' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
264 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
265 body += b'\n\n\n' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
266 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
267 if opts.get(b'plain'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
268 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
|
269 patchlines.pop(0) |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
270 if patchlines: |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
271 patchlines.pop(0) |
17d604e522b4
patchbomb: rename argument to avoid shadowing patch module
Martin Geisler <mg@lazybytes.net>
parents:
12197
diff
changeset
|
272 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
|
273 patchlines.pop(0) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
274 |
30407
e1677cc29da6
patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents:
29841
diff
changeset
|
275 ds = patch.diffstat(patchlines) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
276 if opts.get(b'diffstat'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
277 body += ds + b'\n\n' |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
278 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
279 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
|
280 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
|
281 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
|
282 |
17a9a1f5cee2
patchbomb: add --body flag to send patches as inline message body text
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16233
diff
changeset
|
283 if addattachment: |
38471
91228d9ae7c8
patchbomb: use email.mime.multipart instead of email.MIMEMultipart
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38403
diff
changeset
|
284 msg = emimemultipart.MIMEMultipart() |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
285 if body: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
286 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
|
287 p = mail.mimetextpatch( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
288 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
|
289 ) |
28415
21524ae331b7
patchbomb: use absolute_import
timeless <timeless@mozdev.org>
parents:
27767
diff
changeset
|
290 binnode = nodemod.bin(node) |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8520
diff
changeset
|
291 # 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
|
292 if not patchname: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
293 patchtags = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
294 t |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
295 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
|
296 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
|
297 ] |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
298 if patchtags: |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
299 patchname = patchtags[0] |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
300 elif total > 1: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
301 patchname = cmdutil.makefilename( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
302 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
|
303 ) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
304 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
305 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
|
306 disposition = r'inline' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
307 if opts.get(b'attach'): |
39038
2161faf0d24b
patchbomb: use native strings when determining attachment disposition
Augie Fackler <augie@google.com>
parents:
39035
diff
changeset
|
308 disposition = r'attachment' |
2161faf0d24b
patchbomb: use native strings when determining attachment disposition
Augie Fackler <augie@google.com>
parents:
39035
diff
changeset
|
309 p[r'Content-Disposition'] = ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
310 disposition + r'; filename=' + encoding.strfromlocal(patchname) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
311 ) |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
312 msg.attach(p) |
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
313 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
314 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
|
315 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
316 prefix = _formatprefix( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
317 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
|
318 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
319 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
|
320 if not numbered: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
321 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
|
322 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 subj = b' '.join([prefix, subj]) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
324 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
|
325 msg[b'X-Mercurial-Node'] = node |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
326 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
|
327 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
|
328 return msg, subj, ds |
7354
cad454f295b0
patchbomb: extract a bunch of nested functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7353
diff
changeset
|
329 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
330 |
23210
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
331 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
|
332 """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
|
333 |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
334 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
|
335 """ |
79f7444520bf
patchbomb: extract 'getpatches' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23173
diff
changeset
|
336 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
337 prev = repo[b'.'].rev() |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
338 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
|
339 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
|
340 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
|
341 output = stringio() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
342 cmdutil.exportfile( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
343 repo, [r], output, opts=patch.difffeatureopts(ui, opts, git=True) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
344 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
345 yield output.getvalue().split(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
346 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
347 |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
348 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
|
349 """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
|
350 |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
351 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
|
352 `bundle` command. |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
353 |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
354 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
|
355 """ |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
356 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
357 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
|
358 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
|
359 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
|
360 if btype: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
361 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
|
362 try: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
363 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
|
364 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
|
365 finally: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
366 try: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
367 os.unlink(tmpfn) |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
368 except OSError: |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
369 pass |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
370 os.rmdir(tmpdir) |
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
371 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
372 |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
373 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
|
374 """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
|
375 |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
376 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
|
377 |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
378 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
|
379 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
|
380 """ |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
381 ui = repo.ui |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
382 if opts.get(r'desc'): |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
383 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
|
384 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
385 ui.write( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43099
diff
changeset
|
386 _(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
|
387 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
388 body = ui.edit( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
389 defaultbody, sender, repopath=repo.path, action=b'patchbombbody' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
390 ) |
23212
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
391 # 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
|
392 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
|
393 msgfile.write(body) |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
394 msgfile.close() |
4b4eae00f9dd
patchbomb: extract 'getdescription' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23211
diff
changeset
|
395 return body |
23211
6993282e5362
patchbomb: extract 'getbundle' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23210
diff
changeset
|
396 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
397 |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
398 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
|
399 """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
|
400 |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
401 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
|
402 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
|
403 """ |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
404 ui = repo.ui |
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
405 _charsets = mail._charsets(ui) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
406 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
|
407 ui, b'Subject:', b'A bundle for your repository' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
408 ) |
23213
23a78662b6dd
patchbomb: extract 'getbundlemsgs' closure in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23212
diff
changeset
|
409 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
410 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
|
411 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
|
412 if body: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
413 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
|
414 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
|
415 datapart.set_payload(bundle) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
416 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
|
417 datapart.add_header( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
418 r'Content-Disposition', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
419 r'attachment', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
420 filename=encoding.strfromlocal(bundlename), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
421 ) |
39032
8979626089bb
patchbomb: use email.encoders instead of email.Encoders
Augie Fackler <augie@google.com>
parents:
39027
diff
changeset
|
422 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
|
423 msg.attach(datapart) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
424 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
|
425 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
|
426 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
427 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
428 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
|
429 """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
|
430 |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
431 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
|
432 ui = repo.ui |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
433 _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
|
434 |
31186
83fa357edbd5
patchbomb: pass around ui and revs that are needed for flag template
Yuya Nishihara <yuya@tcha.org>
parents:
31185
diff
changeset
|
435 # 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
|
436 prefix = _formatprefix( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
437 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
|
438 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
439 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
|
440 ui, b'(optional) Subject: ', rest=prefix, default=b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
441 ) |
23214
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
442 if not subj: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
443 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
|
444 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
445 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
|
446 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
447 body = b'' |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
448 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
|
449 # 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
|
450 diffstat = patch.diffstat(sum(patches, [])) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
451 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
|
452 else: |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
453 diffstat = None |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
454 |
563d33fc4b3d
patchbomb: extract 'makeintro' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23213
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 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
|
459 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
460 |
31185
bbb5d2aa0bf0
patchbomb: build patch texts by _getpatchmsgs()
Yuya Nishihara <yuya@tcha.org>
parents:
31184
diff
changeset
|
461 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
|
462 """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
|
463 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
464 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
|
465 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
466 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
|
467 """ |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
468 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
|
469 ui = repo.ui |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
470 _charsets = mail._charsets(ui) |
31185
bbb5d2aa0bf0
patchbomb: build patch texts by _getpatchmsgs()
Yuya Nishihara <yuya@tcha.org>
parents:
31184
diff
changeset
|
471 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
|
472 msgs = [] |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
473 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
474 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
|
475 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
476 # 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
|
477 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
|
478 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
|
479 if msg: |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
480 msgs.append(msg) |
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 # 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
|
483 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
|
484 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
485 # 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
|
486 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
|
487 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
|
488 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
|
489 if patchnames: |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
490 name = patchnames[i] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
491 msg = makepatch( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
492 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
493 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
494 r, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
495 p, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
496 bytesopts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
497 _charsets, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
498 i + 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
499 len(patches), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
500 numbered, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
501 name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
502 ) |
23215
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
503 msgs.append(msg) |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
504 |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
505 return msgs |
83a191031f94
patchbomb: extract 'getpatchmsgs' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23214
diff
changeset
|
506 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
507 |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
508 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
|
509 '''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
|
510 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
511 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
|
512 url = hg.parseurl(url)[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
513 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
|
514 |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
515 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
|
516 if not revs: |
35674
e711906aa42c
patchbomb: use 'tiprev' when appropriate
Boris Feld <boris.feld@octobus.net>
parents:
35466
diff
changeset
|
517 revs = [repo.changelog.tiprev()] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
518 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
|
519 if not revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
520 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
|
521 return revs |
23486
1de214837f5e
patchbomb: extract 'getoutgoing' closure into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23450
diff
changeset
|
522 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
523 |
39117
4899c6d22dff
patchbomb: extract function for generating message-id
Augie Fackler <raf@durin42.com>
parents:
39104
diff
changeset
|
524 def _msgid(node, timestamp): |
39118
1415b78869eb
patchbomb: allow using HGHOSTNAME to force a hostname
Augie Fackler <raf@durin42.com>
parents:
39117
diff
changeset
|
525 hostname = encoding.strtolocal(socket.getfqdn()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
526 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
|
527 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
|
528 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
529 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
530 emailopts = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
531 (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
|
532 (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
|
533 (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
|
534 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
535 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
536 b'bcc', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
537 [], |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
538 _(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
|
539 _(b'EMAIL'), |
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'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
|
542 (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
|
543 (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
|
544 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
545 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
546 b'date', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
547 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
548 _(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
|
549 _(b'DATE'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
550 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
551 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
552 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
553 b'desc', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
554 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
555 _(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
|
556 _(b'FILE'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
557 ), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
558 (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
|
559 (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
|
560 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
561 b'm', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
562 b'mbox', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
563 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
564 _(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
|
565 _(b'FILE'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
566 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
567 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
568 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 b'reply-to', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
570 [], |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
571 _(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
|
572 _(b'EMAIL'), |
43076
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 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
575 b's', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
576 b'subject', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
577 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
578 _(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
|
579 _(b'TEXT'), |
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 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
582 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
583 b'in-reply-to', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
584 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
585 _(b'message identifier to reply to'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
586 _(b'MSGID'), |
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'', 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
|
589 (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
|
590 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
591 |
14309
37e80214badf
patchbomb: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14290
diff
changeset
|
592 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
593 @command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
594 b'email', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
595 [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
596 (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
|
597 (b'', b'plain', None, _(b'omit hg patch header')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
598 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
599 b'o', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
600 b'outgoing', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
601 None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
602 _(b'send changes not found in the target repository'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
603 ), |
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'b', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
606 b'bundle', |
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 in target as a binary bundle'), |
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'bookmark', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
613 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 _(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
|
615 _(b'BOOKMARK'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
616 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
617 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
618 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
619 b'bundlename', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
620 b'bundle', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 _(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
|
622 _(b'NAME'), |
43076
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'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
|
625 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
626 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
627 b'force', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
628 None, |
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'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
|
631 b'(with -b/--bundle)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
632 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
633 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
634 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
635 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
636 b'base', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
637 [], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
638 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
639 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
|
640 b'(with -b/--bundle)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
641 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
642 _(b'REV'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
643 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
644 ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
645 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
646 b'intro', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
647 None, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
648 _(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
|
649 ), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
650 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
651 + emailopts |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
652 + cmdutil.remoteopts, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
653 _(b'hg email [OPTION]... [DEST]...'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
654 helpcategory=command.CATEGORY_IMPORT_EXPORT, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
655 ) |
27150
88aaddb1af88
patchbomb: rename email function
timeless <timeless@mozdev.org>
parents:
26626
diff
changeset
|
656 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
|
657 '''send changesets by email |
1204
b0f6053df539
patchbomb: continue if we can't import readline.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1154
diff
changeset
|
658 |
11193
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
11183
diff
changeset
|
659 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
|
660 :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
|
661 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
|
662 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
663 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
|
664 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
|
665 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
|
666 description. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
667 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
668 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
|
669 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
|
670 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
671 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
|
672 |
17880
9f6044119166
patchbomb: -c is not an alias for the --confirm option
Julian Cowley <julian@lava.net>
parents:
17859
diff
changeset
|
673 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
|
674 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
|
675 the messages are sent. |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
676 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
677 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
|
678 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
|
679 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
|
680 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
|
681 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
|
682 -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
|
683 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
684 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
|
685 selected. |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
686 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
687 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
|
688 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
|
689 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
|
690 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
691 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
|
692 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
|
693 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
|
694 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
|
695 |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
696 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
|
697 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
|
698 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
|
699 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
|
700 files. |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
701 |
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
702 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
|
703 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
|
704 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
|
705 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
|
706 |
13198
e71b2aa74ce3
patchbomb: save introductory message in .hg/last-email.txt
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12839
diff
changeset
|
707 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
|
708 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
|
709 |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
710 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
|
711 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
|
712 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
713 Examples:: |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
714 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
715 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
|
716 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
|
717 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
|
718 hg email 3000 # send patch 3000 (deprecated) |
4280
a9336520a4ee
Improve documentation for patchbomb and email
John Goerzen <jgoerzen@complete.org>
parents:
4279
diff
changeset
|
719 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
720 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
|
721 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
|
722 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
|
723 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
|
724 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
725 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
|
726 |
9289
45aaf27f95b8
patchbomb: reST syntax for literal blocks in help text
Christian Ebert <blacktrash@gmx.net>
parents:
9286
diff
changeset
|
727 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
|
728 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
|
729 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
|
730 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
|
731 |
12749
338b4b615d33
patchbomb: move command option help from the extension (patchbomb) to the command (email)
timeless <timeless@gmail.com>
parents:
12265
diff
changeset
|
732 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
|
733 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
|
734 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
|
735 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
|
736 -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
|
737 |
9269
1d6499adf211
patchbomb: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9214
diff
changeset
|
738 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
|
739 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
|
740 ''' |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
741 opts = pycompat.byteskwargs(opts) |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
742 |
7115
c5c2d43b01da
patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents:
7095
diff
changeset
|
743 _charsets = mail._charsets(ui) |
c5c2d43b01da
patchbomb: mime-encode headers and parts not containing patches
Christian Ebert <blacktrash@gmx.net>
parents:
7095
diff
changeset
|
744 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
745 bundle = opts.get(b'bundle') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
746 date = opts.get(b'date') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
747 mbox = opts.get(b'mbox') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
748 outgoing = opts.get(b'outgoing') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
749 rev = opts.get(b'rev') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
750 bookmark = opts.get(b'bookmark') |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
751 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
752 if not (opts.get(b'test') or mbox): |
5472
23889160905a
Catch smtp exceptions
Christian Ebert <blacktrash@gmx.net>
parents:
4887
diff
changeset
|
753 # really sending |
4489
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
754 mail.validateconfig(ui) |
a11e13d50645
patchbomb: Validate email config before we start prompting for info.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4486
diff
changeset
|
755 |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
756 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
|
757 raise error.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
758 _(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
|
759 ) |
4493
ead2fa544cbf
patchbomb: Fail early if no revs given to email
Bryan O'Sullivan <bos@serpentine.com>
parents:
4492
diff
changeset
|
760 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
761 if outgoing and bundle: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
762 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
763 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
764 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
|
765 b" do not re-specify --outgoing" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
766 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
767 ) |
32695
0841382d114a
patchbomb: avoid -r and -B options at the same time
David Demelier <demelier.david@gmail.com>
parents:
32639
diff
changeset
|
768 if rev and bookmark: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
769 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
|
770 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
771 if outgoing or bundle: |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
772 if len(revs) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
773 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
|
774 if revs: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
775 dest = revs[0] |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
776 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
23877
diff
changeset
|
777 dest = None |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
778 revs = [] |
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
779 |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
780 if rev: |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
781 if revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
782 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
|
783 revs = rev |
32639
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
784 elif bookmark: |
c2fe2b00db53
patchbomb: add -B option to select a bookmark
David Demelier <demelier.david@gmail.com>
parents:
32375
diff
changeset
|
785 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
|
786 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
|
787 revs = scmutil.bookmarkrevs(repo, bookmark) |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
788 |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
789 revs = scmutil.revrange(repo, revs) |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
790 if outgoing: |
24568
2e5f6cdf01f6
patchbomb: factor out scmutil.revrange() calls
Yuya Nishihara <yuya@tcha.org>
parents:
24567
diff
changeset
|
791 revs = _getoutgoing(repo, dest, revs) |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
792 if bundle: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
793 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
|
794 |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
795 # 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
|
796 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
|
797 if publicurl: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
798 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
|
799 try: |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
800 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
|
801 except error.RepoError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
802 repo.ui.write_err( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
803 _(b'unable to access public repo: %s\n') % publicurl |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
804 ) |
26626
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
805 raise |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
806 if not publicpeer.capable(b'known'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
807 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
|
808 else: |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
809 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
|
810 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
|
811 missing = [] |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
812 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
|
813 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
|
814 missing.append(h) |
dca161728dc9
patchbomb: check that targets exist at the publicurl
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
815 if missing: |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
39118
diff
changeset
|
816 if len(missing) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
817 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
|
818 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
|
819 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
820 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
|
821 msg %= (publicurl, missing[0]) |
36410
67ec4ad815e6
patchbomb: resolve revs before evaluating %ld revset
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36204
diff
changeset
|
822 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
|
823 revhint = b' '.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
824 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
|
825 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
826 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
|
827 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
|
828 |
4262
f51317e24114
Add --outgoing option to patchbomb
Brendan Cully <brendan@kublai.com>
parents:
4144
diff
changeset
|
829 # start |
11413
4c1fe996838c
patchbomb: reduce number of opts.get calls
Christian Ebert <blacktrash@gmx.net>
parents:
11321
diff
changeset
|
830 if date: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
831 start_time = dateutil.parsedate(date) |
4566
087b3ae4f08a
patchbomb: add --date option
Bryan O'Sullivan <bos@serpentine.com>
parents:
4565
diff
changeset
|
832 else: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36450
diff
changeset
|
833 start_time = dateutil.makedate() |
875 | 834 |
876
14cfaaec2e8e
Get patchbomb script to not use MIME attachments.
Bryan O'Sullivan <bos@serpentine.com>
parents:
875
diff
changeset
|
835 def genmsgid(id): |
39117
4899c6d22dff
patchbomb: extract function for generating message-id
Augie Fackler <raf@durin42.com>
parents:
39104
diff
changeset
|
836 return _msgid(id[:20], int(start_time[0])) |
875 | 837 |
25825
577b050caada
patchbomb: mark ancient option deprecated
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
838 # deprecated config: patchbomb.from |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
839 sender = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
840 opts.get(b'from') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
841 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
|
842 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
|
843 or prompt(ui, b'From', ui.username()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
844 ) |
875 | 845 |
31184
e3ab7c717129
patchbomb: drop internal option for pbranch extension (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31183
diff
changeset
|
846 if bundle: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
847 stropts = pycompat.strkwargs(opts) |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
848 bundledata = _getbundle(repo, dest, **stropts) |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
849 bundleopts = stropts.copy() |
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
850 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
|
851 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
|
852 else: |
35044
71e63fe6b1ab
py3: handle keyword arguments correctly in hgext/patchbomb.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34911
diff
changeset
|
853 msgs = _getpatchmsgs(repo, sender, revs, **pycompat.strkwargs(opts)) |
875 | 854 |
12200
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
855 showaddrs = [] |
aebb39d45500
patchbomb: let diffstat prompt only once with complete summary
Christian Ebert <blacktrash@gmx.net>
parents:
12199
diff
changeset
|
856 |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
857 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
|
858 configkey = header.lower() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
859 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
|
860 addrs = opts.get(opt) |
11150
f66ca4431eb9
patchbomb: Reply-To support
Cédric Duval <cedricduval@free.fr>
parents:
10973
diff
changeset
|
861 if addrs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
862 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
|
863 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
|
864 |
15162
d67a15b2e608
patchbomb: simplify some contorted logic and odd variable names.
Greg Ward <greg@gerg.ca>
parents:
14556
diff
changeset
|
865 # 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
|
866 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
|
867 b'patchbomb', configkey |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
868 ) |
27697
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
869 if not addr: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
870 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
|
871 b'patchbomb', configkey |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
872 ) |
27697
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
873 if not specified and ask: |
0ce0cfee497f
patchbomb: treat empty address list as no addresses
Bryan O'Sullivan <bos@serpentine.com>
parents:
27150
diff
changeset
|
874 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
|
875 if addr: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
876 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
|
877 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
|
878 elif default: |
3abba5bc3454
patchbomb: make getaddrs function easier to work with
Augie Fackler <augie@google.com>
parents:
32825
diff
changeset
|
879 return mail.addrlistencode( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
880 ui, [default], _charsets, opts.get(b'test') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
881 ) |
32826
3abba5bc3454
patchbomb: make getaddrs function easier to work with
Augie Fackler <augie@google.com>
parents:
32825
diff
changeset
|
882 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
|
883 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
884 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
|
885 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
|
886 # 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
|
887 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
|
888 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
|
889 bcc = getaddrs(b'Bcc') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
890 replyto = getaddrs(b'Reply-To') |
2679
f1de91be1d87
optionally send blind carbon copies
Christian Ebert <blacktrash@gmx.net>
parents:
2443
diff
changeset
|
891 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
892 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
|
893 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
|
894 |
11b215731e74
patchbomb: introduce a 'patchbomb.confirm' option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23487
diff
changeset
|
895 if confirm: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
896 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
|
897 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
|
898 for addr in showaddrs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
899 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
|
900 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
|
901 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
|
902 if ds: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
903 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
|
904 ui.write(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40346
diff
changeset
|
905 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
|
906 _(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
|
907 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
908 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
|
909 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
910 ui.write(b'\n') |
875 | 911 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
912 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
|
913 # 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
|
914 if parent is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
915 if not parent.startswith(b'<'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
916 parent = b'<' + parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
917 if not parent.endswith(b'>'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
918 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
|
919 |
36450
d478c8cd89d1
py3: convert bytes to str using encoding.strfromlocal
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36449
diff
changeset
|
920 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
|
921 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
|
922 sendmail = None |
21726
fae032549ca2
patchbomb: always use message-id of first patch for series-id
Augie Fackler <raf@durin42.com>
parents:
21724
diff
changeset
|
923 firstpatch = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
924 progress = ui.makeprogress( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
925 _(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
|
926 ) |
12265
1ed2dc9d4368
patchbomb: show progress when sending emails or writing mbox
Yuya Nishihara <yuya@tcha.org>
parents:
12264
diff
changeset
|
927 for i, (m, subj, ds) in enumerate(msgs): |
875 | 928 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
929 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
|
930 if not firstpatch: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
931 firstpatch = m[b'Message-Id'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
932 m[b'X-Mercurial-Series-Id'] = firstpatch |
875 | 933 except TypeError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
934 m[b'Message-Id'] = genmsgid(b'patchbomb') |
875 | 935 if parent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
936 m[b'In-Reply-To'] = parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
937 m[b'References'] = parent |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
938 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
|
939 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
|
940 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
941 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
|
942 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
|
943 |
4027
2601ac9c54f0
patchbomb: fix timezone offset in message date header
Christian Ebert <blacktrash@gmx.net>
parents:
3473
diff
changeset
|
944 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
|
945 m[b'From'] = sender |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
946 m[b'To'] = b', '.join(to) |
5785
38cd1ce8650d
patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents:
5758
diff
changeset
|
947 if cc: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
948 m[b'Cc'] = b', '.join(cc) |
5785
38cd1ce8650d
patchbomb: add linebreaks after colons (coding style)
Christian Ebert <blacktrash@gmx.net>
parents:
5758
diff
changeset
|
949 if bcc: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
950 m[b'Bcc'] = b', '.join(bcc) |
11150
f66ca4431eb9
patchbomb: Reply-To support
Cédric Duval <cedricduval@free.fr>
parents:
10973
diff
changeset
|
951 if replyto: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
952 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
|
953 # 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
|
954 # 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
|
955 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
|
956 for hdr, val in list(m.items()): |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
957 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
|
958 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
|
959 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
|
960 hdr = pycompat.strurl(hdr) |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
961 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
|
962 if isinstance(val, bytes): |
43339
1a0d419ec763
py3: fix patchbomb to accept non-ASCII header value for email preview
Yuya Nishihara <yuya@tcha.org>
parents:
43157
diff
changeset
|
963 # header value should be ASCII since it's encoded by |
1a0d419ec763
py3: fix patchbomb to accept non-ASCII header value for email preview
Yuya Nishihara <yuya@tcha.org>
parents:
43157
diff
changeset
|
964 # mail.headencode(), but -n/--test disables it and raw |
1a0d419ec763
py3: fix patchbomb to accept non-ASCII header value for email preview
Yuya Nishihara <yuya@tcha.org>
parents:
43157
diff
changeset
|
965 # value of platform encoding is stored. |
1a0d419ec763
py3: fix patchbomb to accept non-ASCII header value for email preview
Yuya Nishihara <yuya@tcha.org>
parents:
43157
diff
changeset
|
966 val = encoding.strfromlocal(val) |
39035
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
967 if not change: |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
968 # prevent duplicate headers |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
969 del m[hdr] |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
970 change = True |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
971 if change: |
cecb05c371f7
patchbomb: don't unintentionally duplicate headers
Augie Fackler <augie@google.com>
parents:
39034
diff
changeset
|
972 m[hdr] = val |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
973 if opts.get(b'test'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
974 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
|
975 ui.pager(b'email') |
43157
3460eee570f7
patchbomb: use mail.Generator alias for py2/py3 compat
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43117
diff
changeset
|
976 generator = mail.Generator(ui, mangle_from_=False) |
1871
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
977 try: |
6447
9d2ce19bdacd
patchbomb: Fix mangling of lines beginning with From
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6229
diff
changeset
|
978 generator.flatten(m, 0) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
979 ui.write(b'\n') |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25202
diff
changeset
|
980 except IOError as inst: |
1871
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
981 if inst.errno != errno.EPIPE: |
258e3a7955b8
patchbomb: ignore exception if pager quits.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1846
diff
changeset
|
982 raise |
15560
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
983 else: |
cc58c228503e
mail: mbox handling as a part of mail handling, refactored from patchbomb
Mads Kiilerich <mads@kiilerich.com>
parents:
15559
diff
changeset
|
984 if not sendmail: |
29285
63a3749147af
mail: unsupport smtp.verifycert (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29205
diff
changeset
|
985 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
|
986 ui.status(_(b'sending '), subj, b' ...\n') |
38403
8ce3f91d5f6f
patchbomb: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38402
diff
changeset
|
987 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
|
988 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
|
989 # 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
|
990 del m[b'Bcc'] |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28474
diff
changeset
|
991 fp = stringio() |
43157
3460eee570f7
patchbomb: use mail.Generator alias for py2/py3 compat
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43117
diff
changeset
|
992 generator = mail.Generator(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
|
993 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
|
994 alldests = to + bcc + cc |
8919cc4f63b4
patchbomb: python 3 really wants those email addresses in unicode
Augie Fackler <augie@google.com>
parents:
39022
diff
changeset
|
995 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
|
996 sendmail(sender_addr, alldests, fp.getvalue()) |
875 | 997 |
38403
8ce3f91d5f6f
patchbomb: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38402
diff
changeset
|
998 progress.complete() |