Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/wireproto.py @ 35848:ff4bc0ab6740 stable
wireproto: check permissions when executing "batch" command (BC) (SEC)
For as long as the "batch" command has existed (introduced by
bd88561afb4b and first released as part of Mercurial 1.9), that command
(like most wire commands introduced after 2008) lacked an entry in
the hgweb permissions table. And since we don't verify permissions if
an entry is missing from the permissions table, this meant that
executing a command via "batch" would bypass all permissions
checks.
The security implications are significant: a Mercurial HTTP server
would allow writes via "batch" wire protocol commands as long as
the HTTP request were processed by Mercurial and the process running
the Mercurial HTTP server had write access to the repository. The
Mercurial defaults of servers being read-only and the various web.*
config options to define access control were bypassed.
In addition, "batch" could be used to exfiltrate data from servers
that were configured to not allow read access.
Both forms of permissions bypass could be mitigated to some extent
by using HTTP authentication. This would prevent HTTP requests from
hitting Mercurial's server logic. However, any authenticated request
would still be able to bypass permissions checks via "batch" commands.
The easiest exploit was to send "pushkey" commands via "batch" and
modify the state of bookmarks, phases, and obsolescence markers.
However, I suspect a well-crafted HTTP request could trick the server
into running the "unbundle" wire protocol command, effectively
performing a full `hg push` to create new changesets on the remote.
This commit plugs this gaping security hole by having the "batch"
command perform permissions checking on each sub-command that is
being batched. We do this by threading a permissions checking
callable all the way to the protocol handler. The threading is a
bit hacky from a code perspective. But it preserves API compatibility,
which is the proper thing to do on the stable branch.
One of the subtle things we do is assume that a command with an
undefined permission is a "push" command. This is the safest thing to
do from a security perspective: we don't want to take chances that
a command could perform a write even though the server is configured
to not allow writes.
As the test changes demonstrate, it is no longer possible to bypass
permissions via the "batch" wire protocol command.
.. bc::
The "batch" wire protocol command now enforces permissions of
each invoked sub-command. Wire protocol commands must define
their operation type or the "batch" command will assume they
can write data and will prevent their execution on HTTP servers
unless the HTTP request method is POST, the server is configured
to allow pushes, and the (possibly authenticated) HTTP user is
authorized to perform a push.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 20 Feb 2018 18:55:58 -0800 |
parents | e3c228b4510d |
children | 7bf80d9d9543 |
rev | line source |
---|---|
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # wireproto.py - generic wire protocol support functions |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com> |
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 |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29216
diff
changeset
|
10 import hashlib |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
11 import os |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
12 import tempfile |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
13 |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
14 from .i18n import _ |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
15 from .node import ( |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
16 bin, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
17 hex, |
32300
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
18 nullid, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
19 ) |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
20 |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
21 from . import ( |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
22 bundle2, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
23 changegroup as changegroupmod, |
34112
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
34079
diff
changeset
|
24 discovery, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
25 encoding, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
26 error, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
27 exchange, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
28 peer, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
29 pushkey as pushkeymod, |
30944
48dea083f66d
py3: convert the mode argument of os.fdopen to unicodes (1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30876
diff
changeset
|
30 pycompat, |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
31 repository, |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25993
diff
changeset
|
32 streamclone, |
25993
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
33 util, |
0851678be71b
wireproto: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25913
diff
changeset
|
34 ) |
20903
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
35 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
36 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
37 urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
38 |
30871
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
39 bundle2requiredmain = _('incompatible Mercurial client; bundle2 required') |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
40 bundle2requiredhint = _('see https://www.mercurial-scm.org/wiki/' |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
41 'IncompatibleClient') |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
42 bundle2required = '%s\n(%s)\n' % (bundle2requiredmain, bundle2requiredhint) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
43 |
20903
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
44 class abstractserverproto(object): |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
45 """abstract class that summarizes the protocol API |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
46 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
47 Used as reference and documentation. |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
48 """ |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
49 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
50 def getargs(self, args): |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
51 """return the value for arguments in <args> |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
52 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
53 returns a list of values (same order as <args>)""" |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
54 raise NotImplementedError() |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
55 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
56 def getfile(self, fp): |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
57 """write the whole content of a file into a file like object |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
58 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
59 The file is in the form:: |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
60 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
61 (<chunk-size>\n<chunk>)+0\n |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
62 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
63 chunk size is the ascii version of the int. |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
64 """ |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
65 raise NotImplementedError() |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
66 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
67 def redirect(self): |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
68 """may setup interception for stdout and stderr |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
69 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
70 See also the `restore` method.""" |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
71 raise NotImplementedError() |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
72 |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
73 # If the `redirect` function does install interception, the `restore` |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
74 # function MUST be defined. If interception is not used, this function |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
75 # MUST NOT be defined. |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
76 # |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
77 # left commented here on purpose |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
78 # |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
79 #def restore(self): |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
80 # """reinstall previous stdout and stderr and return intercepted stdout |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
81 # """ |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
82 # raise NotImplementedError() |
8d477543882b
wireproto: introduce an abstractserverproto class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20902
diff
changeset
|
83 |
28436
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
84 class remoteiterbatcher(peer.iterbatcher): |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
85 def __init__(self, remote): |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
86 super(remoteiterbatcher, self).__init__() |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
87 self._remote = remote |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
88 |
28438
48fd02dac1d4
wireproto: make iterbatcher behave streamily over http(s)
Augie Fackler <augie@google.com>
parents:
28436
diff
changeset
|
89 def __getattr__(self, name): |
33785
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
90 # Validate this method is batchable, since submit() only supports |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
91 # batchable methods. |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
92 fn = getattr(self._remote, name) |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
93 if not getattr(fn, 'batchable', None): |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
94 raise error.ProgrammingError('Attempted to batch a non-batchable ' |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
95 'call to %r' % name) |
297d1b70685c
wireproto: properly implement batchable checking
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
96 |
28438
48fd02dac1d4
wireproto: make iterbatcher behave streamily over http(s)
Augie Fackler <augie@google.com>
parents:
28436
diff
changeset
|
97 return super(remoteiterbatcher, self).__getattr__(name) |
48fd02dac1d4
wireproto: make iterbatcher behave streamily over http(s)
Augie Fackler <augie@google.com>
parents:
28436
diff
changeset
|
98 |
28436
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
99 def submit(self): |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
100 """Break the batch request into many patch calls and pipeline them. |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
101 |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
102 This is mostly valuable over http where request sizes can be |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
103 limited, but can be used in other places as well. |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
104 """ |
33787
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
105 # 2-tuple of (command, arguments) that represents what will be |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
106 # sent over the wire. |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
107 requests = [] |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
108 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
109 # 4-tuple of (command, final future, @batchable generator, remote |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
110 # future). |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
111 results = [] |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
112 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
113 for command, args, opts, finalfuture in self.calls: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
114 mtd = getattr(self._remote, command) |
34726
daf12f69699f
python3: replace im_{self,func} with __{self,func}__ globally
Augie Fackler <augie@google.com>
parents:
34613
diff
changeset
|
115 batchable = mtd.batchable(mtd.__self__, *args, **opts) |
33787
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
116 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
117 commandargs, fremote = next(batchable) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
118 assert fremote |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
119 requests.append((command, commandargs)) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
120 results.append((command, finalfuture, batchable, fremote)) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
121 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
122 if requests: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
123 self._resultiter = self._remote._submitbatch(requests) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
124 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
125 self._results = results |
28436
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
126 |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
127 def results(self): |
33787
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
128 for command, finalfuture, batchable, remotefuture in self._results: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
129 # Get the raw result, set it in the remote future, feed it |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
130 # back into the @batchable generator so it can be decoded, and |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
131 # set the result on the final future to this value. |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
132 remoteresult = next(self._resultiter) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
133 remotefuture.set(remoteresult) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
134 finalfuture.set(next(batchable)) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
135 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
136 # Verify our @batchable generators only emit 2 values. |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
137 try: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
138 next(batchable) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
139 except StopIteration: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
140 pass |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
141 else: |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
142 raise error.ProgrammingError('%s @batchable generator emitted ' |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
143 'unexpected value count' % command) |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
144 |
4c706037adef
wireproto: overhaul iterating batcher code (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33786
diff
changeset
|
145 yield finalfuture.value |
28436
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
146 |
25912
cbbdd085c991
batching: migrate basic noop batching into peer.peer
Augie Fackler <augie@google.com>
parents:
25711
diff
changeset
|
147 # Forward a couple of names from peer to make wireproto interactions |
cbbdd085c991
batching: migrate basic noop batching into peer.peer
Augie Fackler <augie@google.com>
parents:
25711
diff
changeset
|
148 # slightly more sensible. |
cbbdd085c991
batching: migrate basic noop batching into peer.peer
Augie Fackler <augie@google.com>
parents:
25711
diff
changeset
|
149 batchable = peer.batchable |
cbbdd085c991
batching: migrate basic noop batching into peer.peer
Augie Fackler <augie@google.com>
parents:
25711
diff
changeset
|
150 future = peer.future |
14621
84094c0d2724
wireproto: add basic command batching infrastructure
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14436
diff
changeset
|
151 |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
152 # list of nodes encoding / decoding |
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
153 |
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
154 def decodelist(l, sep=' '): |
13722
f4a85acef50c
wireproto: fix decodelist to properly return empty list
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13721
diff
changeset
|
155 if l: |
34729
6f532c1a4af0
wireproto: use listcomp instead of map()
Augie Fackler <augie@google.com>
parents:
34726
diff
changeset
|
156 return [bin(v) for v in l.split(sep)] |
13722
f4a85acef50c
wireproto: fix decodelist to properly return empty list
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13721
diff
changeset
|
157 return [] |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
158 |
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
159 def encodelist(l, sep=' '): |
23848
c5456b64eb07
discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23591
diff
changeset
|
160 try: |
c5456b64eb07
discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23591
diff
changeset
|
161 return sep.join(map(hex, l)) |
c5456b64eb07
discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23591
diff
changeset
|
162 except TypeError: |
c5456b64eb07
discovery: run discovery on filtered repository
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23591
diff
changeset
|
163 raise |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
164 |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
165 # batched call argument encoding |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
166 |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
167 def escapearg(plain): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
168 return (plain |
25708
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
169 .replace(':', ':c') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
170 .replace(',', ':o') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
171 .replace(';', ':s') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
172 .replace('=', ':e')) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
173 |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
174 def unescapearg(escaped): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
175 return (escaped |
25708
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
176 .replace(':e', '=') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
177 .replace(':s', ';') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
178 .replace(':o', ',') |
d3d32643c060
wireproto: correctly escape batched args and responses (issue4739)
Augie Fackler <augie@google.com>
parents:
25691
diff
changeset
|
179 .replace(':c', ':')) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
180 |
29745
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
181 def encodebatchcmds(req): |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
182 """Return a ``cmds`` argument value for the ``batch`` command.""" |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
183 cmds = [] |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
184 for op, argsdict in req: |
29746
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
185 # Old servers didn't properly unescape argument names. So prevent |
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
186 # the sending of argument names that may not be decoded properly by |
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
187 # servers. |
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
188 assert all(escapearg(k) == k for k in argsdict) |
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
189 |
29745
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
190 args = ','.join('%s=%s' % (escapearg(k), escapearg(v)) |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
191 for k, v in argsdict.iteritems()) |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
192 cmds.append('%s %s' % (op, args)) |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
193 |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
194 return ';'.join(cmds) |
bb04f96df51c
wireproto: consolidate code for obtaining "cmds" argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29719
diff
changeset
|
195 |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
196 # mapping of options accepted by getbundle and their types |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
197 # |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
198 # Meant to be extended by extensions. It is extensions responsibility to ensure |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
199 # such options are properly processed in exchange.getbundle. |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
200 # |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
201 # supported types are: |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
202 # |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
203 # :nodes: list of binary nodes |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
204 # :csv: list of comma-separated values |
25403
30ab130af221
wireprotocol: distinguish list and set in getbundle argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25339
diff
changeset
|
205 # :scsv: list of comma-separated values return as set |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
206 # :plain: string with no transformation needed. |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
207 gboptsmap = {'heads': 'nodes', |
35276
cb4dcd7fabe7
getbundle: add support for 'bookmarks' boolean argument
Boris Feld <boris.feld@octobus.net>
parents:
34741
diff
changeset
|
208 'bookmarks': 'boolean', |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
209 'common': 'nodes', |
22353
47e3420ae889
getbundle: add `obsmarkers` argument to getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22351
diff
changeset
|
210 'obsmarkers': 'boolean', |
34329
10e162bb9bf5
pull: use 'phase-heads' to retrieve phase information
Boris Feld <boris.feld@octobus.net>
parents:
34115
diff
changeset
|
211 'phases': 'boolean', |
25403
30ab130af221
wireprotocol: distinguish list and set in getbundle argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25339
diff
changeset
|
212 'bundlecaps': 'scsv', |
21989
bdb6d97f0a04
getbundle: add a ``cg`` boolean argument to control changegroup inclusion
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21988
diff
changeset
|
213 'listkeys': 'csv', |
26690
704818fb170d
exchange: advertise if a clone bundle was attempted
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26686
diff
changeset
|
214 'cg': 'boolean', |
35759
c24dad55ac19
bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35750
diff
changeset
|
215 'cbattempted': 'boolean', |
c24dad55ac19
bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35750
diff
changeset
|
216 'stream': 'boolean', |
c24dad55ac19
bundle2: add support for a 'stream' parameter to 'getbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35750
diff
changeset
|
217 } |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
218 |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
219 # client side |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
220 |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
221 class wirepeer(repository.legacypeer): |
27243
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
222 """Client-side interface for communicating with a peer repository. |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
223 |
27243
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
224 Methods commonly call wire protocol commands of the same name. |
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
225 |
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
226 See also httppeer.py and sshpeer.py for protocol-specific |
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
227 implementations of this interface. |
3abee2ba27af
wireproto: add docstring for wirepeer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26911
diff
changeset
|
228 """ |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
229 # Begin of basewirepeer interface. |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
230 |
28436
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
231 def iterbatch(self): |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
232 return remoteiterbatcher(self) |
8d38eab2777a
peer: add an iterbatcher interface
Augie Fackler <augie@google.com>
parents:
28435
diff
changeset
|
233 |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
234 @batchable |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
235 def lookup(self, key): |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
236 self.requirecap('lookup', _('look up remote revision')) |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
237 f = future() |
20671
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
238 yield {'key': encoding.fromlocal(key)}, f |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
239 d = f.value |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
240 success, data = d[:-1].split(" ", 1) |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
241 if int(success): |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
242 yield bin(data) |
34079
6c6169f71b8d
wireproto: do not abort after successful lookup
Kyle Lippincott <spectral@google.com>
parents:
33827
diff
changeset
|
243 else: |
6c6169f71b8d
wireproto: do not abort after successful lookup
Kyle Lippincott <spectral@google.com>
parents:
33827
diff
changeset
|
244 self._abort(error.RepoError(data)) |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
245 |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
246 @batchable |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
247 def heads(self): |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
248 f = future() |
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
249 yield {}, f |
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
250 d = f.value |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
251 try: |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
252 yield decodelist(d[:-1]) |
13726
378522bdc059
wireproto: avoid naked excepts
Matt Mackall <mpm@selenic.com>
parents:
13723
diff
changeset
|
253 except ValueError: |
11879
4e804302d30c
fix undefined variables, spotted by pylint
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11627
diff
changeset
|
254 self._abort(error.ResponseError(_("unexpected response:"), d)) |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
255 |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
256 @batchable |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
257 def known(self, nodes): |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
258 f = future() |
20671
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
259 yield {'nodes': encodelist(nodes)}, f |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
260 d = f.value |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
261 try: |
22201
269688a398c4
cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents:
21989
diff
changeset
|
262 yield [bool(int(b)) for b in d] |
13726
378522bdc059
wireproto: avoid naked excepts
Matt Mackall <mpm@selenic.com>
parents:
13723
diff
changeset
|
263 except ValueError: |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
264 self._abort(error.ResponseError(_("unexpected response:"), d)) |
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
265 |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
266 @batchable |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
267 def branchmap(self): |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
268 f = future() |
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
269 yield {}, f |
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
270 d = f.value |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
271 try: |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
272 branchmap = {} |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
273 for branchpart in d.splitlines(): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
274 branchname, branchheads = branchpart.split(' ', 1) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
275 branchname = encoding.tolocal(urlreq.unquote(branchname)) |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
276 branchheads = decodelist(branchheads) |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
277 branchmap[branchname] = branchheads |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
278 yield branchmap |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
279 except TypeError: |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
280 self._abort(error.ResponseError(_("unexpected response:"), d)) |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
281 |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
282 @batchable |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
283 def listkeys(self, namespace): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
284 if not self.capable('pushkey'): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
285 yield {}, None |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
286 f = future() |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
287 self.ui.debug('preparing listkeys for "%s"\n' % namespace) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
288 yield {'namespace': encoding.fromlocal(namespace)}, f |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
289 d = f.value |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
290 self.ui.debug('received listkey for "%s": %i bytes\n' |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
291 % (namespace, len(d))) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
292 yield pushkeymod.decodekeys(d) |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
293 |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
294 @batchable |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
295 def pushkey(self, namespace, key, old, new): |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
296 if not self.capable('pushkey'): |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
297 yield False, None |
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
298 f = future() |
17293
d3f84ccc5495
pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17205
diff
changeset
|
299 self.ui.debug('preparing pushkey for "%s:%s"\n' % (namespace, key)) |
20671
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
300 yield {'namespace': encoding.fromlocal(namespace), |
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
301 'key': encoding.fromlocal(key), |
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
302 'old': encoding.fromlocal(old), |
5442cab57b09
wireproto: remove todict() and use {} literals instead
Augie Fackler <raf@durin42.com>
parents:
19201
diff
changeset
|
303 'new': encoding.fromlocal(new)}, f |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
304 d = f.value |
15652
ca6accdad79c
wireproto: handle other server output in pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15585
diff
changeset
|
305 d, output = d.split('\n', 1) |
13450
b3f9af7c22c5
wireproto: catch possible cast error in pushkey
David Soria Parra <dsp@php.net>
parents:
13050
diff
changeset
|
306 try: |
b3f9af7c22c5
wireproto: catch possible cast error in pushkey
David Soria Parra <dsp@php.net>
parents:
13050
diff
changeset
|
307 d = bool(int(d)) |
b3f9af7c22c5
wireproto: catch possible cast error in pushkey
David Soria Parra <dsp@php.net>
parents:
13050
diff
changeset
|
308 except ValueError: |
b3f9af7c22c5
wireproto: catch possible cast error in pushkey
David Soria Parra <dsp@php.net>
parents:
13050
diff
changeset
|
309 raise error.ResponseError( |
b3f9af7c22c5
wireproto: catch possible cast error in pushkey
David Soria Parra <dsp@php.net>
parents:
13050
diff
changeset
|
310 _('push failed (unexpected response):'), d) |
15652
ca6accdad79c
wireproto: handle other server output in pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15585
diff
changeset
|
311 for l in output.splitlines(True): |
ca6accdad79c
wireproto: handle other server output in pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15585
diff
changeset
|
312 self.ui.status(_('remote: '), l) |
14623
e7c9fdbbb902
wireproto: make a number of commands batchable
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14622
diff
changeset
|
313 yield d |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
314 |
11588
8a1f625e971d
protocol: unify stream_out client code
Matt Mackall <mpm@selenic.com>
parents:
11587
diff
changeset
|
315 def stream_out(self): |
8a1f625e971d
protocol: unify stream_out client code
Matt Mackall <mpm@selenic.com>
parents:
11587
diff
changeset
|
316 return self._callstream('stream_out') |
8a1f625e971d
protocol: unify stream_out client code
Matt Mackall <mpm@selenic.com>
parents:
11587
diff
changeset
|
317 |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
318 def getbundle(self, source, **kwargs): |
34739
b880cc11da5d
wireproto: bounce kwargs to/from bytes/str as needed
Augie Fackler <augie@google.com>
parents:
34731
diff
changeset
|
319 kwargs = pycompat.byteskwargs(kwargs) |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
320 self.requirecap('getbundle', _('look up remote changes')) |
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
321 opts = {} |
25128
631766d1f57a
getbundle: sort bundlecaps before exchanging then over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24797
diff
changeset
|
322 bundlecaps = kwargs.get('bundlecaps') |
631766d1f57a
getbundle: sort bundlecaps before exchanging then over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24797
diff
changeset
|
323 if bundlecaps is not None: |
631766d1f57a
getbundle: sort bundlecaps before exchanging then over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24797
diff
changeset
|
324 kwargs['bundlecaps'] = sorted(bundlecaps) |
631766d1f57a
getbundle: sort bundlecaps before exchanging then over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24797
diff
changeset
|
325 else: |
631766d1f57a
getbundle: sort bundlecaps before exchanging then over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24797
diff
changeset
|
326 bundlecaps = () # kwargs could have it to None |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
327 for key, value in kwargs.iteritems(): |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
328 if value is None: |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
329 continue |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
330 keytype = gboptsmap.get(key) |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
331 if keytype is None: |
34730
6be264009841
wireproto: use a proper exception instead of `assert False`
Augie Fackler <augie@google.com>
parents:
34729
diff
changeset
|
332 raise error.ProgrammingError( |
6be264009841
wireproto: use a proper exception instead of `assert False`
Augie Fackler <augie@google.com>
parents:
34729
diff
changeset
|
333 'Unexpectedly None keytype for key %s' % key) |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
334 elif keytype == 'nodes': |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
335 value = encodelist(value) |
25403
30ab130af221
wireprotocol: distinguish list and set in getbundle argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25339
diff
changeset
|
336 elif keytype in ('csv', 'scsv'): |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
337 value = ','.join(value) |
21988
12cd3827b860
wireproto: add a ``boolean`` type for getbundle parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21728
diff
changeset
|
338 elif keytype == 'boolean': |
22351
7e6dd496d327
wireprotocol: fix 'boolean' handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22342
diff
changeset
|
339 value = '%i' % bool(value) |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
340 elif keytype != 'plain': |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
341 raise KeyError('unknown getbundle option type %s' |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
342 % keytype) |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
343 opts[key] = value |
34739
b880cc11da5d
wireproto: bounce kwargs to/from bytes/str as needed
Augie Fackler <augie@google.com>
parents:
34731
diff
changeset
|
344 f = self._callcompressable("getbundle", **pycompat.strkwargs(opts)) |
25149
3f0744eeaeaf
cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents:
25128
diff
changeset
|
345 if any((cap.startswith('HG2') for cap in bundlecaps)): |
24641
60fecc5b14a4
unbundle20: retrieve unbundler instances through a factory function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23878
diff
changeset
|
346 return bundle2.getunbundler(self.ui, f) |
21069
0a9cae236738
bundle2: allow bundle2 for pulling over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21064
diff
changeset
|
347 else: |
22390
e2806b8613ca
changegroup: rename bundle-related functions and classes
Sune Foldager <cryo@cyanite.org>
parents:
22353
diff
changeset
|
348 return changegroupmod.cg1unpacker(f, 'UN') |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
349 |
29719
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
350 def unbundle(self, cg, heads, url): |
11592
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
351 '''Send cg (a readable file-like object representing the |
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
352 changegroup to push, typically a chunkbuffer object) to the |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
353 remote server as a bundle. |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
354 |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
355 When pushing a bundle10 stream, return an integer indicating the |
32898
4c2a46f89f08
wireproto: update reference to deleted addchangegroup()
Martin von Zweigbergk <martinvonz@google.com>
parents:
32764
diff
changeset
|
356 result of the push (see changegroup.apply()). |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
357 |
29719
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
358 When pushing a bundle20 stream, return a bundle20 stream. |
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
359 |
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
360 `url` is the url the client thinks it's pushing to, which is |
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
361 visible to hooks. |
7f6130c7ffe1
wirepeer: rename confusing `source` parameter
Augie Fackler <augie@google.com>
parents:
29590
diff
changeset
|
362 ''' |
11592
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
363 |
14419
ede7cea1550f
wireproto: do not hash when heads == ['force']
Martin Geisler <mg@aragost.com>
parents:
14093
diff
changeset
|
364 if heads != ['force'] and self.capable('unbundlehash'): |
13942
88f0e41d8802
wireproto: allow unbundle with hashed heads parameter (issue2126)
Shuhei Takahashi <takahashi.shuhei@gmail.com>
parents:
13741
diff
changeset
|
365 heads = encodelist(['hashed', |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29216
diff
changeset
|
366 hashlib.sha1(''.join(sorted(heads))).digest()]) |
13942
88f0e41d8802
wireproto: allow unbundle with hashed heads parameter (issue2126)
Shuhei Takahashi <takahashi.shuhei@gmail.com>
parents:
13741
diff
changeset
|
367 else: |
88f0e41d8802
wireproto: allow unbundle with hashed heads parameter (issue2126)
Shuhei Takahashi <takahashi.shuhei@gmail.com>
parents:
13741
diff
changeset
|
368 heads = encodelist(heads) |
88f0e41d8802
wireproto: allow unbundle with hashed heads parameter (issue2126)
Shuhei Takahashi <takahashi.shuhei@gmail.com>
parents:
13741
diff
changeset
|
369 |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
370 if util.safehasattr(cg, 'deltaheader'): |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
371 # this a bundle10, do the old style call sequence |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
372 ret, output = self._callpush("unbundle", cg, heads=heads) |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
373 if ret == "": |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
374 raise error.ResponseError( |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
375 _('push failed:'), output) |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
376 try: |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
377 ret = int(ret) |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
378 except ValueError: |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
379 raise error.ResponseError( |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
380 _('push failed (unexpected response):'), ret) |
11592
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
381 |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
382 for l in output.splitlines(True): |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
383 self.ui.status(_('remote: '), l) |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
384 else: |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
385 # bundle2 push. Send a stream, fetch a stream. |
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
386 stream = self._calltwowaystream('unbundle', cg, heads=heads) |
24641
60fecc5b14a4
unbundle20: retrieve unbundler instances through a factory function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23878
diff
changeset
|
387 ret = bundle2.getunbundler(self.ui, stream) |
11592
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
388 return ret |
26e0782b8380
protocol: unify client unbundle support
Matt Mackall <mpm@selenic.com>
parents:
11591
diff
changeset
|
389 |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
390 # End of basewirepeer interface. |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
391 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
392 # Begin of baselegacywirepeer interface. |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
393 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
394 def branches(self, nodes): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
395 n = encodelist(nodes) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
396 d = self._call("branches", nodes=n) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
397 try: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
398 br = [tuple(decodelist(b)) for b in d.splitlines()] |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
399 return br |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
400 except ValueError: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
401 self._abort(error.ResponseError(_("unexpected response:"), d)) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
402 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
403 def between(self, pairs): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
404 batch = 8 # avoid giant requests |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
405 r = [] |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
406 for i in xrange(0, len(pairs), batch): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
407 n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]]) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
408 d = self._call("between", pairs=n) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
409 try: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
410 r.extend(l and decodelist(l) or [] for l in d.splitlines()) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
411 except ValueError: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
412 self._abort(error.ResponseError(_("unexpected response:"), d)) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
413 return r |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
414 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
415 def changegroup(self, nodes, kind): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
416 n = encodelist(nodes) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
417 f = self._callcompressable("changegroup", roots=n) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
418 return changegroupmod.cg1unpacker(f, 'UN') |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
419 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
420 def changegroupsubset(self, bases, heads, kind): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
421 self.requirecap('changegroupsubset', _('look up remote changes')) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
422 bases = encodelist(bases) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
423 heads = encodelist(heads) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
424 f = self._callcompressable("changegroupsubset", |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
425 bases=bases, heads=heads) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
426 return changegroupmod.cg1unpacker(f, 'UN') |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
427 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
428 # End of baselegacywirepeer interface. |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
429 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
430 def _submitbatch(self, req): |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
431 """run batch request <req> on the server |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
432 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
433 Returns an iterator of the raw responses from the server. |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
434 """ |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
435 rsp = self._callstream("batch", cmds=encodebatchcmds(req)) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
436 chunk = rsp.read(1024) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
437 work = [chunk] |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
438 while chunk: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
439 while ';' not in chunk and chunk: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
440 chunk = rsp.read(1024) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
441 work.append(chunk) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
442 merged = ''.join(work) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
443 while ';' in merged: |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
444 one, merged = merged.split(';', 1) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
445 yield unescapearg(one) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
446 chunk = rsp.read(1024) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
447 work = [merged, chunk] |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
448 yield unescapearg(''.join(work)) |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
449 |
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
450 def _submitone(self, op, args): |
34739
b880cc11da5d
wireproto: bounce kwargs to/from bytes/str as needed
Augie Fackler <augie@google.com>
parents:
34731
diff
changeset
|
451 return self._call(op, **pycompat.strkwargs(args)) |
33827
dedab036215d
wireproto: use new peer interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33788
diff
changeset
|
452 |
14048
58e58406ed19
wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13942
diff
changeset
|
453 def debugwireargs(self, one, two, three=None, four=None, five=None): |
13720
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
454 # don't pass optional arguments left at their default value |
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
455 opts = {} |
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
456 if three is not None: |
35383
7d2292416046
py3: handle keyword arguments correctly in wireproto.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35276
diff
changeset
|
457 opts[r'three'] = three |
13720
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
458 if four is not None: |
35383
7d2292416046
py3: handle keyword arguments correctly in wireproto.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35276
diff
changeset
|
459 opts[r'four'] = four |
13720
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
460 return self._call('debugwireargs', one=one, two=two, **opts) |
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
461 |
20904
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
462 def _call(self, cmd, **args): |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
463 """execute <cmd> on the server |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
464 |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
465 The command is expected to return a simple string. |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
466 |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
467 returns the server reply as a string.""" |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
468 raise NotImplementedError() |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
469 |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
470 def _callstream(self, cmd, **args): |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
471 """execute <cmd> on the server |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
472 |
28435
176736afa886
wireproto: document quirk of _callstream between http and ssh
Augie Fackler <augie@google.com>
parents:
27633
diff
changeset
|
473 The command is expected to return a stream. Note that if the |
176736afa886
wireproto: document quirk of _callstream between http and ssh
Augie Fackler <augie@google.com>
parents:
27633
diff
changeset
|
474 command doesn't return a stream, _callstream behaves |
176736afa886
wireproto: document quirk of _callstream between http and ssh
Augie Fackler <augie@google.com>
parents:
27633
diff
changeset
|
475 differently for ssh and http peers. |
20904
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
476 |
28435
176736afa886
wireproto: document quirk of _callstream between http and ssh
Augie Fackler <augie@google.com>
parents:
27633
diff
changeset
|
477 returns the server reply as a file like object. |
176736afa886
wireproto: document quirk of _callstream between http and ssh
Augie Fackler <augie@google.com>
parents:
27633
diff
changeset
|
478 """ |
20904
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
479 raise NotImplementedError() |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
480 |
20905
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
481 def _callcompressable(self, cmd, **args): |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
482 """execute <cmd> on the server |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
483 |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
484 The command is expected to return a stream. |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
485 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20969
diff
changeset
|
486 The stream may have been compressed in some implementations. This |
20905
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
487 function takes care of the decompression. This is the only difference |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
488 with _callstream. |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
489 |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
490 returns the server reply as a file like object. |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
491 """ |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
492 raise NotImplementedError() |
167047ba3cfa
wireproto: drop the _decompress method in favor a new call type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20904
diff
changeset
|
493 |
20904
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
494 def _callpush(self, cmd, fp, **args): |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
495 """execute a <cmd> on server |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
496 |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
497 The command is expected to be related to a push. Push has a special |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
498 return method. |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
499 |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
500 returns the server reply as a (ret, output) tuple. ret is either |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
501 empty (error) or a stringified int. |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
502 """ |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
503 raise NotImplementedError() |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
504 |
21072
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
505 def _calltwowaystream(self, cmd, fp, **args): |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
506 """execute <cmd> on server |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
507 |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
508 The command will send a stream to the server and get a stream in reply. |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
509 """ |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
510 raise NotImplementedError() |
0879352d67d8
wireproto: add a _calltwowaystream method on wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21069
diff
changeset
|
511 |
20904
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
512 def _abort(self, exception): |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
513 """clearly abort the wire protocol connection and raise the exception |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
514 """ |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
515 raise NotImplementedError() |
3dbe6bcd7f62
wireproto: document protocol specific function of wirepeer
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20903
diff
changeset
|
516 |
11586
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
517 # server side |
ddaaaa23bb8f
protocol: move basic ssh client commands to wirerepository
Matt Mackall <mpm@selenic.com>
parents:
11585
diff
changeset
|
518 |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
519 # wire protocol command can either return a string or one of these classes. |
11625
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
520 class streamres(object): |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
521 """wireproto reply: binary stream |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
522 |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
523 The call was successful and the result is a stream. |
30475
2add671bf55b
wireproto: perform chunking and compression at protocol layer (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30206
diff
changeset
|
524 |
35705
8cdb671dbd0b
wireproto: drop support for reader interface from streamres (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35495
diff
changeset
|
525 Accepts a generator containing chunks of data to be sent to the client. |
30475
2add671bf55b
wireproto: perform chunking and compression at protocol layer (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30206
diff
changeset
|
526 |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
527 ``prefer_uncompressed`` indicates that the data is expected to be |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
528 uncompressable and that the stream should therefore use the ``none`` |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
529 engine. |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
530 """ |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
531 def __init__(self, gen=None, prefer_uncompressed=False): |
11625
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
532 self.gen = gen |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
533 self.prefer_uncompressed = prefer_uncompressed |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
534 |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
535 class streamres_legacy(object): |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
536 """wireproto reply: uncompressed binary stream |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
537 |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
538 The call was successful and the result is a stream. |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
539 |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
540 Accepts a generator containing chunks of data to be sent to the client. |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
541 |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
542 Like ``streamres``, but sends an uncompressed data for "version 1" clients |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
543 using the application/mercurial-0.1 media type. |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
544 """ |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
545 def __init__(self, gen=None): |
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
546 self.gen = gen |
11625
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
547 |
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
548 class pushres(object): |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
549 """wireproto reply: success with simple integer return |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
550 |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
551 The call was successful and returned an integer contained in `self.res`. |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
552 """ |
11625
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
553 def __init__(self, res): |
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
554 self.res = res |
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
555 |
12703
40bb5853fc4b
wireproto: introduce pusherr() to deal with "unsynced changes" error
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12702
diff
changeset
|
556 class pusherr(object): |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
557 """wireproto reply: failure |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
558 |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
559 The call failed. The `self.res` attribute contains the error message. |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
560 """ |
12703
40bb5853fc4b
wireproto: introduce pusherr() to deal with "unsynced changes" error
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12702
diff
changeset
|
561 def __init__(self, res): |
40bb5853fc4b
wireproto: introduce pusherr() to deal with "unsynced changes" error
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12702
diff
changeset
|
562 self.res = res |
40bb5853fc4b
wireproto: introduce pusherr() to deal with "unsynced changes" error
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12702
diff
changeset
|
563 |
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
|
564 class ooberror(object): |
20902
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
565 """wireproto reply: failure of a batch of operation |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
566 |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
567 Something failed during a batch call. The error message is stored in |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
568 `self.message`. |
1e4fda2f5cf1
wireproto: document possible return type
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20775
diff
changeset
|
569 """ |
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
|
570 def __init__(self, message): |
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14970
diff
changeset
|
571 self.message = message |
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14970
diff
changeset
|
572 |
29590
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
573 def getdispatchrepo(repo, proto, command): |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
574 """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
|
575 |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
576 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
|
577 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
|
578 specialized circumstances. |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
579 """ |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
580 return repo.filtered('served') |
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
581 |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
582 def dispatch(repo, proto, command): |
29590
84c1a5942f1d
wireproto: extract repo filtering to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29341
diff
changeset
|
583 repo = getdispatchrepo(repo, proto, command) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
584 func, spec = commands[command] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
585 args = proto.getargs(spec) |
11625
cdeb861335d5
protocol: wrap non-string protocol responses in classes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11623
diff
changeset
|
586 return func(repo, proto, *args) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
587 |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
588 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
|
589 opts = {} |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
590 for k in keys: |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
591 if k in others: |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
592 opts[k] = others[k] |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
593 del others[k] |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
594 if others: |
30482
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30475
diff
changeset
|
595 util.stderr.write("warning: %s ignored unexpected arguments %s\n" |
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30475
diff
changeset
|
596 % (cmd, ",".join(others))) |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
597 return opts |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
598 |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
599 def bundle1allowed(repo, action): |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
600 """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
|
601 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
602 Priority is: |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
603 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
604 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
|
605 2. server.bundle1.<action> |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
606 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
|
607 4. server.bundle1 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
608 """ |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
609 ui = repo.ui |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
610 gd = 'generaldelta' in repo.requirements |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
611 |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
612 if gd: |
34613
5e61cd5fb0fc
configitems: register the 'server.bundle*' family of config
Boris Feld <boris.feld@octobus.net>
parents:
34329
diff
changeset
|
613 v = ui.configbool('server', 'bundle1gd.%s' % action) |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
614 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
|
615 return v |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
616 |
34613
5e61cd5fb0fc
configitems: register the 'server.bundle*' family of config
Boris Feld <boris.feld@octobus.net>
parents:
34329
diff
changeset
|
617 v = ui.configbool('server', 'bundle1.%s' % action) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
618 if v is not None: |
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
619 return v |
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
620 |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
621 if gd: |
33220
40861b2254a5
configitems: register the 'server.bundle1gd' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33219
diff
changeset
|
622 v = ui.configbool('server', 'bundle1gd') |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
623 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
|
624 return v |
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
625 |
33219
ffb1d0f541f5
configitems: register the 'server.bundle1' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32898
diff
changeset
|
626 return ui.configbool('server', 'bundle1') |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
627 |
30762
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
628 def supportedcompengines(ui, proto, role): |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
629 """Obtain the list of supported compression engines for a request.""" |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
630 assert role in (util.CLIENTROLE, util.SERVERROLE) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
631 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
632 compengines = util.compengines.supportedwireengines(role) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
633 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
634 # Allow config to override default list and ordering. |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
635 if role == util.SERVERROLE: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
636 configengines = ui.configlist('server', 'compressionengines') |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
637 config = 'server.compressionengines' |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
638 else: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
639 # This is currently implemented mainly to facilitate testing. In most |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
640 # cases, the server should be in charge of choosing a compression engine |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
641 # because a server has the most to lose from a sub-optimal choice. (e.g. |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
642 # CPU DoS due to an expensive engine or a network DoS due to poor |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
643 # compression ratio). |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
644 configengines = ui.configlist('experimental', |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
645 'clientcompressionengines') |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
646 config = 'experimental.clientcompressionengines' |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
647 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
648 # No explicit config. Filter out the ones that aren't supposed to be |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
649 # advertised and return default ordering. |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
650 if not configengines: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
651 attr = 'serverpriority' if role == util.SERVERROLE else 'clientpriority' |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
652 return [e for e in compengines |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
653 if getattr(e.wireprotosupport(), attr) > 0] |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
654 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
655 # If compression engines are listed in the config, assume there is a good |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
656 # reason for it (like server operators wanting to achieve specific |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
657 # performance characteristics). So fail fast if the config references |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
658 # unusable compression engines. |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
659 validnames = set(e.name() for e in compengines) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
660 invalidnames = set(e for e in configengines if e not in validnames) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
661 if invalidnames: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
662 raise error.Abort(_('invalid compression engine defined in %s: %s') % |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
663 (config, ', '.join(sorted(invalidnames)))) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
664 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
665 compengines = [e for e in compengines if e.name() in configengines] |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
666 compengines = sorted(compengines, |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
667 key=lambda e: configengines.index(e.name())) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
668 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
669 if not compengines: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
670 raise error.Abort(_('%s config option does not specify any known ' |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
671 'compression engines') % config, |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
672 hint=_('usable compression engines: %s') % |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
673 ', '.sorted(validnames)) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
674 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
675 return compengines |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
676 |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
677 # list of commands |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
678 commands = {} |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
679 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
680 # Maps wire protocol name to operation type. This is used for permissions |
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
681 # checking. All defined @wireiprotocommand should have an entry in this |
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
682 # dict. |
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
683 permissions = {} |
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
684 |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
685 def wireprotocommand(name, args=''): |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20969
diff
changeset
|
686 """decorator for wire protocol command""" |
20906
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
687 def register(func): |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
688 commands[name] = (func, args) |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
689 return func |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
690 return register |
7a634b34fc91
wireproto: add decorator for wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20905
diff
changeset
|
691 |
35848
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
692 # TODO define a more appropriate permissions type to use for this. |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
693 permissions['batch'] = 'pull' |
20907
aedec880e095
wireproto: use decorator for the batch command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20906
diff
changeset
|
694 @wireprotocommand('batch', 'cmds *') |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
695 def batch(repo, proto, cmds, others): |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18381
diff
changeset
|
696 repo = repo.filtered("served") |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
697 res = [] |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
698 for pair in cmds.split(';'): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
699 op, args = pair.split(' ', 1) |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
700 vals = {} |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
701 for a in args.split(','): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
702 if a: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
703 n, v = a.split('=') |
29746
62e2e048d068
wireproto: unescape argument names in batch command (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29745
diff
changeset
|
704 vals[unescapearg(n)] = unescapearg(v) |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
705 func, spec = commands[op] |
35848
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
706 |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
707 # If the protocol supports permissions checking, perform that |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
708 # checking on each batched command. |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
709 # TODO formalize permission checking as part of protocol interface. |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
710 if util.safehasattr(proto, 'checkperm'): |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
711 # Assume commands with no defined permissions are writes / for |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
712 # pushes. This is the safest from a security perspective because |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
713 # it doesn't allow commands with undefined semantics from |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
714 # bypassing permissions checks. |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
715 proto.checkperm(permissions.get(op, 'push')) |
ff4bc0ab6740
wireproto: check permissions when executing "batch" command (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35847
diff
changeset
|
716 |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
717 if spec: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
718 keys = spec.split() |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
719 data = {} |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
720 for k in keys: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
721 if k == '*': |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
722 star = {} |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
723 for key in vals.keys(): |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
724 if key not in keys: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
725 star[key] = vals[key] |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
726 data['*'] = star |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
727 else: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
728 data[k] = vals[k] |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
729 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
|
730 else: |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
731 result = func(repo, proto) |
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
|
732 if isinstance(result, ooberror): |
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14970
diff
changeset
|
733 return result |
14622
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
734 res.append(escapearg(result)) |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
735 return ';'.join(res) |
bd88561afb4b
wireproto: add batching support to wirerepository
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14621
diff
changeset
|
736 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
737 permissions['between'] = 'pull' |
20908
ae4bf69c8068
wireproto: use decorator for the between command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20907
diff
changeset
|
738 @wireprotocommand('between', 'pairs') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
739 def between(repo, proto, pairs): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
740 pairs = [decodelist(p, '-') for p in pairs.split(" ")] |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
741 r = [] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
742 for b in repo.between(pairs): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
743 r.append(encodelist(b) + "\n") |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
744 return "".join(r) |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
745 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
746 permissions['branchmap'] = 'pull' |
20909
c8b9cbf55840
wireproto: use decorator for the branchmap command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20908
diff
changeset
|
747 @wireprotocommand('branchmap') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
748 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
|
749 branchmap = repo.branchmap() |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
750 heads = [] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
751 for branch, nodes in branchmap.iteritems(): |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
752 branchname = urlreq.quote(encoding.fromlocal(branch)) |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
753 branchnodes = encodelist(nodes) |
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
754 heads.append('%s %s' % (branchname, branchnodes)) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
755 return '\n'.join(heads) |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
756 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
757 permissions['branches'] = 'pull' |
20910
acbfce12fafd
wireproto: use decorator for the branches command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20909
diff
changeset
|
758 @wireprotocommand('branches', 'nodes') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
759 def branches(repo, proto, nodes): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
760 nodes = decodelist(nodes) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
761 r = [] |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
762 for b in repo.branches(nodes): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
763 r.append(encodelist(b) + "\n") |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
764 return "".join(r) |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
765 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
766 permissions['clonebundles'] = 'pull' |
26857
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
767 @wireprotocommand('clonebundles', '') |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
768 def clonebundles(repo, proto): |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
769 """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
|
770 |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
771 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
|
772 |
e5a1df51bb25
wireproto: move clonebundles command from extension (issue4931)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26690
diff
changeset
|
773 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
|
774 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
|
775 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
|
776 """ |
31156
16d8bec0177d
clonebundle: use 'repo.vfs' instead of 'repo.opener'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31090
diff
changeset
|
777 return repo.vfs.tryread('clonebundles.manifest') |
20774
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
778 |
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
779 wireprotocaps = ['lookup', 'changegroupsubset', 'branchmap', 'pushkey', |
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
780 'known', 'getbundle', 'unbundlehash', 'batch'] |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
781 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
782 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
|
783 """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
|
784 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
785 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
|
786 computation |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
787 |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
788 - 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
|
789 - 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
|
790 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
|
791 """ |
20774
cdc3ac896997
wireproto: extract capabilities list in outside the wireproto function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20671
diff
changeset
|
792 # 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
|
793 caps = list(wireprotocaps) |
32764
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32331
diff
changeset
|
794 if streamclone.allowservergeneration(repo): |
33225
90a1b62bdc91
configitems: register the 'server.preferuncompressed' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33224
diff
changeset
|
795 if repo.ui.configbool('server', 'preferuncompressed'): |
16361
6097ede2be4d
protocol: Add the stream-preferred capability
Benoit Allard <benoit@aeteurope.nl>
parents:
15925
diff
changeset
|
796 caps.append('stream-preferred') |
12296
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
797 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
|
798 # if our local revlogs are just revlogv1, add 'stream' cap |
32331
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32300
diff
changeset
|
799 if not requiredformats - {'revlogv1'}: |
12296
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
800 caps.append('stream') |
d7fff529d85d
clone: only use stream when we understand the revlog format
Sune Foldager <cryo@cyanite.org>
parents:
12085
diff
changeset
|
801 # 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
|
802 else: |
26911
d7e5e4da8394
stream: sort stream capability before serialisation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26857
diff
changeset
|
803 caps.append('streamreqs=%s' % ','.join(sorted(requiredformats))) |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33225
diff
changeset
|
804 if repo.ui.configbool('experimental', 'bundle2-advertise'): |
35783
c97639ad6874
bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35782
diff
changeset
|
805 capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo, role='server')) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28666
diff
changeset
|
806 caps.append('bundle2=' + urlreq.quote(capsblob)) |
28666
ae53ecc47414
bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
28530
diff
changeset
|
807 caps.append('unbundle=%s' % ','.join(bundle2.bundlepriority)) |
30568
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30482
diff
changeset
|
808 |
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30482
diff
changeset
|
809 if proto.name == 'http': |
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30482
diff
changeset
|
810 caps.append('httpheader=%d' % |
33224
ab9121fda8d2
configitems: register the 'server.maxhttpheaderlen' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33223
diff
changeset
|
811 repo.ui.configint('server', 'maxhttpheaderlen')) |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33225
diff
changeset
|
812 if repo.ui.configbool('experimental', 'httppostargs'): |
30568
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30482
diff
changeset
|
813 caps.append('httppostargs') |
e118233172fe
wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30482
diff
changeset
|
814 |
30762
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
815 # FUTURE advertise 0.2rx once support is implemented |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
816 # FUTURE advertise minrx and mintx after consulting config option |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
817 caps.append('httpmediatype=0.1rx,0.1tx,0.2tx') |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
818 |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
819 compengines = supportedcompengines(repo.ui, proto, util.SERVERROLE) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
820 if compengines: |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
821 comptypes = ','.join(urlreq.quote(e.wireprotosupport().name) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
822 for e in compengines) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
823 caps.append('compression=%s' % comptypes) |
35b516f800e0
wireproto: advertise supported media types and compression formats
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30568
diff
changeset
|
824 |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
825 return caps |
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
826 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20969
diff
changeset
|
827 # 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
|
828 # `_capabilities` instead. |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
829 permissions['capabilities'] = 'pull' |
20911
1bb8ed6c000c
wireproto: use decorator for the capabilities command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20910
diff
changeset
|
830 @wireprotocommand('capabilities') |
20775
982f13bef503
wireproto: move wireproto capabilities computation in a subfunction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20774
diff
changeset
|
831 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
|
832 return ' '.join(_capabilities(repo, proto)) |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
833 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
834 permissions['changegroup'] = 'pull' |
20912
96ecb77f971d
wireproto: use decorator for the changegroup command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20911
diff
changeset
|
835 @wireprotocommand('changegroup', 'roots') |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
836 def changegroup(repo, proto, roots): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
837 nodes = decodelist(roots) |
34115
1632999d4bed
changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents:
34112
diff
changeset
|
838 outgoing = discovery.outgoing(repo, missingroots=nodes, |
1632999d4bed
changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents:
34112
diff
changeset
|
839 missingheads=repo.heads()) |
1632999d4bed
changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents:
34112
diff
changeset
|
840 cg = changegroupmod.makechangegroup(repo, outgoing, '01', 'serve') |
35705
8cdb671dbd0b
wireproto: drop support for reader interface from streamres (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35495
diff
changeset
|
841 gen = iter(lambda: cg.read(32768), '') |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
842 return streamres(gen=gen) |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
843 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
844 permissions['changegroupsubset'] = 'pull' |
20913
fc7219ec08bb
wireproto: use decorator for the changegroupsubset command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20912
diff
changeset
|
845 @wireprotocommand('changegroupsubset', 'bases heads') |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
846 def changegroupsubset(repo, proto, bases, heads): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
847 bases = decodelist(bases) |
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
848 heads = decodelist(heads) |
34112
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
34079
diff
changeset
|
849 outgoing = discovery.outgoing(repo, missingroots=bases, |
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
34079
diff
changeset
|
850 missingheads=heads) |
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
34079
diff
changeset
|
851 cg = changegroupmod.makechangegroup(repo, outgoing, '01', 'serve') |
35705
8cdb671dbd0b
wireproto: drop support for reader interface from streamres (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35495
diff
changeset
|
852 gen = iter(lambda: cg.read(32768), '') |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
853 return streamres(gen=gen) |
11584
1af96b090116
protocol: unify changegroup commands
Matt Mackall <mpm@selenic.com>
parents:
11583
diff
changeset
|
854 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
855 permissions['debugwireargs'] = 'pull' |
20914
d81b518a1862
wireproto: use decorator for the debugwireargs command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20913
diff
changeset
|
856 @wireprotocommand('debugwireargs', 'one two *') |
13721
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
857 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
|
858 # only accept optional args from the known set |
3458c15ab2f0
wireproto: fix handling of '*' args for HTTP and SSH
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
859 opts = options('debugwireargs', ['three', 'four'], others) |
35383
7d2292416046
py3: handle keyword arguments correctly in wireproto.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35276
diff
changeset
|
860 return repo.debugwireargs(one, two, **pycompat.strkwargs(opts)) |
13720
9c4e04fe267e
debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13450
diff
changeset
|
861 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
862 permissions['getbundle'] = 'pull' |
20915
6aae815f3e0d
wireproto: use decorator for the getbundle command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20914
diff
changeset
|
863 @wireprotocommand('getbundle', '*') |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
864 def getbundle(repo, proto, others): |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
865 opts = options('getbundle', gboptsmap.keys(), others) |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
866 for k, v in opts.iteritems(): |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
867 keytype = gboptsmap[k] |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
868 if keytype == 'nodes': |
19201
309c439cdbaa
bundle-ng: add bundlecaps argument to getbundle() command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
19176
diff
changeset
|
869 opts[k] = decodelist(v) |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
870 elif keytype == 'csv': |
25403
30ab130af221
wireprotocol: distinguish list and set in getbundle argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25339
diff
changeset
|
871 opts[k] = list(v.split(',')) |
30ab130af221
wireprotocol: distinguish list and set in getbundle argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25339
diff
changeset
|
872 elif keytype == 'scsv': |
19201
309c439cdbaa
bundle-ng: add bundlecaps argument to getbundle() command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
19176
diff
changeset
|
873 opts[k] = set(v.split(',')) |
21988
12cd3827b860
wireproto: add a ``boolean`` type for getbundle parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21728
diff
changeset
|
874 elif keytype == 'boolean': |
26686
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
875 # 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
|
876 # so it evaluates as a True bool. |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
877 if v == '0': |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
878 opts[k] = False |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
879 else: |
3e7f675628ad
wireproto: properly parse false boolean args (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
880 opts[k] = bool(v) |
21646
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
881 elif keytype != 'plain': |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
882 raise KeyError('unknown getbundle option type %s' |
ce25f465e572
getbundle: declare type of parameters
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21631
diff
changeset
|
883 % keytype) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
884 |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
885 if not bundle1allowed(repo, 'pull'): |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
886 if not exchange.bundle2requested(opts.get('bundlecaps')): |
30874
3d4afc2fdcd7
bundle1: fix bundle1-denied reporting for pull over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30872
diff
changeset
|
887 if proto.name == 'http': |
3d4afc2fdcd7
bundle1: fix bundle1-denied reporting for pull over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30872
diff
changeset
|
888 return ooberror(bundle2required) |
3d4afc2fdcd7
bundle1: fix bundle1-denied reporting for pull over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30872
diff
changeset
|
889 raise error.Abort(bundle2requiredmain, |
3d4afc2fdcd7
bundle1: fix bundle1-denied reporting for pull over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30872
diff
changeset
|
890 hint=bundle2requiredhint) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
891 |
35787
a84dbc87dae9
exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35785
diff
changeset
|
892 prefercompressed = True |
35782
9d249f3de730
wireproto: don't compress errors from getbundle()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35760
diff
changeset
|
893 |
30876
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
894 try: |
33223
d227451ee280
configitems: register the 'server.disablefullbundle' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33220
diff
changeset
|
895 if repo.ui.configbool('server', 'disablefullbundle'): |
32300
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
896 # Check to see if this is a full clone. |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
897 clheads = set(repo.changelog.heads()) |
35760
133a678673cb
clone: allow bundle2's stream clone with 'server.disablefullbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35759
diff
changeset
|
898 changegroup = opts.get('cg', True) |
32300
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
899 heads = set(opts.get('heads', set())) |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
900 common = set(opts.get('common', set())) |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
901 common.discard(nullid) |
35760
133a678673cb
clone: allow bundle2's stream clone with 'server.disablefullbundle'
Boris Feld <boris.feld@octobus.net>
parents:
35759
diff
changeset
|
902 if changegroup and not common and clheads == heads: |
32300
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
903 raise error.Abort( |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
904 _('server has pull-based clones disabled'), |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
905 hint=_('remove --pull if specified or upgrade Mercurial')) |
d0d9a4fca59b
clone: add a server-side option to disable full getbundles (pull-based clones)
Siddharth Agarwal <sid0@fb.com>
parents:
31460
diff
changeset
|
906 |
35785
ba15580e53d5
exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35783
diff
changeset
|
907 info, chunks = exchange.getbundlechunks(repo, 'serve', |
ba15580e53d5
exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35783
diff
changeset
|
908 **pycompat.strkwargs(opts)) |
35787
a84dbc87dae9
exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35785
diff
changeset
|
909 prefercompressed = info.get('prefercompressed', True) |
30876
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
910 except error.Abort as exc: |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
911 # cleanly forward Abort error to the client |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
912 if not exchange.bundle2requested(opts.get('bundlecaps')): |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
913 if proto.name == 'http': |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
914 return ooberror(str(exc) + '\n') |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
915 raise # cannot do better for bundle1 + ssh |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
916 # bundle2 request expect a bundle2 reply |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
917 bundler = bundle2.bundle20(repo.ui) |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
918 manargs = [('message', str(exc))] |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
919 advargs = [] |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
920 if exc.hint is not None: |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
921 advargs.append(('hint', exc.hint)) |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
922 bundler.addpart(bundle2.bundlepart('error:abort', |
f3807a135e43
wireproto: properly report server Abort during 'getbundle'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30874
diff
changeset
|
923 manargs, advargs)) |
35782
9d249f3de730
wireproto: don't compress errors from getbundle()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35760
diff
changeset
|
924 chunks = bundler.getchunks() |
35787
a84dbc87dae9
exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35785
diff
changeset
|
925 prefercompressed = False |
35782
9d249f3de730
wireproto: don't compress errors from getbundle()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35760
diff
changeset
|
926 |
35787
a84dbc87dae9
exchange: send bundle2 stream clones uncompressed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35785
diff
changeset
|
927 return streamres(gen=chunks, prefer_uncompressed=not prefercompressed) |
13741
b51bf961b3cb
wireproto: add getbundle() function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13726
diff
changeset
|
928 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
929 permissions['heads'] = 'pull' |
20916
31eacf182f80
wireproto: use decorator for the heads command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20915
diff
changeset
|
930 @wireprotocommand('heads') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
931 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
|
932 h = repo.heads() |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
933 return encodelist(h) + "\n" |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
934 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
935 permissions['hello'] = 'pull' |
20917
5ad151f8a3fa
wireproto: use decorator for the hello command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20916
diff
changeset
|
936 @wireprotocommand('hello') |
11594
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
937 def hello(repo, proto): |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
938 '''the hello command returns a set of lines describing various |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
939 interesting things about the server, in an RFC822-like format. |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
940 Currently the only one defined is "capabilities", which |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
941 consists of a line in the form: |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
942 |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
943 capabilities: space separated list of tokens |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
944 ''' |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
945 return "capabilities: %s\n" % (capabilities(repo, proto)) |
67863f9d805f
protocol: unify server-side capabilities functions
Matt Mackall <mpm@selenic.com>
parents:
11593
diff
changeset
|
946 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
947 permissions['listkeys'] = 'pull' |
20919
0bb1882c85b0
wireproto: use decorator for the listkeys command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20918
diff
changeset
|
948 @wireprotocommand('listkeys', 'namespace') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
949 def listkeys(repo, proto, namespace): |
15217
42d0d4f63bf0
wireproto: do not call pushkey module directly (issue3041)
Andreas Freimuth <andreas.freimuth@united-bits.de>
parents:
15017
diff
changeset
|
950 d = repo.listkeys(encoding.tolocal(namespace)).items() |
21651
3aae044408aa
wireproto: use pushkey.encodekey
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21646
diff
changeset
|
951 return pushkeymod.encodekeys(d) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
952 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
953 permissions['lookup'] = 'pull' |
20920
7fac25eddcea
wireproto: use decorator for the lookup command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20919
diff
changeset
|
954 @wireprotocommand('lookup', 'key') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
955 def lookup(repo, proto, key): |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
956 try: |
15925
f9fc46698352
wireproto: refuse to lookup secret csets
Matt Mackall <mpm@selenic.com>
parents:
15713
diff
changeset
|
957 k = encoding.tolocal(key) |
f9fc46698352
wireproto: refuse to lookup secret csets
Matt Mackall <mpm@selenic.com>
parents:
15713
diff
changeset
|
958 c = repo[k] |
f9fc46698352
wireproto: refuse to lookup secret csets
Matt Mackall <mpm@selenic.com>
parents:
15713
diff
changeset
|
959 r = c.hex() |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
960 success = 1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25493
diff
changeset
|
961 except Exception as inst: |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
962 r = str(inst) |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
963 success = 0 |
34731
31fdd0509de9
wireproto: use %d to encode int, not %s
Augie Fackler <augie@google.com>
parents:
34730
diff
changeset
|
964 return "%d %s\n" % (success, r) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
965 |
35847
e3c228b4510d
wireproto: declare operation type for most commands (BC) (SEC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35846
diff
changeset
|
966 permissions['known'] = 'pull' |
20918
0971939f51aa
wireproto: use decorator for the known command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20917
diff
changeset
|
967 @wireprotocommand('known', 'nodes *') |
14436
5adb52524779
wireproto: enable optional args for known() for future extensibility
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14419
diff
changeset
|
968 def known(repo, proto, nodes, others): |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
969 return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes))) |
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13722
diff
changeset
|
970 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
971 permissions['pushkey'] = 'push' |
20921
70ed3174ce69
wireproto: use decorator for the pushkey command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20920
diff
changeset
|
972 @wireprotocommand('pushkey', 'namespace key old new') |
11583
944c23762c3c
protocol: add proto to method prototypes
Matt Mackall <mpm@selenic.com>
parents:
11581
diff
changeset
|
973 def pushkey(repo, proto, namespace, key, old, new): |
13050 | 974 # compatibility with pre-1.8 clients which were accidentally |
975 # sending raw binary nodes rather than utf-8-encoded hex | |
31460
53865692a354
util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31156
diff
changeset
|
976 if len(new) == 20 and util.escapestr(new) != new: |
13050 | 977 # looks like it could be a binary node |
978 try: | |
14064
e4bfb9c337f3
remove unused imports and variables
Alexander Solovyov <alexander@solovyov.net>
parents:
14048
diff
changeset
|
979 new.decode('utf-8') |
13050 | 980 new = encoding.tolocal(new) # but cleanly decodes as UTF-8 |
981 except UnicodeDecodeError: | |
982 pass # binary, leave unmodified | |
983 else: | |
984 new = encoding.tolocal(new) # normal path | |
985 | |
17793
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
986 if util.safehasattr(proto, 'restore'): |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
987 |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
988 proto.redirect() |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
989 |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
990 try: |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
991 r = repo.pushkey(encoding.tolocal(namespace), encoding.tolocal(key), |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
992 encoding.tolocal(old), new) or False |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26469
diff
changeset
|
993 except error.Abort: |
17793
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
994 r = False |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
995 |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
996 output = proto.restore() |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
997 |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
998 return '%s\n%s' % (int(r), output) |
8474be4412ca
wireproto: fix pushkey hook failure and output on remote http repo
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
17603
diff
changeset
|
999 |
15217
42d0d4f63bf0
wireproto: do not call pushkey module directly (issue3041)
Andreas Freimuth <andreas.freimuth@united-bits.de>
parents:
15017
diff
changeset
|
1000 r = repo.pushkey(encoding.tolocal(namespace), encoding.tolocal(key), |
42d0d4f63bf0
wireproto: do not call pushkey module directly (issue3041)
Andreas Freimuth <andreas.freimuth@united-bits.de>
parents:
15017
diff
changeset
|
1001 encoding.tolocal(old), new) |
11581
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1002 return '%s\n' % int(r) |
4530b3307fb9
protocol: introduce wireproto.py
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1003 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
1004 permissions['stream_out'] = 'pull' |
20922
588e24f3eea3
wireproto: use decorator for the stream command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20921
diff
changeset
|
1005 @wireprotocommand('stream_out') |
11585
5d907fbb9703
protocol: unify stream_out command
Matt Mackall <mpm@selenic.com>
parents:
11584
diff
changeset
|
1006 def stream(repo, proto): |
11627
04f76a954842
protocol: move the streamclone implementation into wireproto
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11625
diff
changeset
|
1007 '''If the server supports streaming clone, it advertises the "stream" |
04f76a954842
protocol: move the streamclone implementation into wireproto
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11625
diff
changeset
|
1008 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
|
1009 it is serving. Client checks to see if it understands the format. |
04f76a954842
protocol: move the streamclone implementation into wireproto
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11625
diff
changeset
|
1010 ''' |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
1011 return streamres_legacy(streamclone.generatev1wireproto(repo)) |
11585
5d907fbb9703
protocol: unify stream_out command
Matt Mackall <mpm@selenic.com>
parents:
11584
diff
changeset
|
1012 |
35846
742ce6fbc109
wireproto: move command permissions dict out of hgweb_mod
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35787
diff
changeset
|
1013 permissions['unbundle'] = 'push' |
20923
d771641b7051
wireproto: use decorator for the ubundle command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20922
diff
changeset
|
1014 @wireprotocommand('unbundle', 'heads') |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
1015 def unbundle(repo, proto, heads): |
11597
9141d2c9e5a5
wireproto: refactor list of nodeid encoding / decoding
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11594
diff
changeset
|
1016 their_heads = decodelist(heads) |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
1017 |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1018 try: |
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1019 proto.redirect() |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
1020 |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1021 exchange.check_heads(repo, their_heads, 'preparing changes') |
12702
f747c085b789
wireproto: redirect the output earlier
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
12701
diff
changeset
|
1022 |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1023 # write bundle data to temporary file because it can be big |
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1024 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') |
30944
48dea083f66d
py3: convert the mode argument of os.fdopen to unicodes (1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30876
diff
changeset
|
1025 fp = os.fdopen(fd, pycompat.sysstr('wb+')) |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1026 r = 0 |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
1027 try: |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1028 proto.getfile(fp) |
20968
33d5fdd9bd99
unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20967
diff
changeset
|
1029 fp.seek(0) |
21064
4d9d490d7bbe
bundle2: add a ui argument to readbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21063
diff
changeset
|
1030 gen = exchange.readbundle(repo.ui, fp, None) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
1031 if (isinstance(gen, changegroupmod.cg1unpacker) |
27633
37d7cf569cf3
wireproto: support disabling bundle1 only if repo is generaldelta
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27246
diff
changeset
|
1032 and not bundle1allowed(repo, 'push')): |
30871
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1033 if proto.name == 'http': |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1034 # need to special case http because stderr do not get to |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1035 # the http client on failed push so we need to abuse some |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1036 # other error type to make sure the message get to the |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1037 # user. |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1038 return ooberror(bundle2required) |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1039 raise error.Abort(bundle2requiredmain, |
d554e624c5fe
bundle1: fix bundle1-denied reporting for push over ssh
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30762
diff
changeset
|
1040 hint=bundle2requiredhint) |
27246
b288fb2724bf
wireproto: config options to disable bundle1
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27243
diff
changeset
|
1041 |
20968
33d5fdd9bd99
unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20967
diff
changeset
|
1042 r = exchange.unbundle(repo, gen, their_heads, 'serve', |
33d5fdd9bd99
unbundle: extract the core logic in another function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20967
diff
changeset
|
1043 proto._client()) |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
1044 if util.safehasattr(r, 'addpart'): |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23009
diff
changeset
|
1045 # The return looks streamable, we are in the bundle2 case and |
21075
438803e4bd97
bundle2: support for push over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21072
diff
changeset
|
1046 # should return a stream. |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
1047 return streamres_legacy(gen=r.getchunks()) |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1048 return pushres(r) |
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1049 |
11593
d054cc5c7737
protocol: unify unbundle on the server side
Matt Mackall <mpm@selenic.com>
parents:
11592
diff
changeset
|
1050 finally: |
20967
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1051 fp.close() |
984850270acb
unbundle: extract checkheads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
1052 os.unlink(tempname) |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1053 |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26469
diff
changeset
|
1054 except (error.BundleValueError, error.Abort, error.PushRaced) as exc: |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1055 # handle non-bundle2 case first |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1056 if not getattr(exc, 'duringunbundle2', False): |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1057 try: |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1058 raise |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26469
diff
changeset
|
1059 except error.Abort: |
30482
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30475
diff
changeset
|
1060 # The old code we moved used util.stderr directly. |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1061 # We did not change it to minimise code change. |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1062 # This need to be moved to something proper. |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1063 # Feel free to do it. |
30482
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30475
diff
changeset
|
1064 util.stderr.write("abort: %s\n" % exc) |
30872
accaa04f951c
bundle1: display server abort hint during unbundle
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30871
diff
changeset
|
1065 if exc.hint is not None: |
accaa04f951c
bundle1: display server abort hint during unbundle
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30871
diff
changeset
|
1066 util.stderr.write("(%s)\n" % exc.hint) |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1067 return pushres(0) |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1068 except error.PushRaced: |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1069 return pusherr(str(exc)) |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1070 |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1071 bundler = bundle2.bundle20(repo.ui) |
24797
0c4d5e01b31f
bundle2-wireproto: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24796
diff
changeset
|
1072 for out in getattr(exc, '_bundle2salvagedoutput', ()): |
0c4d5e01b31f
bundle2-wireproto: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24796
diff
changeset
|
1073 bundler.addpart(out) |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1074 try: |
25493
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1075 try: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1076 raise |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25493
diff
changeset
|
1077 except error.PushkeyFailed as exc: |
25493
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1078 # check client caps |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1079 remotecaps = getattr(exc, '_replycaps', None) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1080 if (remotecaps is not None |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1081 and 'pushkey' not in remotecaps.get('error', ())): |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1082 # no support remote side, fallback to Abort handler. |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1083 raise |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1084 part = bundler.newpart('error:pushkey') |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1085 part.addparam('in-reply-to', exc.partid) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1086 if exc.namespace is not None: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1087 part.addparam('namespace', exc.namespace, mandatory=False) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1088 if exc.key is not None: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1089 part.addparam('key', exc.key, mandatory=False) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1090 if exc.new is not None: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1091 part.addparam('new', exc.new, mandatory=False) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1092 if exc.old is not None: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1093 part.addparam('old', exc.old, mandatory=False) |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1094 if exc.ret is not None: |
d8e7b0781ad7
bundle2: convey PushkeyFailed error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25403
diff
changeset
|
1095 part.addparam('ret', exc.ret, mandatory=False) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25493
diff
changeset
|
1096 except error.BundleValueError as exc: |
24686
e0e28e910fa3
bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24649
diff
changeset
|
1097 errpart = bundler.newpart('error:unsupportedcontent') |
21627
3e8bcc90f07c
bundle2: support None parttype in BundleValueError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21622
diff
changeset
|
1098 if exc.parttype is not None: |
3e8bcc90f07c
bundle2: support None parttype in BundleValueError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21622
diff
changeset
|
1099 errpart.addparam('parttype', exc.parttype) |
21622
457492741007
bundle2: support transmission of params error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21620
diff
changeset
|
1100 if exc.params: |
457492741007
bundle2: support transmission of params error over the wire
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21620
diff
changeset
|
1101 errpart.addparam('params', '\0'.join(exc.params)) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26469
diff
changeset
|
1102 except error.Abort as exc: |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1103 manargs = [('message', str(exc))] |
21177
952af771bc17
bundle2: gracefully handle abort during unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21157
diff
changeset
|
1104 advargs = [] |
24796
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1105 if exc.hint is not None: |
61ff209fc01d
bundle2: refactor error bundle creation for the wireprotocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24696
diff
changeset
|
1106 advargs.append(('hint', exc.hint)) |
24686
e0e28e910fa3
bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24649
diff
changeset
|
1107 bundler.addpart(bundle2.bundlepart('error:abort', |
21177
952af771bc17
bundle2: gracefully handle abort during unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21157
diff
changeset
|
1108 manargs, advargs)) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25493
diff
changeset
|
1109 except error.PushRaced as exc: |
24686
e0e28e910fa3
bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24649
diff
changeset
|
1110 bundler.newpart('error:pushraced', [('message', str(exc))]) |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35705
diff
changeset
|
1111 return streamres_legacy(gen=bundler.getchunks()) |