##// END OF EJS Templates
wireprotov2: define and implement "changesetdata" command...
Gregory Szorc -
r39921:9c2c77c7 default
parent child Browse files
Show More
@@ -0,0 +1,486 b''
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
@@ -1508,7 +1508,7 b' def pull(repo, remote, heads=None, force'
1508 pullop.trmanager = transactionmanager(repo, 'pull', remote.url())
1508 pullop.trmanager = transactionmanager(repo, 'pull', remote.url())
1509 with repo.wlock(), repo.lock(), pullop.trmanager:
1509 with repo.wlock(), repo.lock(), pullop.trmanager:
1510 # Use the modern wire protocol, if available.
1510 # Use the modern wire protocol, if available.
1511 if remote.capable('exchangev2'):
1511 if remote.capable('command-changesetdata'):
1512 exchangev2.pull(pullop)
1512 exchangev2.pull(pullop)
1513 else:
1513 else:
1514 # This should ideally be in _pullbundle2(). However, it needs to run
1514 # This should ideally be in _pullbundle2(). However, it needs to run
@@ -87,6 +87,90 b' rawrepoformats'
87 requirements can be used to determine whether a client can read a
87 requirements can be used to determine whether a client can read a
88 *raw* copy of file data available.
88 *raw* copy of file data available.
89
89
90 changesetdata
91 -------------
92
93 Obtain various data related to changesets.
94
95 The command accepts the following arguments:
96
97 noderange
98 (array of arrays of bytestrings) An array of 2 elements, each being an
99 array of node bytestrings. The first array denotes the changelog revisions
100 that are already known to the client. The second array denotes the changelog
101 revision DAG heads to fetch. The argument essentially defines a DAG range
102 bounded by root and head nodes to fetch.
103
104 The roots array may be empty. The heads array must be defined.
105
106 nodes
107 (array of bytestrings) Changelog revisions to request explicitly.
108
109 fields
110 (set of bytestring) Which data associated with changelog revisions to
111 fetch. The following values are recognized:
112
113 parents
114 Parent revisions.
115
116 revision
117 The raw, revision data for the changelog entry. The hash of this data
118 will match the revision's node value.
119
120 The server resolves the set of revisions relevant to the request by taking
121 the union of the ``noderange`` and ``nodes`` arguments. At least one of these
122 arguments must be defined.
123
124 The response bytestream starts with a CBOR map describing the data that follows.
125 This map has the following bytestring keys:
126
127 totalitems
128 (unsigned integer) Total number of changelog revisions whose data is being
129 transferred.
130
131 Following the map header is a series of 0 or more CBOR values. If values
132 are present, the first value will always be a map describing a single changeset
133 revision. If revision data is requested, the raw revision data (encoded as
134 a CBOR bytestring) will follow the map describing it. Otherwise, another CBOR
135 map describing the next changeset revision will occur.
136
137 Each map has the following bytestring keys:
138
139 node
140 (bytestring) The node value for this revision. This is the SHA-1 hash of
141 the raw revision data.
142
143 parents (optional)
144 (array of bytestrings) The nodes representing the parent revisions of this
145 revision. Only present if ``parents`` data is being requested.
146
147 revisionsize (optional)
148 (unsigned integer) Indicates the size of raw revision data that follows this
149 map. The following data contains a serialized form of the changeset data,
150 including the author, date, commit message, set of changed files, manifest
151 node, and other metadata.
152
153 Only present if ``revision`` data was requested and the data follows this
154 map.
155
156 If nodes are requested via ``noderange``, they will be emitted in DAG order,
157 parents always before children.
158
159 If nodes are requested via ``nodes``, they will be emitted in requested order.
160
161 Nodes from ``nodes`` are emitted before nodes from ``noderange``.
162
163 TODO support different revision selection mechanisms (e.g. non-public, specific
164 revisions)
165 TODO support different hash "namespaces" for revisions (e.g. sha-1 versus other)
166 TODO support emitting phases data
167 TODO support emitting bookmarks data
168 TODO support emitting obsolescence data
169 TODO support filtering based on relevant paths (narrow clone)
170 TODO support depth limiting
171 TODO support hgtagsfnodes cache / tags data
172 TODO support branch heads cache
173
90 heads
174 heads
91 -----
175 -----
92
176
@@ -802,8 +802,7 b' class httpv2peer(object):'
802 return True
802 return True
803
803
804 # Other concepts.
804 # Other concepts.
805 # TODO remove exchangev2 once we have a command implemented.
805 if name in ('bundle2'):
806 if name in ('bundle2', 'exchangev2'):
807 return True
806 return True
808
807
809 # Alias command-* to presence of command of that name.
808 # Alias command-* to presence of command of that name.
@@ -9,7 +9,11 b' from __future__ import absolute_import'
9 import contextlib
9 import contextlib
10
10
11 from .i18n import _
11 from .i18n import _
12 from .node import (
13 nullid,
14 )
12 from . import (
15 from . import (
16 discovery,
13 encoding,
17 encoding,
14 error,
18 error,
15 pycompat,
19 pycompat,
@@ -460,6 +464,81 b' def branchmapv2(repo, proto):'
460 def capabilitiesv2(repo, proto):
464 def capabilitiesv2(repo, proto):
461 yield _capabilitiesv2(repo, proto)
465 yield _capabilitiesv2(repo, proto)
462
466
467 @wireprotocommand('changesetdata',
468 args={
469 'noderange': [[b'0123456...'], [b'abcdef...']],
470 'nodes': [b'0123456...'],
471 'fields': {b'parents', b'revision'},
472 },
473 permission='pull')
474 def changesetdata(repo, proto, noderange=None, nodes=None, fields=None):
475 fields = fields or set()
476
477 if noderange is None and nodes is None:
478 raise error.WireprotoCommandError(
479 'noderange or nodes must be defined')
480
481 if noderange is not None:
482 if len(noderange) != 2:
483 raise error.WireprotoCommandError(
484 'noderange must consist of 2 elements')
485
486 if not noderange[1]:
487 raise error.WireprotoCommandError(
488 'heads in noderange request cannot be empty')
489
490 cl = repo.changelog
491 hasnode = cl.hasnode
492
493 seen = set()
494 outgoing = []
495
496 if nodes is not None:
497 outgoing.extend(n for n in nodes if hasnode(n))
498 seen |= set(outgoing)
499
500 if noderange is not None:
501 if noderange[0]:
502 common = [n for n in noderange[0] if hasnode(n)]
503 else:
504 common = [nullid]
505
506 for n in discovery.outgoing(repo, common, noderange[1]).missing:
507 if n not in seen:
508 outgoing.append(n)
509 # Don't need to add to seen here because this is the final
510 # source of nodes and there should be no duplicates in this
511 # list.
512
513 seen.clear()
514
515 if outgoing:
516 repo.hook('preoutgoing', throw=True, source='serve')
517
518 yield {
519 b'totalitems': len(outgoing),
520 }
521
522 # It is already topologically sorted by revision number.
523 for node in outgoing:
524 d = {
525 b'node': node,
526 }
527
528 if b'parents' in fields:
529 d[b'parents'] = cl.parents(node)
530
531 revisiondata = None
532
533 if b'revision' in fields:
534 revisiondata = cl.revision(node, raw=True)
535 d[b'revisionsize'] = len(revisiondata)
536
537 yield d
538
539 if revisiondata is not None:
540 yield revisiondata
541
463 @wireprotocommand('heads',
542 @wireprotocommand('heads',
464 args={
543 args={
465 'publiconly': False,
544 'publiconly': False,
@@ -313,7 +313,7 b' Client with HTTPv2 enabled automatically'
313 s> Content-Type: application/mercurial-cbor\r\n
313 s> Content-Type: application/mercurial-cbor\r\n
314 s> Content-Length: *\r\n (glob)
314 s> Content-Length: *\r\n (glob)
315 s> \r\n
315 s> \r\n
316 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
316 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa8Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa3Ffields\xd9\x01\x02\x82GparentsHrevisionInoderange\x82\x81J0123456...\x81Iabcdef...Enodes\x81J0123456...Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
317 sending heads command
317 sending heads command
318 s> POST /api/exp-http-v2-0001/ro/heads HTTP/1.1\r\n
318 s> POST /api/exp-http-v2-0001/ro/heads HTTP/1.1\r\n
319 s> Accept-Encoding: identity\r\n
319 s> Accept-Encoding: identity\r\n
@@ -212,7 +212,7 b' Request for HTTPv2 service returns infor'
212 s> Content-Type: application/mercurial-cbor\r\n
212 s> Content-Type: application/mercurial-cbor\r\n
213 s> Content-Length: *\r\n (glob)
213 s> Content-Length: *\r\n (glob)
214 s> \r\n
214 s> \r\n
215 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
215 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa8Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa3Ffields\xd9\x01\x02\x82GparentsHrevisionInoderange\x82\x81J0123456...\x81Iabcdef...Enodes\x81J0123456...Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
216 cbor> {
216 cbor> {
217 b'apibase': b'api/',
217 b'apibase': b'api/',
218 b'apis': {
218 b'apis': {
@@ -230,6 +230,28 b' Request for HTTPv2 service returns infor'
230 b'pull'
230 b'pull'
231 ]
231 ]
232 },
232 },
233 b'changesetdata': {
234 b'args': {
235 b'fields': set([
236 b'parents',
237 b'revision'
238 ]),
239 b'noderange': [
240 [
241 b'0123456...'
242 ],
243 [
244 b'abcdef...'
245 ]
246 ],
247 b'nodes': [
248 b'0123456...'
249 ]
250 },
251 b'permissions': [
252 b'pull'
253 ]
254 },
233 b'heads': {
255 b'heads': {
234 b'args': {
256 b'args': {
235 b'publiconly': False
257 b'publiconly': False
@@ -315,11 +337,11 b' capabilities command returns expected in'
315 s> Content-Type: application/mercurial-cbor\r\n
337 s> Content-Type: application/mercurial-cbor\r\n
316 s> Content-Length: *\r\n (glob)
338 s> Content-Length: *\r\n (glob)
317 s> \r\n
339 s> \r\n
318 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
340 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa8Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa3Ffields\xd9\x01\x02\x82GparentsHrevisionInoderange\x82\x81J0123456...\x81Iabcdef...Enodes\x81J0123456...Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
319 sending capabilities command
341 sending capabilities command
320 s> POST /api/exp-http-v2-0001/ro/capabilities HTTP/1.1\r\n
342 s> POST /api/exp-http-v2-0001/ro/capabilities HTTP/1.1\r\n
321 s> Accept-Encoding: identity\r\n
343 s> Accept-Encoding: identity\r\n
322 s> *\r\n (glob)
344 s> accept: application/mercurial-exp-framing-0005\r\n
323 s> content-type: application/mercurial-exp-framing-0005\r\n
345 s> content-type: application/mercurial-exp-framing-0005\r\n
324 s> content-length: 27\r\n
346 s> content-length: 27\r\n
325 s> host: $LOCALIP:$HGPORT\r\n (glob)
347 s> host: $LOCALIP:$HGPORT\r\n (glob)
@@ -338,11 +360,11 b' capabilities command returns expected in'
338 s> \xa1FstatusBok
360 s> \xa1FstatusBok
339 s> \r\n
361 s> \r\n
340 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
362 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
341 s> 1cc\r\n
363 s> 243\r\n
342 s> \xc4\x01\x00\x01\x00\x02\x001
364 s> ;\x02\x00\x01\x00\x02\x001
343 s> \xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1
365 s> \xa4Hcommands\xa8Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa3Ffields\xd9\x01\x02\x82GparentsHrevisionInoderange\x82\x81J0123456...\x81Iabcdef...Enodes\x81J0123456...Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1
344 s> \r\n
366 s> \r\n
345 received frame(size=452; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
367 received frame(size=571; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
346 s> 8\r\n
368 s> 8\r\n
347 s> \x00\x00\x00\x01\x00\x02\x002
369 s> \x00\x00\x00\x01\x00\x02\x002
348 s> \r\n
370 s> \r\n
@@ -364,6 +386,28 b' capabilities command returns expected in'
364 b'pull'
386 b'pull'
365 ]
387 ]
366 },
388 },
389 b'changesetdata': {
390 b'args': {
391 b'fields': set([
392 b'parents',
393 b'revision'
394 ]),
395 b'noderange': [
396 [
397 b'0123456...'
398 ],
399 [
400 b'abcdef...'
401 ]
402 ],
403 b'nodes': [
404 b'0123456...'
405 ]
406 },
407 b'permissions': [
408 b'pull'
409 ]
410 },
367 b'heads': {
411 b'heads': {
368 b'args': {
412 b'args': {
369 b'publiconly': False
413 b'publiconly': False
General Comments 0
You need to be logged in to leave comments. Login now