comparison tests/test-wireproto-command-changesetdata.t @ 39630:9c2c77c73f23

wireprotov2: define and implement "changesetdata" command This commit introduces the "changesetdata" wire protocol command. The role of the command is to expose data associated with changelog revisions, including the raw revision data itself. This command is the first piece of a new clone/pull strategy that is built on top of domain-specific commands for data retrieval. Instead of a monolithic "getbundle" command that transfers all of the things, we'll be introducing commands for fetching specific pieces of data. Since the changeset is the fundamental unit from which we derive pointers to other data (manifests, file nodes, etc), it makes sense to start reimplementing pull with this data. The command accepts as arguments a set of root and head revisions defining the changesets that should be fetched as well as an explicit list of nodes. By default, the command returns only the node values: the client must explicitly request additional fields be added to the response. Current supported fields are the list of parent nodes and the revision fulltext. My plan is to eventually add support for transferring other data associated with changesets, including phases, bookmarks, obsolescence markers, etc. Since the response format is CBOR, we'll be able to add this data into the response object relatively easily (it should be as simple as adding a key in a map). The documentation captures a number of TODO items. Some of these may require BC breaking changes. That's fine: wire protocol v2 is still highly experimental. Differential Revision: https://phab.mercurial-scm.org/D4481
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 12 Sep 2018 10:01:16 -0700
parents
children c1aacb0d76ff
comparison
equal deleted inserted replaced
39629:a86d21e70b2b 39630:9c2c77c73f23
1 $ . $TESTDIR/wireprotohelpers.sh
2
3 $ hg init server
4 $ enablehttpv2 server
5 $ cd server
6 $ echo a0 > a
7 $ echo b0 > b
8
9 $ hg -q commit -A -m 'commit 0'
10
11 $ echo a1 > a
12 $ echo b1 > b
13 $ hg commit -m 'commit 1'
14 $ echo b2 > b
15 $ hg commit -m 'commit 2'
16
17 $ hg -q up -r 0
18 $ echo a2 > a
19 $ hg commit -m 'commit 3'
20 created new head
21
22 $ hg log -G -T '{rev}:{node} {desc}\n'
23 @ 3:eae5f82c2e622368d27daecb76b7e393d0f24211 commit 3
24 |
25 | o 2:0bb8ad894a15b15380b2a2a5b183e20f2a4b28dd commit 2
26 | |
27 | o 1:7592917e1c3e82677cb0a4bc715ca25dd12d28c1 commit 1
28 |/
29 o 0:3390ef850073fbc2f0dfff2244342c8e9229013a commit 0
30
31
32 $ hg serve -p $HGPORT -d --pid-file hg.pid -E error.log
33 $ cat hg.pid > $DAEMON_PIDS
34
35 No arguments is an invalid request
36
37 $ sendhttpv2peer << EOF
38 > command changesetdata
39 > EOF
40 creating http peer for wire protocol version 2
41 sending changesetdata command
42 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
43 s> Accept-Encoding: identity\r\n
44 s> accept: application/mercurial-exp-framing-0005\r\n
45 s> content-type: application/mercurial-exp-framing-0005\r\n
46 s> content-length: 28\r\n
47 s> host: $LOCALIP:$HGPORT\r\n (glob)
48 s> user-agent: Mercurial debugwireproto\r\n
49 s> \r\n
50 s> \x14\x00\x00\x01\x00\x01\x01\x11\xa1DnameMchangesetdata
51 s> makefile('rb', None)
52 s> HTTP/1.1 200 OK\r\n
53 s> Server: testing stub value\r\n
54 s> Date: $HTTP_DATE$\r\n
55 s> Content-Type: application/mercurial-exp-framing-0005\r\n
56 s> Transfer-Encoding: chunked\r\n
57 s> \r\n
58 s> 49\r\n
59 s> A\x00\x00\x01\x00\x02\x012
60 s> \xa2Eerror\xa1GmessageX"noderange or nodes must be definedFstatusEerror
61 s> \r\n
62 received frame(size=65; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=eos)
63 s> 0\r\n
64 s> \r\n
65 abort: noderange or nodes must be defined!
66 [255]
67
68 Empty noderange heads results in an error
69
70 $ sendhttpv2peer << EOF
71 > command changesetdata
72 > noderange eval:[[],[]]
73 > EOF
74 creating http peer for wire protocol version 2
75 sending changesetdata command
76 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
77 s> Accept-Encoding: identity\r\n
78 s> accept: application/mercurial-exp-framing-0005\r\n
79 s> content-type: application/mercurial-exp-framing-0005\r\n
80 s> content-length: 47\r\n
81 s> host: $LOCALIP:$HGPORT\r\n (glob)
82 s> user-agent: Mercurial debugwireproto\r\n
83 s> \r\n
84 s> \'\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Inoderange\x82\x80\x80DnameMchangesetdata
85 s> makefile('rb', None)
86 s> HTTP/1.1 200 OK\r\n
87 s> Server: testing stub value\r\n
88 s> Date: $HTTP_DATE$\r\n
89 s> Content-Type: application/mercurial-exp-framing-0005\r\n
90 s> Transfer-Encoding: chunked\r\n
91 s> \r\n
92 s> 51\r\n
93 s> I\x00\x00\x01\x00\x02\x012
94 s> \xa2Eerror\xa1GmessageX*heads in noderange request cannot be emptyFstatusEerror
95 s> \r\n
96 received frame(size=73; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=eos)
97 s> 0\r\n
98 s> \r\n
99 abort: heads in noderange request cannot be empty!
100 [255]
101
102 Sending just noderange heads sends all revisions
103
104 $ sendhttpv2peer << EOF
105 > command changesetdata
106 > noderange eval:[[], [b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd', b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']]
107 > EOF
108 creating http peer for wire protocol version 2
109 sending changesetdata command
110 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
111 s> Accept-Encoding: identity\r\n
112 s> accept: application/mercurial-exp-framing-0005\r\n
113 s> content-type: application/mercurial-exp-framing-0005\r\n
114 s> content-length: 89\r\n
115 s> host: $LOCALIP:$HGPORT\r\n (glob)
116 s> user-agent: Mercurial debugwireproto\r\n
117 s> \r\n
118 s> Q\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Inoderange\x82\x80\x82T\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xddT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11DnameMchangesetdata
119 s> makefile('rb', None)
120 s> HTTP/1.1 200 OK\r\n
121 s> Server: testing stub value\r\n
122 s> Date: $HTTP_DATE$\r\n
123 s> Content-Type: application/mercurial-exp-framing-0005\r\n
124 s> Transfer-Encoding: chunked\r\n
125 s> \r\n
126 s> 13\r\n
127 s> \x0b\x00\x00\x01\x00\x02\x011
128 s> \xa1FstatusBok
129 s> \r\n
130 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
131 s> 81\r\n
132 s> y\x00\x00\x01\x00\x02\x001
133 s> \xa1Jtotalitems\x04\xa1DnodeT3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:\xa1DnodeTu\x92\x91~\x1c>\x82g|\xb0\xa4\xbcq\\\xa2]\xd1-(\xc1\xa1DnodeT\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd\xa1DnodeT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11
134 s> \r\n
135 received frame(size=121; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
136 s> 8\r\n
137 s> \x00\x00\x00\x01\x00\x02\x002
138 s> \r\n
139 s> 0\r\n
140 s> \r\n
141 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
142 response: gen[
143 {
144 b'totalitems': 4
145 },
146 {
147 b'node': b'3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:'
148 },
149 {
150 b'node': b'u\x92\x91~\x1c>\x82g|\xb0\xa4\xbcq\\\xa2]\xd1-(\xc1'
151 },
152 {
153 b'node': b'\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd'
154 },
155 {
156 b'node': b'\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11'
157 }
158 ]
159
160 Sending root nodes limits what data is sent
161
162 $ sendhttpv2peer << EOF
163 > command changesetdata
164 > noderange eval:[[b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a'], [b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd']]
165 > EOF
166 creating http peer for wire protocol version 2
167 sending changesetdata command
168 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
169 s> Accept-Encoding: identity\r\n
170 s> accept: application/mercurial-exp-framing-0005\r\n
171 s> content-type: application/mercurial-exp-framing-0005\r\n
172 s> content-length: 89\r\n
173 s> host: $LOCALIP:$HGPORT\r\n (glob)
174 s> user-agent: Mercurial debugwireproto\r\n
175 s> \r\n
176 s> Q\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Inoderange\x82\x81T3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:\x81T\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xddDnameMchangesetdata
177 s> makefile('rb', None)
178 s> HTTP/1.1 200 OK\r\n
179 s> Server: testing stub value\r\n
180 s> Date: $HTTP_DATE$\r\n
181 s> Content-Type: application/mercurial-exp-framing-0005\r\n
182 s> Transfer-Encoding: chunked\r\n
183 s> \r\n
184 s> 13\r\n
185 s> \x0b\x00\x00\x01\x00\x02\x011
186 s> \xa1FstatusBok
187 s> \r\n
188 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
189 s> 4b\r\n
190 s> C\x00\x00\x01\x00\x02\x001
191 s> \xa1Jtotalitems\x02\xa1DnodeTu\x92\x91~\x1c>\x82g|\xb0\xa4\xbcq\\\xa2]\xd1-(\xc1\xa1DnodeT\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd
192 s> \r\n
193 received frame(size=67; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
194 s> 8\r\n
195 s> \x00\x00\x00\x01\x00\x02\x002
196 s> \r\n
197 s> 0\r\n
198 s> \r\n
199 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
200 response: gen[
201 {
202 b'totalitems': 2
203 },
204 {
205 b'node': b'u\x92\x91~\x1c>\x82g|\xb0\xa4\xbcq\\\xa2]\xd1-(\xc1'
206 },
207 {
208 b'node': b'\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd'
209 }
210 ]
211
212 Requesting data on a single node by node works
213
214 $ sendhttpv2peer << EOF
215 > command changesetdata
216 > nodes eval:[b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a']
217 > EOF
218 creating http peer for wire protocol version 2
219 sending changesetdata command
220 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
221 s> Accept-Encoding: identity\r\n
222 s> accept: application/mercurial-exp-framing-0005\r\n
223 s> content-type: application/mercurial-exp-framing-0005\r\n
224 s> content-length: 62\r\n
225 s> host: $LOCALIP:$HGPORT\r\n (glob)
226 s> user-agent: Mercurial debugwireproto\r\n
227 s> \r\n
228 s> 6\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Enodes\x81T3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:DnameMchangesetdata
229 s> makefile('rb', None)
230 s> HTTP/1.1 200 OK\r\n
231 s> Server: testing stub value\r\n
232 s> Date: $HTTP_DATE$\r\n
233 s> Content-Type: application/mercurial-exp-framing-0005\r\n
234 s> Transfer-Encoding: chunked\r\n
235 s> \r\n
236 s> 13\r\n
237 s> \x0b\x00\x00\x01\x00\x02\x011
238 s> \xa1FstatusBok
239 s> \r\n
240 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
241 s> 30\r\n
242 s> (\x00\x00\x01\x00\x02\x001
243 s> \xa1Jtotalitems\x01\xa1DnodeT3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:
244 s> \r\n
245 received frame(size=40; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
246 s> 8\r\n
247 s> \x00\x00\x00\x01\x00\x02\x002
248 s> \r\n
249 s> 0\r\n
250 s> \r\n
251 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
252 response: gen[
253 {
254 b'totalitems': 1
255 },
256 {
257 b'node': b'3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:'
258 }
259 ]
260
261 Specifying a noderange and nodes takes union
262
263 $ sendhttpv2peer << EOF
264 > command changesetdata
265 > noderange eval:[[b'\x75\x92\x91\x7e\x1c\x3e\x82\x67\x7c\xb0\xa4\xbc\x71\x5c\xa2\x5d\xd1\x2d\x28\xc1'], [b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd']]
266 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']
267 > EOF
268 creating http peer for wire protocol version 2
269 sending changesetdata command
270 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
271 s> Accept-Encoding: identity\r\n
272 s> accept: application/mercurial-exp-framing-0005\r\n
273 s> content-type: application/mercurial-exp-framing-0005\r\n
274 s> content-length: 117\r\n
275 s> host: $LOCALIP:$HGPORT\r\n (glob)
276 s> user-agent: Mercurial debugwireproto\r\n
277 s> \r\n
278 s> m\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2Inoderange\x82\x81Tu\x92\x91~\x1c>\x82g|\xb0\xa4\xbcq\\\xa2]\xd1-(\xc1\x81T\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xddEnodes\x81T\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11DnameMchangesetdata
279 s> makefile('rb', None)
280 s> HTTP/1.1 200 OK\r\n
281 s> Server: testing stub value\r\n
282 s> Date: $HTTP_DATE$\r\n
283 s> Content-Type: application/mercurial-exp-framing-0005\r\n
284 s> Transfer-Encoding: chunked\r\n
285 s> \r\n
286 s> 13\r\n
287 s> \x0b\x00\x00\x01\x00\x02\x011
288 s> \xa1FstatusBok
289 s> \r\n
290 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
291 s> 4b\r\n
292 s> C\x00\x00\x01\x00\x02\x001
293 s> \xa1Jtotalitems\x02\xa1DnodeT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11\xa1DnodeT\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd
294 s> \r\n
295 received frame(size=67; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
296 s> 8\r\n
297 s> \x00\x00\x00\x01\x00\x02\x002
298 s> \r\n
299 s> 0\r\n
300 s> \r\n
301 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
302 response: gen[
303 {
304 b'totalitems': 2
305 },
306 {
307 b'node': b'\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11'
308 },
309 {
310 b'node': b'\x0b\xb8\xad\x89J\x15\xb1S\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f*K(\xdd'
311 }
312 ]
313
314 Parents data is transferred upon request
315
316 $ sendhttpv2peer << EOF
317 > command changesetdata
318 > fields eval:[b'parents']
319 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']
320 > EOF
321 creating http peer for wire protocol version 2
322 sending changesetdata command
323 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
324 s> Accept-Encoding: identity\r\n
325 s> accept: application/mercurial-exp-framing-0005\r\n
326 s> content-type: application/mercurial-exp-framing-0005\r\n
327 s> content-length: 78\r\n
328 s> host: $LOCALIP:$HGPORT\r\n (glob)
329 s> user-agent: Mercurial debugwireproto\r\n
330 s> \r\n
331 s> F\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2Ffields\x81GparentsEnodes\x81T\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11DnameMchangesetdata
332 s> makefile('rb', None)
333 s> HTTP/1.1 200 OK\r\n
334 s> Server: testing stub value\r\n
335 s> Date: $HTTP_DATE$\r\n
336 s> Content-Type: application/mercurial-exp-framing-0005\r\n
337 s> Transfer-Encoding: chunked\r\n
338 s> \r\n
339 s> 13\r\n
340 s> \x0b\x00\x00\x01\x00\x02\x011
341 s> \xa1FstatusBok
342 s> \r\n
343 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
344 s> 63\r\n
345 s> [\x00\x00\x01\x00\x02\x001
346 s> \xa1Jtotalitems\x01\xa2DnodeT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11Gparents\x82T3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
347 s> \r\n
348 received frame(size=91; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
349 s> 8\r\n
350 s> \x00\x00\x00\x01\x00\x02\x002
351 s> \r\n
352 s> 0\r\n
353 s> \r\n
354 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
355 response: gen[
356 {
357 b'totalitems': 1
358 },
359 {
360 b'node': b'\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11',
361 b'parents': [
362 b'3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:',
363 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
364 ]
365 }
366 ]
367
368 Revision data is transferred upon request
369
370 $ sendhttpv2peer << EOF
371 > command changesetdata
372 > fields eval:[b'revision']
373 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']
374 > EOF
375 creating http peer for wire protocol version 2
376 sending changesetdata command
377 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
378 s> Accept-Encoding: identity\r\n
379 s> accept: application/mercurial-exp-framing-0005\r\n
380 s> content-type: application/mercurial-exp-framing-0005\r\n
381 s> content-length: 79\r\n
382 s> host: $LOCALIP:$HGPORT\r\n (glob)
383 s> user-agent: Mercurial debugwireproto\r\n
384 s> \r\n
385 s> G\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2Ffields\x81HrevisionEnodes\x81T\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11DnameMchangesetdata
386 s> makefile('rb', None)
387 s> HTTP/1.1 200 OK\r\n
388 s> Server: testing stub value\r\n
389 s> Date: $HTTP_DATE$\r\n
390 s> Content-Type: application/mercurial-exp-framing-0005\r\n
391 s> Transfer-Encoding: chunked\r\n
392 s> \r\n
393 s> 13\r\n
394 s> \x0b\x00\x00\x01\x00\x02\x011
395 s> \xa1FstatusBok
396 s> \r\n
397 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
398 s> 7e\r\n
399 s> v\x00\x00\x01\x00\x02\x001
400 s> \xa1Jtotalitems\x01\xa2DnodeT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11Lrevisionsize\x18=X=1b74476799ec8318045db759b1b4bcc9b839d0aa\n
401 s> test\n
402 s> 0 0\n
403 s> a\n
404 s> \n
405 s> commit 3
406 s> \r\n
407 received frame(size=118; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
408 s> 8\r\n
409 s> \x00\x00\x00\x01\x00\x02\x002
410 s> \r\n
411 s> 0\r\n
412 s> \r\n
413 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
414 response: gen[
415 {
416 b'totalitems': 1
417 },
418 {
419 b'node': b'\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11',
420 b'revisionsize': 61
421 },
422 b'1b74476799ec8318045db759b1b4bcc9b839d0aa\ntest\n0 0\na\n\ncommit 3'
423 ]
424
425 Multiple fields can be transferred
426
427 $ sendhttpv2peer << EOF
428 > command changesetdata
429 > fields eval:[b'parents', b'revision']
430 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']
431 > EOF
432 creating http peer for wire protocol version 2
433 sending changesetdata command
434 s> POST /api/exp-http-v2-0001/ro/changesetdata HTTP/1.1\r\n
435 s> Accept-Encoding: identity\r\n
436 s> accept: application/mercurial-exp-framing-0005\r\n
437 s> content-type: application/mercurial-exp-framing-0005\r\n
438 s> content-length: 87\r\n
439 s> host: $LOCALIP:$HGPORT\r\n (glob)
440 s> user-agent: Mercurial debugwireproto\r\n
441 s> \r\n
442 s> O\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2Ffields\x82GparentsHrevisionEnodes\x81T\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11DnameMchangesetdata
443 s> makefile('rb', None)
444 s> HTTP/1.1 200 OK\r\n
445 s> Server: testing stub value\r\n
446 s> Date: $HTTP_DATE$\r\n
447 s> Content-Type: application/mercurial-exp-framing-0005\r\n
448 s> Transfer-Encoding: chunked\r\n
449 s> \r\n
450 s> 13\r\n
451 s> \x0b\x00\x00\x01\x00\x02\x011
452 s> \xa1FstatusBok
453 s> \r\n
454 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
455 s> b1\r\n
456 s> \xa9\x00\x00\x01\x00\x02\x001
457 s> \xa1Jtotalitems\x01\xa3DnodeT\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11Gparents\x82T3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Lrevisionsize\x18=X=1b74476799ec8318045db759b1b4bcc9b839d0aa\n
458 s> test\n
459 s> 0 0\n
460 s> a\n
461 s> \n
462 s> commit 3
463 s> \r\n
464 received frame(size=169; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
465 s> 8\r\n
466 s> \x00\x00\x00\x01\x00\x02\x002
467 s> \r\n
468 s> 0\r\n
469 s> \r\n
470 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
471 response: gen[
472 {
473 b'totalitems': 1
474 },
475 {
476 b'node': b'\xea\xe5\xf8,.b#h\xd2}\xae\xcbv\xb7\xe3\x93\xd0\xf2B\x11',
477 b'parents': [
478 b'3\x90\xef\x85\x00s\xfb\xc2\xf0\xdf\xff"D4,\x8e\x92)\x01:',
479 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
480 ],
481 b'revisionsize': 61
482 },
483 b'1b74476799ec8318045db759b1b4bcc9b839d0aa\ntest\n0 0\na\n\ncommit 3'
484 ]
485
486 $ cat error.log