comparison tests/test-wireproto-command-changesetdata.t @ 40176:41263df08109

wireprotov2: change how revisions are specified to changesetdata Right now, we have a handful of arguments for specifying the revisions whose data should be returned. Defining how all these arguments interact when various combinations are present is difficult. This commit establishes a new, generic mechanism for specifying revisions. Instead of a hodgepodge of arguments defining things, we have a list of dicts that specify revision selectors. The final set of revisions is a union of all these selectors. We implement support for specifying revisions based on: * An explicit list of changeset revisions * An explicit list of changeset revisions plus ancestry depth * A DAG range between changeset roots and heads If you squint hard enough, this problem has already been solved by revsets. But I'm reluctant to expose revsets to the wire protocol because that would require servers to implement a revset parser. Plus there are security and performance implications: the set of revision selectors needs to be narrowly and specifically tailored for what is appropriate to be executing on a server. Perhaps there would be a way for us to express the "parse tree" of a revset query, for example. I'm not sure. We can explore this space another time. For now, the new mechanism should bring sufficient flexibility while remaining relatively simple. The selector "types" are prefixed with "changeset" because I plan to add manifest and file-flavored selectors as well. This will enable us to e.g. select file revisions based on a range of changeset revisions. Differential Revision: https://phab.mercurial-scm.org/D4979
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 08 Oct 2018 18:17:12 -0700
parents 6c42409691ec
children 95c4cca641f6
comparison
equal deleted inserted replaced
40175:6c42409691ec 40176:41263df08109
42 $ sendhttpv2peer << EOF 42 $ sendhttpv2peer << EOF
43 > command changesetdata 43 > command changesetdata
44 > EOF 44 > EOF
45 creating http peer for wire protocol version 2 45 creating http peer for wire protocol version 2
46 sending changesetdata command 46 sending changesetdata command
47 abort: noderange or nodes must be defined! 47 abort: missing required arguments: revisions!
48 [255] 48 [255]
49 49
50 Empty noderange heads results in an error 50 Missing nodes for changesetexplicit results in error
51 51
52 $ sendhttpv2peer << EOF 52 $ sendhttpv2peer << EOF
53 > command changesetdata 53 > command changesetdata
54 > noderange eval:[[],[]] 54 > revisions eval:[{b'type': b'changesetexplicit'}]
55 > EOF 55 > EOF
56 creating http peer for wire protocol version 2 56 creating http peer for wire protocol version 2
57 sending changesetdata command 57 sending changesetdata command
58 abort: heads in noderange request cannot be empty! 58 abort: nodes key not present in changesetexplicit revision specifier!
59 [255] 59 [255]
60 60
61 nodesdepth requires nodes argument 61 changesetexplicitdepth requires nodes and depth keys
62 62
63 $ sendhttpv2peer << EOF 63 $ sendhttpv2peer << EOF
64 > command changesetdata 64 > command changesetdata
65 > nodesdepth 42 65 > revisions eval:[{b'type': b'changesetexplicitdepth'}]
66 > noderange eval:[[], [b'ignored']] 66 > EOF
67 > EOF 67 creating http peer for wire protocol version 2
68 creating http peer for wire protocol version 2 68 sending changesetdata command
69 sending changesetdata command 69 abort: nodes key not present in changesetexplicitdepth revision specifier!
70 abort: nodesdepth requires the nodes argument! 70 [255]
71 [255] 71
72 72 $ sendhttpv2peer << EOF
73 Sending just noderange heads sends all revisions 73 > command changesetdata
74 74 > revisions eval:[{b'type': b'changesetexplicitdepth', b'nodes': []}]
75 $ sendhttpv2peer << EOF 75 > EOF
76 > command changesetdata 76 creating http peer for wire protocol version 2
77 > 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']] 77 sending changesetdata command
78 abort: depth key not present in changesetexplicitdepth revision specifier!
79 [255]
80
81 $ sendhttpv2peer << EOF
82 > command changesetdata
83 > revisions eval:[{b'type': b'changesetexplicitdepth', b'depth': 42}]
84 > EOF
85 creating http peer for wire protocol version 2
86 sending changesetdata command
87 abort: nodes key not present in changesetexplicitdepth revision specifier!
88 [255]
89
90 changesetdagrange requires roots and heads keys
91
92 $ sendhttpv2peer << EOF
93 > command changesetdata
94 > revisions eval:[{b'type': b'changesetdagrange'}]
95 > EOF
96 creating http peer for wire protocol version 2
97 sending changesetdata command
98 abort: roots key not present in changesetdagrange revision specifier!
99 [255]
100
101 $ sendhttpv2peer << EOF
102 > command changesetdata
103 > revisions eval:[{b'type': b'changesetdagrange', b'roots': []}]
104 > EOF
105 creating http peer for wire protocol version 2
106 sending changesetdata command
107 abort: heads key not present in changesetdagrange revision specifier!
108 [255]
109
110 $ sendhttpv2peer << EOF
111 > command changesetdata
112 > revisions eval:[{b'type': b'changesetdagrange', b'heads': [b'dummy']}]
113 > EOF
114 creating http peer for wire protocol version 2
115 sending changesetdata command
116 abort: roots key not present in changesetdagrange revision specifier!
117 [255]
118
119 Empty changesetdagrange heads results in an error
120
121 $ sendhttpv2peer << EOF
122 > command changesetdata
123 > revisions eval:[{b'type': b'changesetdagrange', b'heads': [], b'roots': []}]
124 > EOF
125 creating http peer for wire protocol version 2
126 sending changesetdata command
127 abort: heads key in changesetdagrange cannot be empty!
128 [255]
129
130 Sending just dagrange heads sends all revisions
131
132 $ sendhttpv2peer << EOF
133 > command changesetdata
134 > revisions eval:[{
135 > b'type': b'changesetdagrange',
136 > b'roots': [],
137 > b'heads': [
138 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
139 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
140 > ]}]
78 > EOF 141 > EOF
79 creating http peer for wire protocol version 2 142 creating http peer for wire protocol version 2
80 sending changesetdata command 143 sending changesetdata command
81 response: gen[ 144 response: gen[
82 { 145 {
98 161
99 Sending root nodes limits what data is sent 162 Sending root nodes limits what data is sent
100 163
101 $ sendhttpv2peer << EOF 164 $ sendhttpv2peer << EOF
102 > command changesetdata 165 > command changesetdata
103 > 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']] 166 > revisions eval:[{
167 > b'type': b'changesetdagrange',
168 > b'roots': [b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a'],
169 > b'heads': [
170 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
171 > ]}]
104 > EOF 172 > EOF
105 creating http peer for wire protocol version 2 173 creating http peer for wire protocol version 2
106 sending changesetdata command 174 sending changesetdata command
107 response: gen[ 175 response: gen[
108 { 176 {
118 186
119 Requesting data on a single node by node works 187 Requesting data on a single node by node works
120 188
121 $ sendhttpv2peer << EOF 189 $ sendhttpv2peer << EOF
122 > command changesetdata 190 > command changesetdata
123 > nodes eval:[b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a'] 191 > revisions eval:[{
192 > b'type': b'changesetexplicit',
193 > b'nodes': [b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a']}]
124 > EOF 194 > EOF
125 creating http peer for wire protocol version 2 195 creating http peer for wire protocol version 2
126 sending changesetdata command 196 sending changesetdata command
127 response: gen[ 197 response: gen[
128 { 198 {
135 205
136 Specifying a noderange and nodes takes union 206 Specifying a noderange and nodes takes union
137 207
138 $ sendhttpv2peer << EOF 208 $ sendhttpv2peer << EOF
139 > command changesetdata 209 > command changesetdata
140 > 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']] 210 > revisions eval:[
141 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 211 > {
212 > b'type': b'changesetexplicit',
213 > b'nodes': [b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'],
214 > },
215 > {
216 > b'type': b'changesetdagrange',
217 > b'roots': [b'\x75\x92\x91\x7e\x1c\x3e\x82\x67\x7c\xb0\xa4\xbc\x71\x5c\xa2\x5d\xd1\x2d\x28\xc1'],
218 > b'heads': [b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd'],
219 > }]
142 > EOF 220 > EOF
143 creating http peer for wire protocol version 2 221 creating http peer for wire protocol version 2
144 sending changesetdata command 222 sending changesetdata command
145 response: gen[ 223 response: gen[
146 { 224 {
156 234
157 nodesdepth of 1 limits to exactly requested nodes 235 nodesdepth of 1 limits to exactly requested nodes
158 236
159 $ sendhttpv2peer << EOF 237 $ sendhttpv2peer << EOF
160 > command changesetdata 238 > command changesetdata
161 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 239 > revisions eval:[{
162 > nodesdepth eval:1 240 > b'type': b'changesetexplicitdepth',
241 > b'nodes': [b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'],
242 > b'depth': 1}]
163 > EOF 243 > EOF
164 creating http peer for wire protocol version 2 244 creating http peer for wire protocol version 2
165 sending changesetdata command 245 sending changesetdata command
166 response: gen[ 246 response: gen[
167 { 247 {
174 254
175 nodesdepth of 2 limits to first ancestor 255 nodesdepth of 2 limits to first ancestor
176 256
177 $ sendhttpv2peer << EOF 257 $ sendhttpv2peer << EOF
178 > command changesetdata 258 > command changesetdata
179 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 259 > revisions eval:[{
180 > nodesdepth eval:2 260 > b'type': b'changesetexplicitdepth',
261 > b'nodes': [b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'],
262 > b'depth': 2}]
181 > EOF 263 > EOF
182 creating http peer for wire protocol version 2 264 creating http peer for wire protocol version 2
183 sending changesetdata command 265 sending changesetdata command
184 response: gen[ 266 response: gen[
185 { 267 {
195 277
196 nodesdepth with multiple nodes 278 nodesdepth with multiple nodes
197 279
198 $ sendhttpv2peer << EOF 280 $ sendhttpv2peer << EOF
199 > command changesetdata 281 > command changesetdata
200 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11', b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd'] 282 > revisions eval:[{
201 > nodesdepth eval:2 283 > b'type': b'changesetexplicitdepth',
284 > b'nodes': [b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11', b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd'],
285 > b'depth': 2}]
202 > EOF 286 > EOF
203 creating http peer for wire protocol version 2 287 creating http peer for wire protocol version 2
204 sending changesetdata command 288 sending changesetdata command
205 response: gen[ 289 response: gen[
206 { 290 {
223 Parents data is transferred upon request 307 Parents data is transferred upon request
224 308
225 $ sendhttpv2peer << EOF 309 $ sendhttpv2peer << EOF
226 > command changesetdata 310 > command changesetdata
227 > fields eval:[b'parents'] 311 > fields eval:[b'parents']
228 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 312 > revisions eval:[{
313 > b'type': b'changesetexplicit',
314 > b'nodes': [
315 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
316 > ]}]
229 > EOF 317 > EOF
230 creating http peer for wire protocol version 2 318 creating http peer for wire protocol version 2
231 sending changesetdata command 319 sending changesetdata command
232 response: gen[ 320 response: gen[
233 { 321 {
245 Phase data is transferred upon request 333 Phase data is transferred upon request
246 334
247 $ sendhttpv2peer << EOF 335 $ sendhttpv2peer << EOF
248 > command changesetdata 336 > command changesetdata
249 > fields eval:[b'phase'] 337 > fields eval:[b'phase']
250 > nodes eval:[b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd'] 338 > revisions eval:[{
339 > b'type': b'changesetexplicit',
340 > b'nodes': [
341 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
342 > ]}]
251 > EOF 343 > EOF
252 creating http peer for wire protocol version 2 344 creating http peer for wire protocol version 2
253 sending changesetdata command 345 sending changesetdata command
254 response: gen[ 346 response: gen[
255 { 347 {
264 Revision data is transferred upon request 356 Revision data is transferred upon request
265 357
266 $ sendhttpv2peer << EOF 358 $ sendhttpv2peer << EOF
267 > command changesetdata 359 > command changesetdata
268 > fields eval:[b'revision'] 360 > fields eval:[b'revision']
269 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 361 > revisions eval:[{
362 > b'type': b'changesetexplicit',
363 > b'nodes': [
364 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
365 > ]}]
270 > EOF 366 > EOF
271 creating http peer for wire protocol version 2 367 creating http peer for wire protocol version 2
272 sending changesetdata command 368 sending changesetdata command
273 response: gen[ 369 response: gen[
274 { 370 {
289 Bookmarks key isn't present if no bookmarks data 385 Bookmarks key isn't present if no bookmarks data
290 386
291 $ sendhttpv2peer << EOF 387 $ sendhttpv2peer << EOF
292 > command changesetdata 388 > command changesetdata
293 > fields eval:[b'bookmarks'] 389 > fields eval:[b'bookmarks']
294 > 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']] 390 > revisions eval:[{
391 > b'type': b'changesetdagrange',
392 > b'roots': [],
393 > b'heads': [
394 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
395 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
396 > ]}]
295 > EOF 397 > EOF
296 creating http peer for wire protocol version 2 398 creating http peer for wire protocol version 2
297 sending changesetdata command 399 sending changesetdata command
298 response: gen[ 400 response: gen[
299 { 401 {
320 $ hg -R ../server bookmark -r eae5f82c2e622368d27daecb76b7e393d0f24211 book-3 422 $ hg -R ../server bookmark -r eae5f82c2e622368d27daecb76b7e393d0f24211 book-3
321 423
322 $ sendhttpv2peer << EOF 424 $ sendhttpv2peer << EOF
323 > command changesetdata 425 > command changesetdata
324 > fields eval:[b'bookmarks'] 426 > fields eval:[b'bookmarks']
325 > 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']] 427 > revisions eval:[{
428 > b'type': b'changesetdagrange',
429 > b'roots': [],
430 > b'heads': [
431 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
432 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
433 > ]}]
326 > EOF 434 > EOF
327 creating http peer for wire protocol version 2 435 creating http peer for wire protocol version 2
328 sending changesetdata command 436 sending changesetdata command
329 response: gen[ 437 response: gen[
330 { 438 {
354 Bookmarks are sent when we make a no-new-revisions request 462 Bookmarks are sent when we make a no-new-revisions request
355 463
356 $ sendhttpv2peer << EOF 464 $ sendhttpv2peer << EOF
357 > command changesetdata 465 > command changesetdata
358 > fields eval:[b'bookmarks', b'revision'] 466 > fields eval:[b'bookmarks', b'revision']
359 > noderange eval:[[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'], [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']] 467 > revisions eval:[{
468 > b'type': b'changesetdagrange',
469 > b'roots': [b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'],
470 > b'heads': [
471 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
472 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
473 > ]}]
360 > EOF 474 > EOF
361 creating http peer for wire protocol version 2 475 creating http peer for wire protocol version 2
362 sending changesetdata command 476 sending changesetdata command
363 response: gen[ 477 response: gen[
364 { 478 {
399 Multiple fields can be transferred 513 Multiple fields can be transferred
400 514
401 $ sendhttpv2peer << EOF 515 $ sendhttpv2peer << EOF
402 > command changesetdata 516 > command changesetdata
403 > fields eval:[b'parents', b'revision'] 517 > fields eval:[b'parents', b'revision']
404 > nodes eval:[b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11'] 518 > revisions eval:[{
519 > b'type': b'changesetexplicit',
520 > b'nodes': [
521 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
522 > ]}]
405 > EOF 523 > EOF
406 creating http peer for wire protocol version 2 524 creating http peer for wire protocol version 2
407 sending changesetdata command 525 sending changesetdata command
408 response: gen[ 526 response: gen[
409 { 527 {
429 TODO this doesn't work 547 TODO this doesn't work
430 548
431 $ sendhttpv2peer << EOF 549 $ sendhttpv2peer << EOF
432 > command changesetdata 550 > command changesetdata
433 > fields eval:[b'phase', b'parents', b'revision'] 551 > fields eval:[b'phase', b'parents', b'revision']
434 > 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', b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11']] 552 > revisions eval:[{
553 > b'type': b'changesetdagrange',
554 > b'roots': [b'\x33\x90\xef\x85\x00\x73\xfb\xc2\xf0\xdf\xff\x22\x44\x34\x2c\x8e\x92\x29\x01\x3a'],
555 > b'heads': [
556 > b'\x0b\xb8\xad\x89\x4a\x15\xb1\x53\x80\xb2\xa2\xa5\xb1\x83\xe2\x0f\x2a\x4b\x28\xdd',
557 > b'\xea\xe5\xf8\x2c\x2e\x62\x23\x68\xd2\x7d\xae\xcb\x76\xb7\xe3\x93\xd0\xf2\x42\x11',
558 > ]}]
435 > EOF 559 > EOF
436 creating http peer for wire protocol version 2 560 creating http peer for wire protocol version 2
437 sending changesetdata command 561 sending changesetdata command
438 response: gen[ 562 response: gen[
439 { 563 {