Mercurial > hg
annotate mercurial/wireprotov1server.py @ 47012:d55b71393907
node: replace nullid and friends with nodeconstants class
The introduction of 256bit hashes require changes to nullid and other
constant magic values. Start pushing them down from repository and
revlog where sensible.
Differential Revision: https://phab.mercurial-scm.org/D9465
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Mon, 29 Mar 2021 01:52:06 +0200 |
parents | d4ba4d51f85f |
children | 04688c51f81f |
rev | line source |
---|---|
37785
b4d85bc122bd
wireproto: rename wireproto to wireprotov1server (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37784
diff
changeset
|
1 # wireprotov1server.py - Wire protocol version 1 server functionality |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46627
diff
changeset
|
3 # Copyright 2005-2010 Olivia Mackall <olivia@selenic.com> |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
8 from __future__ import absolute_import |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
9 |
41468
9cb51e74e9ad
wireprotov1server: use binascii.unhexlify
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
10 import binascii |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
11 import os |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
12 |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
13 from .i18n import _ |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
14 from .node import hex |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
15 from .pycompat import getattr |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
16 |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
17 from . import ( |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
18 bundle2, |
45784
74271829ddc0
clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45682
diff
changeset
|
19 bundlecaches, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
20 changegroup as changegroupmod, |
34097
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
34062
diff
changeset
|
21 discovery, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
22 encoding, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
23 error, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
24 exchange, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
25 pushkey as pushkeymod, |
30924
48dea083f66d
py3: convert the mode argument of os.fdopen to unicodes (1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30914
diff
changeset
|
26 pycompat, |
46626
ee91966aec0f
requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
27 requirements as requirementsmod, |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25993
diff
changeset
|
28 streamclone, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
29 util, |
36073
cd6ab329c5c7
wireprototypes: move wire protocol response types to new module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36071
diff
changeset
|
30 wireprototypes, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
31 ) |
20903
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
32 |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
33 from .utils import ( |
37119
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
34 procutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
35 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
36 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
37 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
38 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
39 urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
40 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
41 bundle2requiredmain = _(b'incompatible Mercurial client; bundle2 required') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
42 bundle2requiredhint = _( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
43 b'see https://www.mercurial-scm.org/wiki/IncompatibleClient' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
44 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
45 bundle2required = b'%s\n(%s)\n' % (bundle2requiredmain, bundle2requiredhint) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
46 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
47 |
37393
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
48 def clientcompressionsupport(proto): |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
49 """Returns a list of compression methods supported by the client. |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
50 |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
51 Returns a list of the compression methods supported by the client |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
52 according to the protocol capabilities. If no such capability has |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
53 been announced, fallback to the default of zlib and uncompressed. |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
54 """ |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
55 for cap in proto.getprotocaps(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
56 if cap.startswith(b'comp='): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 return cap[5:].split(b',') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 return [b'zlib', b'none'] |
37393
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
59 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
60 |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
61 # wire protocol command can either return a string or one of these classes. |
15017
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14970
diff
changeset
|
62 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
63 |
29590
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
64 def getdispatchrepo(repo, proto, command): |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
65 """Obtain the repo used for processing wire protocol commands. |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
66 |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
67 The intent of this function is to serve as a monkeypatch point for |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
68 extensions that need commands to operate on different repo views under |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
69 specialized circumstances. |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
70 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 viewconfig = repo.ui.config(b'server', b'view') |
41840
d6569f1e9b37
server: allow customizing the default repo filter
Joerg Sonnenberger <joerg@bec.de>
parents:
41468
diff
changeset
|
72 return repo.filtered(viewconfig) |
29590
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
73 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
74 |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
75 def dispatch(repo, proto, command): |
29590
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
76 repo = getdispatchrepo(repo, proto, command) |
37295
45b39c69fae0
wireproto: separate commands tables for version 1 and 2 commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37293
diff
changeset
|
77 |
37782
99accae4cc59
wireproto: reimplement dispatch() for version 2 server
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37781
diff
changeset
|
78 func, spec = commands[command] |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
79 args = proto.getargs(spec) |
37485
0b7475ea38cf
wireproto: port heads command to wire protocol v2
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37414
diff
changeset
|
80 |
37782
99accae4cc59
wireproto: reimplement dispatch() for version 2 server
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37781
diff
changeset
|
81 return func(repo, proto, *args) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
82 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
83 |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
84 def options(cmd, keys, others): |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
85 opts = {} |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
86 for k in keys: |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
87 if k in others: |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
88 opts[k] = others[k] |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
89 del others[k] |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
90 if others: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
91 procutil.stderr.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
92 b"warning: %s ignored unexpected arguments %s\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
93 % (cmd, b",".join(others)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
94 ) |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
95 return opts |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
96 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
97 |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
98 def bundle1allowed(repo, action): |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
99 """Whether a bundle1 operation is allowed from the server. |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
100 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
101 Priority is: |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
102 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
103 1. server.bundle1gd.<action> (if generaldelta active) |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
104 2. server.bundle1.<action> |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
105 3. server.bundle1gd (if generaldelta active) |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
106 4. server.bundle1 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
107 """ |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
108 ui = repo.ui |
46627
f4c325bf80fc
requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents:
46626
diff
changeset
|
109 gd = requirementsmod.GENERALDELTA_REQUIREMENT in repo.requirements |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
110 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
111 if gd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
112 v = ui.configbool(b'server', b'bundle1gd.%s' % action) |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
113 if v is not None: |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
114 return v |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
115 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 v = ui.configbool(b'server', b'bundle1.%s' % action) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
117 if v is not None: |
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
118 return v |
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
119 |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
120 if gd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
121 v = ui.configbool(b'server', b'bundle1gd') |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
122 if v is not None: |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
123 return v |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
124 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
125 return ui.configbool(b'server', b'bundle1') |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
126 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
127 |
37781
352932a11905
wireproto: move command registration types to wireprototypes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37780
diff
changeset
|
128 commands = wireprototypes.commanddict() |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
129 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
130 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
131 def wireprotocommand(name, args=None, permission=b'push'): |
35980
b4976912a6ef
wireproto: improve docstring for @wireprotocommand
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35979
diff
changeset
|
132 """Decorator to declare a wire protocol command. |
b4976912a6ef
wireproto: improve docstring for @wireprotocommand
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35979
diff
changeset
|
133 |
b4976912a6ef
wireproto: improve docstring for @wireprotocommand
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35979
diff
changeset
|
134 ``name`` is the name of the wire protocol command being provided. |
b4976912a6ef
wireproto: improve docstring for @wireprotocommand
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35979
diff
changeset
|
135 |
37535
69e46c1834ac
wireproto: define and expose types of wire command arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37534
diff
changeset
|
136 ``args`` defines the named arguments accepted by the command. It is |
37780
8acd3a9ac4fd
wireproto: make version 2 @wireprotocommand an independent function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37779
diff
changeset
|
137 a space-delimited list of argument names. ``*`` denotes a special value |
8acd3a9ac4fd
wireproto: make version 2 @wireprotocommand an independent function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37779
diff
changeset
|
138 that says to accept all named arguments. |
36800
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
139 |
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
140 ``permission`` defines the permission type needed to run this command. |
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
141 Can be ``push`` or ``pull``. These roughly map to read-write and read-only, |
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
142 respectively. Default is to assume command requires ``push`` permissions |
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
143 because otherwise commands not declaring their permissions could modify |
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
144 a repository that is supposed to be read-only. |
35980
b4976912a6ef
wireproto: improve docstring for @wireprotocommand
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35979
diff
changeset
|
145 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
146 transports = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 k for k, v in wireprototypes.TRANSPORTS.items() if v[b'version'] == 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
148 } |
36609
abc3b9801563
wireproto: allow wire protocol commands to declare transport support
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36535
diff
changeset
|
149 |
37053
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
150 # Because SSHv2 is a mirror of SSHv1, we allow "batch" commands through to |
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
151 # SSHv2. |
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
152 # TODO undo this hack when SSH is using the unified frame protocol. |
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
153 if name == b'batch': |
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
154 transports.add(wireprototypes.SSHV2) |
cd0ca979a8b8
wireproto: nominally don't expose "batch" to version 2 wire transports
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
155 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
156 if permission not in (b'push', b'pull'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
157 raise error.ProgrammingError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
158 b'invalid wire protocol permission; ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 b'got %s; expected "push" or "pull"' % permission |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
160 ) |
36800
0b18604db95e
wireproto: declare permissions requirements in @wireprotocommand (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36760
diff
changeset
|
161 |
37780
8acd3a9ac4fd
wireproto: make version 2 @wireprotocommand an independent function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37779
diff
changeset
|
162 if args is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
163 args = b'' |
37535
69e46c1834ac
wireproto: define and expose types of wire command arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37534
diff
changeset
|
164 |
37780
8acd3a9ac4fd
wireproto: make version 2 @wireprotocommand an independent function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37779
diff
changeset
|
165 if not isinstance(args, bytes): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
166 raise error.ProgrammingError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
167 b'arguments for version 1 commands must be declared as bytes' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
168 ) |
37535
69e46c1834ac
wireproto: define and expose types of wire command arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37534
diff
changeset
|
169 |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
170 def register(func): |
37780
8acd3a9ac4fd
wireproto: make version 2 @wireprotocommand an independent function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37779
diff
changeset
|
171 if name in commands: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
172 raise error.ProgrammingError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
173 b'%s command already registered for version 1' % name |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
174 ) |
37781
352932a11905
wireproto: move command registration types to wireprototypes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37780
diff
changeset
|
175 commands[name] = wireprototypes.commandentry( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
176 func, args=args, transports=transports, permission=permission |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
177 ) |
37295
45b39c69fae0
wireproto: separate commands tables for version 1 and 2 commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37293
diff
changeset
|
178 |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
179 return func |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
180 |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
181 return register |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
182 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
183 |
36755
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36754
diff
changeset
|
184 # TODO define a more appropriate permissions type to use for this. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 @wireprotocommand(b'batch', b'cmds *', permission=b'pull') |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
186 def batch(repo, proto, cmds, others): |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
187 unescapearg = wireprototypes.unescapebatcharg |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
188 res = [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
189 for pair in cmds.split(b';'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
190 op, args = pair.split(b' ', 1) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
191 vals = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
192 for a in args.split(b','): |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
193 if a: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
194 n, v = a.split(b'=') |
29734
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29733
diff
changeset
|
195 vals[unescapearg(n)] = unescapearg(v) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
196 func, spec = commands[op] |
36755
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36754
diff
changeset
|
197 |
36801
66de4555cefd
wireproto: formalize permissions checking as part of protocol interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36800
diff
changeset
|
198 # Validate that client has permissions to perform this command. |
66de4555cefd
wireproto: formalize permissions checking as part of protocol interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36800
diff
changeset
|
199 perm = commands[op].permission |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
200 assert perm in (b'push', b'pull') |
36801
66de4555cefd
wireproto: formalize permissions checking as part of protocol interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36800
diff
changeset
|
201 proto.checkperm(perm) |
36755
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36754
diff
changeset
|
202 |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
203 if spec: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
204 keys = spec.split() |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
205 data = {} |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
206 for k in keys: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 if k == b'*': |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
208 star = {} |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
209 for key in vals.keys(): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
210 if key not in keys: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
211 star[key] = vals[key] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 data[b'*'] = star |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
213 else: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
214 data[k] = vals[k] |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
215 result = func(repo, proto, *[data[k] for k in keys]) |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
216 else: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
217 result = func(repo, proto) |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
218 if isinstance(result, wireprototypes.ooberror): |
15017
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14970
diff
changeset
|
219 return result |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
220 |
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
221 # For now, all batchable commands must return bytesresponse or |
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
222 # raw bytes (for backwards compatibility). |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
223 assert isinstance(result, (wireprototypes.bytesresponse, bytes)) |
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
224 if isinstance(result, wireprototypes.bytesresponse): |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
225 result = result.data |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
226 res.append(wireprototypes.escapebatcharg(result)) |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
227 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
228 return wireprototypes.bytesresponse(b';'.join(res)) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
229 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
230 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
231 @wireprotocommand(b'between', b'pairs', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
232 def between(repo, proto, pairs): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 pairs = [wireprototypes.decodelist(p, b'-') for p in pairs.split(b" ")] |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
234 r = [] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
235 for b in repo.between(pairs): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
236 r.append(wireprototypes.encodelist(b) + b"\n") |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
237 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
238 return wireprototypes.bytesresponse(b''.join(r)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
239 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
240 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 @wireprotocommand(b'branchmap', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
242 def branchmap(repo, proto): |
18281
898c575833c9
clfilter: drop extra filtering in wireprotocol
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18280
diff
changeset
|
243 branchmap = repo.branchmap() |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
244 heads = [] |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
245 for branch, nodes in pycompat.iteritems(branchmap): |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
246 branchname = urlreq.quote(encoding.fromlocal(branch)) |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
247 branchnodes = wireprototypes.encodelist(nodes) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
248 heads.append(b'%s %s' % (branchname, branchnodes)) |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
249 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
250 return wireprototypes.bytesresponse(b'\n'.join(heads)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
251 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
252 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
253 @wireprotocommand(b'branches', b'nodes', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
254 def branches(repo, proto, nodes): |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
255 nodes = wireprototypes.decodelist(nodes) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
256 r = [] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
257 for b in repo.branches(nodes): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
258 r.append(wireprototypes.encodelist(b) + b"\n") |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
259 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
260 return wireprototypes.bytesresponse(b''.join(r)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
261 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
262 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
263 @wireprotocommand(b'clonebundles', b'', permission=b'pull') |
26857
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
264 def clonebundles(repo, proto): |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
265 """Server command for returning info for available bundles to seed clones. |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
266 |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
267 Clients will parse this response and determine what bundle to fetch. |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
268 |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
269 Extensions may wrap this command to filter or dynamically emit data |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
270 depending on the request. e.g. you could advertise URLs for the closest |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
271 data center given the client's IP address. |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
272 """ |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
273 return wireprototypes.bytesresponse( |
45785
80f32ec8653a
clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45784
diff
changeset
|
274 repo.vfs.tryread(bundlecaches.CB_MANIFEST_FILE) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
275 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
276 |
20774
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
277 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
278 wireprotocaps = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
279 b'lookup', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 b'branchmap', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
281 b'pushkey', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
282 b'known', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
283 b'getbundle', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
284 b'unbundlehash', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
285 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
286 |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
287 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
288 def _capabilities(repo, proto): |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
289 """return a list of capabilities for a repo |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
290 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
291 This function exists to allow extensions to easily wrap capabilities |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
292 computation |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
293 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
294 - returns a lists: easy to alter |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
295 - change done here will be propagated to both `capabilities` and `hello` |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20969
diff
changeset
|
296 command without any other action needed. |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
297 """ |
20774
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
298 # copy to prevent modification of the global list |
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
299 caps = list(wireprotocaps) |
36612
e89959970a08
wireproto: don't expose changegroupsubset capability if not available
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36611
diff
changeset
|
300 |
e89959970a08
wireproto: don't expose changegroupsubset capability if not available
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36611
diff
changeset
|
301 # Command of same name as capability isn't exposed to version 1 of |
e89959970a08
wireproto: don't expose changegroupsubset capability if not available
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36611
diff
changeset
|
302 # transports. So conditionally add it. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
303 if commands.commandavailable(b'changegroupsubset', proto): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
304 caps.append(b'changegroupsubset') |
36612
e89959970a08
wireproto: don't expose changegroupsubset capability if not available
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36611
diff
changeset
|
305 |
32744
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32291
diff
changeset
|
306 if streamclone.allowservergeneration(repo): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
307 if repo.ui.configbool(b'server', b'preferuncompressed'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
308 caps.append(b'stream-preferred') |
12296
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
309 requiredformats = repo.requirements & repo.supportedformats |
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
310 # if our local revlogs are just revlogv1, add 'stream' cap |
46626
ee91966aec0f
requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
311 if not requiredformats - {requirementsmod.REVLOGV1_REQUIREMENT}: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
312 caps.append(b'stream') |
12296
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
313 # otherwise, add 'streamreqs' detailing our local revlog format |
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
314 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
315 caps.append(b'streamreqs=%s' % b','.join(sorted(requiredformats))) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
316 if repo.ui.configbool(b'experimental', b'bundle2-advertise'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
317 capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo, role=b'server')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
318 caps.append(b'bundle2=' + urlreq.quote(capsblob)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
319 caps.append(b'unbundle=%s' % b','.join(bundle2.bundlepriority)) |
30563
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30473
diff
changeset
|
320 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
321 if repo.ui.configbool(b'experimental', b'narrow'): |
40075
ad8d8dc9be3f
narrow: move adding of narrow server capabilities to core
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38678
diff
changeset
|
322 caps.append(wireprototypes.NARROWCAP) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 if repo.ui.configbool(b'experimental', b'narrowservebrokenellipses'): |
40075
ad8d8dc9be3f
narrow: move adding of narrow server capabilities to core
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38678
diff
changeset
|
324 caps.append(wireprototypes.ELLIPSESCAP) |
ad8d8dc9be3f
narrow: move adding of narrow server capabilities to core
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
38678
diff
changeset
|
325 |
36613
6e585bca962e
wireproto: add transport specific capabilities in the transport
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36612
diff
changeset
|
326 return proto.addcapabilities(repo, caps) |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
327 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
328 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20969
diff
changeset
|
329 # If you are writing an extension and consider wrapping this function. Wrap |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
330 # `_capabilities` instead. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 @wireprotocommand(b'capabilities', permission=b'pull') |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
332 def capabilities(repo, proto): |
37413
33af46d639b4
wireproto: send server capabilities in canonical order
Joerg Sonnenberger <joerg@bec.de>
parents:
37412
diff
changeset
|
333 caps = _capabilities(repo, proto) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 return wireprototypes.bytesresponse(b' '.join(sorted(caps))) |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
335 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
336 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
337 @wireprotocommand(b'changegroup', b'roots', permission=b'pull') |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
338 def changegroup(repo, proto, roots): |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
339 nodes = wireprototypes.decodelist(roots) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
340 outgoing = discovery.outgoing( |
45144
c93dd9d9f1e6
discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents:
44782
diff
changeset
|
341 repo, missingroots=nodes, ancestorsof=repo.heads() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
342 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
343 cg = changegroupmod.makechangegroup(repo, outgoing, b'01', b'serve') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
344 gen = iter(lambda: cg.read(32768), b'') |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
345 return wireprototypes.streamres(gen=gen) |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
346 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
347 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 @wireprotocommand(b'changegroupsubset', b'bases heads', permission=b'pull') |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
349 def changegroupsubset(repo, proto, bases, heads): |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
350 bases = wireprototypes.decodelist(bases) |
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
351 heads = wireprototypes.decodelist(heads) |
45144
c93dd9d9f1e6
discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents:
44782
diff
changeset
|
352 outgoing = discovery.outgoing(repo, missingroots=bases, ancestorsof=heads) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
353 cg = changegroupmod.makechangegroup(repo, outgoing, b'01', b'serve') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
354 gen = iter(lambda: cg.read(32768), b'') |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
355 return wireprototypes.streamres(gen=gen) |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
356 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
357 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
358 @wireprotocommand(b'debugwireargs', b'one two *', permission=b'pull') |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
359 def debugwireargs(repo, proto, one, two, others): |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
360 # only accept optional args from the known set |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
361 opts = options(b'debugwireargs', [b'three', b'four'], others) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
362 return wireprototypes.bytesresponse( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
363 repo.debugwireargs(one, two, **pycompat.strkwargs(opts)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
364 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
365 |
13720
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
366 |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
367 def find_pullbundle(repo, proto, opts, clheads, heads, common): |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
368 """Return a file object for the first matching pullbundle. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
369 |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
370 Pullbundles are specified in .hg/pullbundles.manifest similar to |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
371 clonebundles. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
372 For each entry, the bundle specification is checked for compatibility: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
373 - Client features vs the BUNDLESPEC. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
374 - Revisions shared with the clients vs base revisions of the bundle. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
375 A bundle can be applied only if all its base revisions are known by |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
376 the client. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
377 - At least one leaf of the bundle's DAG is missing on the client. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
378 - Every leaf of the bundle's DAG is part of node set the client wants. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
379 E.g. do not send a bundle of all changes if the client wants only |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
380 one specific branch of many. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
381 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
382 |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
383 def decodehexstring(s): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
384 return {binascii.unhexlify(h) for h in s.split(b';')} |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
385 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
386 manifest = repo.vfs.tryread(b'pullbundles.manifest') |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
387 if not manifest: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
388 return None |
45784
74271829ddc0
clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45682
diff
changeset
|
389 res = bundlecaches.parseclonebundlesmanifest(repo, manifest) |
74271829ddc0
clonebundles: move a bundle of clone bundle related code to a new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45682
diff
changeset
|
390 res = bundlecaches.filterclonebundleentries(repo, res) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
391 if not res: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
392 return None |
44782
3d5fb6cab832
pullbundles: use unfiltered repo for head/base matching
Joerg Sonnenberger <joerg@bec.de>
parents:
43729
diff
changeset
|
393 cl = repo.unfiltered().changelog |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
394 heads_anc = cl.ancestors([cl.rev(rev) for rev in heads], inclusive=True) |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
395 common_anc = cl.ancestors([cl.rev(rev) for rev in common], inclusive=True) |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
396 compformats = clientcompressionsupport(proto) |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
397 for entry in res: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
398 comp = entry.get(b'COMPRESSION') |
38678
7e4a856a4f05
pullbundle: fix handling of gzip bundlespecs
Joerg Sonnenberger <joerg@bec.de>
parents:
38164
diff
changeset
|
399 altcomp = util.compengines._bundlenames.get(comp) |
7e4a856a4f05
pullbundle: fix handling of gzip bundlespecs
Joerg Sonnenberger <joerg@bec.de>
parents:
38164
diff
changeset
|
400 if comp and comp not in compformats and altcomp not in compformats: |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
401 continue |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
402 # No test yet for VERSION, since V2 is supported by any client |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
403 # that advertises partial pulls |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
404 if b'heads' in entry: |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
405 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 bundle_heads = decodehexstring(entry[b'heads']) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
407 except TypeError: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
408 # Bad heads entry |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
409 continue |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
410 if bundle_heads.issubset(common): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
411 continue # Nothing new |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
412 if all(cl.rev(rev) in common_anc for rev in bundle_heads): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
413 continue # Still nothing new |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
414 if any( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
415 cl.rev(rev) not in heads_anc and cl.rev(rev) not in common_anc |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
416 for rev in bundle_heads |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
417 ): |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
418 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 if b'bases' in entry: |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
420 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 bundle_bases = decodehexstring(entry[b'bases']) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
422 except TypeError: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
423 # Bad bases entry |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
424 continue |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
425 if not all(cl.rev(rev) in common_anc for rev in bundle_bases): |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
426 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
427 path = entry[b'URL'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
428 repo.ui.debug(b'sending pullbundle "%s"\n' % path) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
429 try: |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
430 return repo.vfs.open(path) |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
431 except IOError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
432 repo.ui.debug(b'pullbundle "%s" not accessible\n' % path) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
433 continue |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
434 return None |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
435 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
436 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
437 @wireprotocommand(b'getbundle', b'*', permission=b'pull') |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
438 def getbundle(repo, proto, others): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
439 opts = options( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
440 b'getbundle', wireprototypes.GETBUNDLE_ARGUMENTS.keys(), others |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
441 ) |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
442 for k, v in pycompat.iteritems(opts): |
37613
96d735601ca1
wireproto: move gboptsmap to wireprototypes and rename (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37612
diff
changeset
|
443 keytype = wireprototypes.GETBUNDLE_ARGUMENTS[k] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
444 if keytype == b'nodes': |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
445 opts[k] = wireprototypes.decodelist(v) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
446 elif keytype == b'csv': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
447 opts[k] = list(v.split(b',')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
448 elif keytype == b'scsv': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
449 opts[k] = set(v.split(b',')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
450 elif keytype == b'boolean': |
26686
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
451 # Client should serialize False as '0', which is a non-empty string |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
452 # so it evaluates as a True bool. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 if v == b'0': |
26686
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
454 opts[k] = False |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
455 else: |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
456 opts[k] = bool(v) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
457 elif keytype != b'plain': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
458 raise KeyError(b'unknown getbundle option type %s' % keytype) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
459 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
460 if not bundle1allowed(repo, b'pull'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
461 if not exchange.bundle2requested(opts.get(b'bundlecaps')): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
462 if proto.name == b'http-v1': |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
463 return wireprototypes.ooberror(bundle2required) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
464 raise error.Abort(bundle2requiredmain, hint=bundle2requiredhint) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
465 |
30914
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
466 try: |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
467 clheads = set(repo.changelog.heads()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
468 heads = set(opts.get(b'heads', set())) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
469 common = set(opts.get(b'common', set())) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
470 common.discard(repo.nullid) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
471 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
472 repo.ui.configbool(b'server', b'pullbundle') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
473 and b'partial-pull' in proto.getprotocaps() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
474 ): |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
475 # Check if a pre-built bundle covers this request. |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
476 bundle = find_pullbundle(repo, proto, opts, clheads, heads, common) |
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
477 if bundle: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
478 return wireprototypes.streamres( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
479 gen=util.filechunkiter(bundle), prefer_uncompressed=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
480 ) |
37498
aacfca6f9767
wireproto: support for pullbundles
Joerg Sonnenberger <joerg@bec.de>
parents:
37490
diff
changeset
|
481 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
482 if repo.ui.configbool(b'server', b'disablefullbundle'): |
32260
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31451
diff
changeset
|
483 # Check to see if this is a full clone. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
484 changegroup = opts.get(b'cg', True) |
35760
133a678673cb
clone: allow bundle2's stream clone with 'server.disablefullbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35759
diff
changeset
|
485 if changegroup and not common and clheads == heads: |
32260
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31451
diff
changeset
|
486 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
487 _(b'server has pull-based clones disabled'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
488 hint=_(b'remove --pull if specified or upgrade Mercurial'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
489 ) |
32260
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31451
diff
changeset
|
490 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
491 info, chunks = exchange.getbundlechunks( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
492 repo, b'serve', **pycompat.strkwargs(opts) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
493 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
494 prefercompressed = info.get(b'prefercompressed', True) |
30914
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
495 except error.Abort as exc: |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
496 # cleanly forward Abort error to the client |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
497 if not exchange.bundle2requested(opts.get(b'bundlecaps')): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
498 if proto.name == b'http-v1': |
45682
d2e1dcd4490d
errors: name arguments to Abort constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
45144
diff
changeset
|
499 return wireprototypes.ooberror(exc.message + b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
500 raise # cannot do better for bundle1 + ssh |
30914
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
501 # bundle2 request expect a bundle2 reply |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
502 bundler = bundle2.bundle20(repo.ui) |
45682
d2e1dcd4490d
errors: name arguments to Abort constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
45144
diff
changeset
|
503 manargs = [(b'message', exc.message)] |
30914
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
504 advargs = [] |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30912
diff
changeset
|
505 if exc.hint is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
506 advargs.append((b'hint', exc.hint)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
507 bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs)) |
35782
9d249f3de730
wireproto: don't compress errors from getbundle()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35760
diff
changeset
|
508 chunks = bundler.getchunks() |
35787
a84dbc87dae9
exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35785
diff
changeset
|
509 prefercompressed = False |
35782
9d249f3de730
wireproto: don't compress errors from getbundle()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35760
diff
changeset
|
510 |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
511 return wireprototypes.streamres( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
512 gen=chunks, prefer_uncompressed=not prefercompressed |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
513 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
514 |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
515 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
516 @wireprotocommand(b'heads', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
517 def heads(repo, proto): |
18281
898c575833c9
clfilter: drop extra filtering in wireprotocol
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18280
diff
changeset
|
518 h = repo.heads() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
519 return wireprototypes.bytesresponse(wireprototypes.encodelist(h) + b'\n') |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
520 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
521 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
522 @wireprotocommand(b'hello', permission=b'pull') |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
523 def hello(repo, proto): |
36221
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
524 """Called as part of SSH handshake to obtain server info. |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
525 |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
526 Returns a list of lines describing interesting things about the |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
527 server, in an RFC822-like format. |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
528 |
36221
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
529 Currently, the only one defined is ``capabilities``, which consists of a |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
530 line of space separated tokens describing server abilities: |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
531 |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
532 capabilities: <token0> <token1> <token2> |
62bca1c50e96
wireproto: improve docstring for "hello"
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36074
diff
changeset
|
533 """ |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36073
diff
changeset
|
534 caps = capabilities(repo, proto).data |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
535 return wireprototypes.bytesresponse(b'capabilities: %s\n' % caps) |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
536 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
537 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
538 @wireprotocommand(b'listkeys', b'namespace', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
539 def listkeys(repo, proto, namespace): |
36529
33c6f8f0388d
wireproto: sort response to listkeys
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36431
diff
changeset
|
540 d = sorted(repo.listkeys(encoding.tolocal(namespace)).items()) |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
541 return wireprototypes.bytesresponse(pushkeymod.encodekeys(d)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
542 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
543 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
544 @wireprotocommand(b'lookup', b'key', permission=b'pull') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
545 def lookup(repo, proto, key): |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
546 try: |
15925
f9fc46698352
wireproto: refuse to lookup secret csets
Matt Mackall <mpm@selenic.com>
parents:
15713
diff
changeset
|
547 k = encoding.tolocal(key) |
37353
ac666c5c2e0c
wireproto: use repo.lookup() for lookup command
Martin von Zweigbergk <martinvonz@google.com>
parents:
37320
diff
changeset
|
548 n = repo.lookup(k) |
ac666c5c2e0c
wireproto: use repo.lookup() for lookup command
Martin von Zweigbergk <martinvonz@google.com>
parents:
37320
diff
changeset
|
549 r = hex(n) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
550 success = 1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25493
diff
changeset
|
551 except Exception as inst: |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
552 r = stringutil.forcebytestr(inst) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
553 success = 0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
554 return wireprototypes.bytesresponse(b'%d %s\n' % (success, r)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
555 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
556 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
557 @wireprotocommand(b'known', b'nodes *', permission=b'pull') |
14436
5adb52524779
wireproto: enable optional args for known() for future extensibility
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14419
diff
changeset
|
558 def known(repo, proto, nodes, others): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
559 v = b''.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
560 b and b'1' or b'0' for b in repo.known(wireprototypes.decodelist(nodes)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
561 ) |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
562 return wireprototypes.bytesresponse(v) |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
563 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
564 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
565 @wireprotocommand(b'protocaps', b'caps', permission=b'pull') |
37393
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
566 def protocaps(repo, proto, caps): |
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
567 if proto.name == wireprototypes.SSHV1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
568 proto._protocaps = set(caps.split(b' ')) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 return wireprototypes.bytesresponse(b'OK') |
37393
afcfdf53e4b5
wireproto: provide accessors for client capabilities
Joerg Sonnenberger <joerg@bec.de>
parents:
37353
diff
changeset
|
570 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
571 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
572 @wireprotocommand(b'pushkey', b'namespace key old new', permission=b'push') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
573 def pushkey(repo, proto, namespace, key, old, new): |
13050 | 574 # compatibility with pre-1.8 clients which were accidentally |
575 # sending raw binary nodes rather than utf-8-encoded hex | |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37053
diff
changeset
|
576 if len(new) == 20 and stringutil.escapestr(new) != new: |
13050 | 577 # looks like it could be a binary node |
578 try: | |
14064
e4bfb9c337f3
remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents:
14048
diff
changeset
|
579 new.decode('utf-8') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
580 new = encoding.tolocal(new) # but cleanly decodes as UTF-8 |
13050 | 581 except UnicodeDecodeError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
582 pass # binary, leave unmodified |
13050 | 583 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
584 new = encoding.tolocal(new) # normal path |
13050 | 585 |
36066
2ad145fbde54
wireprotoserver: add context manager mechanism for redirecting stdio
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35982
diff
changeset
|
586 with proto.mayberedirectstdio() as output: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
587 r = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
588 repo.pushkey( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
589 encoding.tolocal(namespace), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
590 encoding.tolocal(key), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
591 encoding.tolocal(old), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
592 new, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
593 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
594 or False |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
595 ) |
17793
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
596 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
597 output = output.getvalue() if output else b'' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
598 return wireprototypes.bytesresponse(b'%d\n%s' % (int(r), output)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
599 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
600 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
601 @wireprotocommand(b'stream_out', permission=b'pull') |
11585
5d907fbb9703
protocol: unify stream_out command
Matt Mackall <mpm@selenic.com>
parents:
11584
diff
changeset
|
602 def stream(repo, proto): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
603 """If the server supports streaming clone, it advertises the "stream" |
11627
04f76a954842
protocol: move the streamclone implementation into wireproto
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11625
diff
changeset
|
604 capability with a value representing the version and flags of the repo |
04f76a954842
protocol: move the streamclone implementation into wireproto
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11625
diff
changeset
|
605 it is serving. Client checks to see if it understands the format. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45885
diff
changeset
|
606 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
607 return wireprototypes.streamreslegacy(streamclone.generatev1wireproto(repo)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
608 |
11585
5d907fbb9703
protocol: unify stream_out command
Matt Mackall <mpm@selenic.com>
parents:
11584
diff
changeset
|
609 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
610 @wireprotocommand(b'unbundle', b'heads', permission=b'push') |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
611 def unbundle(repo, proto, heads): |
37612
5e71dea79aae
wireproto: move value encoding functions to wireprototypes (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37546
diff
changeset
|
612 their_heads = wireprototypes.decodelist(heads) |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
613 |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
614 with proto.mayberedirectstdio() as output: |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
615 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
616 exchange.check_heads(repo, their_heads, b'preparing changes') |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
617 cleanup = lambda: None |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
618 try: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
619 payload = proto.getpayload() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
620 if repo.ui.configbool(b'server', b'streamunbundle'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
621 |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
622 def cleanup(): |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
623 # Ensure that the full payload is consumed, so |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
624 # that the connection doesn't contain trailing garbage. |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
625 for p in payload: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
626 pass |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
627 |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
628 fp = util.chunkbuffer(payload) |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
629 else: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
630 # write bundle data to temporary file as it can be big |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
631 fp, tempname = None, None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
632 |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
633 def cleanup(): |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
634 if fp: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
635 fp.close() |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
636 if tempname: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
637 os.unlink(tempname) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
638 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
639 fd, tempname = pycompat.mkstemp(prefix=b'hg-unbundle-') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
640 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
641 b'redirecting incoming bundle to %s\n' % tempname |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
642 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
643 fp = os.fdopen(fd, pycompat.sysstr(b'wb+')) |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
644 for p in payload: |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
645 fp.write(p) |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
646 fp.seek(0) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
647 |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
648 gen = exchange.readbundle(repo.ui, fp, None) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
649 if isinstance( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
650 gen, changegroupmod.cg1unpacker |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
651 ) and not bundle1allowed(repo, b'push'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
652 if proto.name == b'http-v1': |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
653 # need to special case http because stderr do not get to |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
654 # the http client on failed push so we need to abuse |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
655 # some other error type to make sure the message get to |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
656 # the user. |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
657 return wireprototypes.ooberror(bundle2required) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
658 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
659 bundle2requiredmain, hint=bundle2requiredhint |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
660 ) |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
661 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
662 r = exchange.unbundle( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
663 repo, gen, their_heads, b'serve', proto.client() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
664 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
665 if util.safehasattr(r, b'addpart'): |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
666 # The return looks streamable, we are in the bundle2 case |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
667 # and should return a stream. |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
668 return wireprototypes.streamreslegacy(gen=r.getchunks()) |
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
669 return wireprototypes.pushres( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
670 r, output.getvalue() if output else b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
671 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
672 |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
673 finally: |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37413
diff
changeset
|
674 cleanup() |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
675 |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
676 except (error.BundleValueError, error.Abort, error.PushRaced) as exc: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
677 # handle non-bundle2 case first |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
678 if not getattr(exc, 'duringunbundle2', False): |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
679 try: |
25493
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
680 raise |
43729
1d1232c0726f
wireprotov1server: capture Abort type before accessing the `hint` attribute
Matt Harbison <matt_harbison@yahoo.com>
parents:
43117
diff
changeset
|
681 except error.Abort as exc: |
37119
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
682 # The old code we moved used procutil.stderr directly. |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
683 # We did not change it to minimise code change. |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
684 # This need to be moved to something proper. |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
685 # Feel free to do it. |
45885
600aec73f309
errors: format "abort: " text in a new Abort.format() method
Martin von Zweigbergk <martinvonz@google.com>
parents:
45785
diff
changeset
|
686 procutil.stderr.write(exc.format()) |
37119
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
687 procutil.stderr.flush() |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
688 return wireprototypes.pushres( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
689 0, output.getvalue() if output else b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
690 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
691 except error.PushRaced: |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
692 return wireprototypes.pusherr( |
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
693 pycompat.bytestr(exc), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
694 output.getvalue() if output else b'', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
695 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
696 |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
697 bundler = bundle2.bundle20(repo.ui) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
698 for out in getattr(exc, '_bundle2salvagedoutput', ()): |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
699 bundler.addpart(out) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
700 try: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
701 try: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
702 raise |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
703 except error.PushkeyFailed as exc: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
704 # check client caps |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
705 remotecaps = getattr(exc, '_replycaps', None) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
706 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
707 remotecaps is not None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
708 and b'pushkey' not in remotecaps.get(b'error', ()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
709 ): |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
710 # no support remote side, fallback to Abort handler. |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
711 raise |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
712 part = bundler.newpart(b'error:pushkey') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
713 part.addparam(b'in-reply-to', exc.partid) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
714 if exc.namespace is not None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
715 part.addparam( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
716 b'namespace', exc.namespace, mandatory=False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
717 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
718 if exc.key is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
719 part.addparam(b'key', exc.key, mandatory=False) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
720 if exc.new is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
721 part.addparam(b'new', exc.new, mandatory=False) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
722 if exc.old is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
723 part.addparam(b'old', exc.old, mandatory=False) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
724 if exc.ret is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
725 part.addparam(b'ret', exc.ret, mandatory=False) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
726 except error.BundleValueError as exc: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
727 errpart = bundler.newpart(b'error:unsupportedcontent') |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
728 if exc.parttype is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
729 errpart.addparam(b'parttype', exc.parttype) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
730 if exc.params: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
731 errpart.addparam(b'params', b'\0'.join(exc.params)) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
732 except error.Abort as exc: |
45682
d2e1dcd4490d
errors: name arguments to Abort constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
45144
diff
changeset
|
733 manargs = [(b'message', exc.message)] |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
734 advargs = [] |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
735 if exc.hint is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
736 advargs.append((b'hint', exc.hint)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
737 bundler.addpart( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
738 bundle2.bundlepart(b'error:abort', manargs, advargs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
739 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36066
diff
changeset
|
740 except error.PushRaced as exc: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
741 bundler.newpart( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
742 b'error:pushraced', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
743 [(b'message', stringutil.forcebytestr(exc))], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42057
diff
changeset
|
744 ) |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37119
diff
changeset
|
745 return wireprototypes.streamreslegacy(gen=bundler.getchunks()) |