##// END OF EJS Templates
test-bundle2: move file mode setting after sys import
Matt Mackall -
r21956:93b804fc stable
parent child Browse files
Show More
@@ -1,1106 +1,1107 b''
1 1
2 2 Create an extension to test bundle2 API
3 3
4 4 $ cat > bundle2.py << EOF
5 5 > """A small extension to test bundle2 implementation
6 6 >
7 7 > Current bundle2 implementation is far too limited to be used in any core
8 8 > code. We still need to be able to test it while it grow up.
9 9 > """
10 10 >
11 > import sys
12 > from mercurial import cmdutil
13 > from mercurial import util
14 > from mercurial import bundle2
15 > from mercurial import scmutil
16 > from mercurial import discovery
17 > from mercurial import changegroup
18 > from mercurial import error
19 >
11 20 > try:
12 21 > import msvcrt
13 22 > msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
14 23 > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
15 24 > msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
16 25 > except ImportError:
17 26 > pass
18 27 >
19 > import sys
20 > from mercurial import cmdutil
21 > from mercurial import util
22 > from mercurial import bundle2
23 > from mercurial import scmutil
24 > from mercurial import discovery
25 > from mercurial import changegroup
26 > from mercurial import error
27 28 > cmdtable = {}
28 29 > command = cmdutil.command(cmdtable)
29 30 >
30 31 > ELEPHANTSSONG = """Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
31 32 > Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
32 33 > Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko."""
33 34 > assert len(ELEPHANTSSONG) == 178 # future test say 178 bytes, trust it.
34 35 >
35 36 > @bundle2.parthandler('test:song')
36 37 > def songhandler(op, part):
37 38 > """handle a "test:song" bundle2 part, printing the lyrics on stdin"""
38 39 > op.ui.write('The choir starts singing:\n')
39 40 > verses = 0
40 41 > for line in part.read().split('\n'):
41 42 > op.ui.write(' %s\n' % line)
42 43 > verses += 1
43 44 > op.records.add('song', {'verses': verses})
44 45 >
45 46 > @bundle2.parthandler('test:ping')
46 47 > def pinghandler(op, part):
47 48 > op.ui.write('received ping request (id %i)\n' % part.id)
48 49 > if op.reply is not None and 'ping-pong' in op.reply.capabilities:
49 50 > op.ui.write_err('replying to ping request (id %i)\n' % part.id)
50 51 > op.reply.newpart('test:pong', [('in-reply-to', str(part.id))])
51 52 >
52 53 > @bundle2.parthandler('test:debugreply')
53 54 > def debugreply(op, part):
54 55 > """print data about the capacity of the bundle reply"""
55 56 > if op.reply is None:
56 57 > op.ui.write('debugreply: no reply\n')
57 58 > else:
58 59 > op.ui.write('debugreply: capabilities:\n')
59 60 > for cap in sorted(op.reply.capabilities):
60 61 > op.ui.write('debugreply: %r\n' % cap)
61 62 > for val in op.reply.capabilities[cap]:
62 63 > op.ui.write('debugreply: %r\n' % val)
63 64 >
64 65 > @command('bundle2',
65 66 > [('', 'param', [], 'stream level parameter'),
66 67 > ('', 'unknown', False, 'include an unknown mandatory part in the bundle'),
67 68 > ('', 'unknownparams', False, 'include an unknown part parameters in the bundle'),
68 69 > ('', 'parts', False, 'include some arbitrary parts to the bundle'),
69 70 > ('', 'reply', False, 'produce a reply bundle'),
70 71 > ('', 'pushrace', False, 'includes a check:head part with unknown nodes'),
71 72 > ('r', 'rev', [], 'includes those changeset in the bundle'),],
72 73 > '[OUTPUTFILE]')
73 74 > def cmdbundle2(ui, repo, path=None, **opts):
74 75 > """write a bundle2 container on standard ouput"""
75 76 > bundler = bundle2.bundle20(ui)
76 77 > for p in opts['param']:
77 78 > p = p.split('=', 1)
78 79 > try:
79 80 > bundler.addparam(*p)
80 81 > except ValueError, exc:
81 82 > raise util.Abort('%s' % exc)
82 83 >
83 84 > if opts['reply']:
84 85 > capsstring = 'ping-pong\nelephants=babar,celeste\ncity%3D%21=celeste%2Cville'
85 86 > bundler.newpart('b2x:replycaps', data=capsstring)
86 87 >
87 88 > if opts['pushrace']:
88 89 > # also serve to test the assignement of data outside of init
89 90 > part = bundler.newpart('b2x:check:heads')
90 91 > part.data = '01234567890123456789'
91 92 >
92 93 > revs = opts['rev']
93 94 > if 'rev' in opts:
94 95 > revs = scmutil.revrange(repo, opts['rev'])
95 96 > if revs:
96 97 > # very crude version of a changegroup part creation
97 98 > bundled = repo.revs('%ld::%ld', revs, revs)
98 99 > headmissing = [c.node() for c in repo.set('heads(%ld)', revs)]
99 100 > headcommon = [c.node() for c in repo.set('parents(%ld) - %ld', revs, revs)]
100 101 > outgoing = discovery.outgoing(repo.changelog, headcommon, headmissing)
101 102 > cg = changegroup.getlocalbundle(repo, 'test:bundle2', outgoing, None)
102 103 > bundler.newpart('b2x:changegroup', data=cg.getchunks())
103 104 >
104 105 > if opts['parts']:
105 106 > bundler.newpart('test:empty')
106 107 > # add a second one to make sure we handle multiple parts
107 108 > bundler.newpart('test:empty')
108 109 > bundler.newpart('test:song', data=ELEPHANTSSONG)
109 110 > bundler.newpart('test:debugreply')
110 111 > mathpart = bundler.newpart('test:math')
111 112 > mathpart.addparam('pi', '3.14')
112 113 > mathpart.addparam('e', '2.72')
113 114 > mathpart.addparam('cooking', 'raw', mandatory=False)
114 115 > mathpart.data = '42'
115 116 > # advisory known part with unknown mandatory param
116 117 > bundler.newpart('test:song', [('randomparam','')])
117 118 > if opts['unknown']:
118 119 > bundler.newpart('test:UNKNOWN', data='some random content')
119 120 > if opts['unknownparams']:
120 121 > bundler.newpart('test:SONG', [('randomparams', '')])
121 122 > if opts['parts']:
122 123 > bundler.newpart('test:ping')
123 124 >
124 125 > if path is None:
125 126 > file = sys.stdout
126 127 > else:
127 128 > file = open(path, 'w')
128 129 >
129 130 > for chunk in bundler.getchunks():
130 131 > file.write(chunk)
131 132 >
132 133 > @command('unbundle2', [], '')
133 134 > def cmdunbundle2(ui, repo, replypath=None):
134 135 > """process a bundle2 stream from stdin on the current repo"""
135 136 > try:
136 137 > tr = None
137 138 > lock = repo.lock()
138 139 > tr = repo.transaction('processbundle')
139 140 > try:
140 141 > unbundler = bundle2.unbundle20(ui, sys.stdin)
141 142 > op = bundle2.processbundle(repo, unbundler, lambda: tr)
142 143 > tr.close()
143 144 > except error.BundleValueError, exc:
144 145 > raise util.Abort('missing support for %s' % exc)
145 146 > except error.PushRaced, exc:
146 147 > raise util.Abort('push race: %s' % exc)
147 148 > finally:
148 149 > if tr is not None:
149 150 > tr.release()
150 151 > lock.release()
151 152 > remains = sys.stdin.read()
152 153 > ui.write('%i unread bytes\n' % len(remains))
153 154 > if op.records['song']:
154 155 > totalverses = sum(r['verses'] for r in op.records['song'])
155 156 > ui.write('%i total verses sung\n' % totalverses)
156 157 > for rec in op.records['changegroup']:
157 158 > ui.write('addchangegroup return: %i\n' % rec['return'])
158 159 > if op.reply is not None and replypath is not None:
159 160 > file = open(replypath, 'w')
160 161 > for chunk in op.reply.getchunks():
161 162 > file.write(chunk)
162 163 >
163 164 > @command('statbundle2', [], '')
164 165 > def cmdstatbundle2(ui, repo):
165 166 > """print statistic on the bundle2 container read from stdin"""
166 167 > unbundler = bundle2.unbundle20(ui, sys.stdin)
167 168 > try:
168 169 > params = unbundler.params
169 170 > except error.BundleValueError, exc:
170 171 > raise util.Abort('unknown parameters: %s' % exc)
171 172 > ui.write('options count: %i\n' % len(params))
172 173 > for key in sorted(params):
173 174 > ui.write('- %s\n' % key)
174 175 > value = params[key]
175 176 > if value is not None:
176 177 > ui.write(' %s\n' % value)
177 178 > count = 0
178 179 > for p in unbundler.iterparts():
179 180 > count += 1
180 181 > ui.write(' :%s:\n' % p.type)
181 182 > ui.write(' mandatory: %i\n' % len(p.mandatoryparams))
182 183 > ui.write(' advisory: %i\n' % len(p.advisoryparams))
183 184 > ui.write(' payload: %i bytes\n' % len(p.read()))
184 185 > ui.write('parts count: %i\n' % count)
185 186 > EOF
186 187 $ cat >> $HGRCPATH << EOF
187 188 > [extensions]
188 189 > bundle2=$TESTTMP/bundle2.py
189 190 > [experimental]
190 191 > bundle2-exp=True
191 192 > [ui]
192 193 > ssh=python "$TESTDIR/dummyssh"
193 194 > logtemplate={rev}:{node|short} {phase} {author} {desc|firstline}
194 195 > [web]
195 196 > push_ssl = false
196 197 > allow_push = *
197 198 > [phases]
198 199 > publish=False
199 200 > EOF
200 201
201 202 The extension requires a repo (currently unused)
202 203
203 204 $ hg init main
204 205 $ cd main
205 206 $ touch a
206 207 $ hg add a
207 208 $ hg commit -m 'a'
208 209
209 210
210 211 Empty bundle
211 212 =================
212 213
213 214 - no option
214 215 - no parts
215 216
216 217 Test bundling
217 218
218 219 $ hg bundle2
219 220 HG2X\x00\x00\x00\x00 (no-eol) (esc)
220 221
221 222 Test unbundling
222 223
223 224 $ hg bundle2 | hg statbundle2
224 225 options count: 0
225 226 parts count: 0
226 227
227 228 Test old style bundle are detected and refused
228 229
229 230 $ hg bundle --all ../bundle.hg
230 231 1 changesets found
231 232 $ hg statbundle2 < ../bundle.hg
232 233 abort: unknown bundle version 10
233 234 [255]
234 235
235 236 Test parameters
236 237 =================
237 238
238 239 - some options
239 240 - no parts
240 241
241 242 advisory parameters, no value
242 243 -------------------------------
243 244
244 245 Simplest possible parameters form
245 246
246 247 Test generation simple option
247 248
248 249 $ hg bundle2 --param 'caution'
249 250 HG2X\x00\x07caution\x00\x00 (no-eol) (esc)
250 251
251 252 Test unbundling
252 253
253 254 $ hg bundle2 --param 'caution' | hg statbundle2
254 255 options count: 1
255 256 - caution
256 257 parts count: 0
257 258
258 259 Test generation multiple option
259 260
260 261 $ hg bundle2 --param 'caution' --param 'meal'
261 262 HG2X\x00\x0ccaution meal\x00\x00 (no-eol) (esc)
262 263
263 264 Test unbundling
264 265
265 266 $ hg bundle2 --param 'caution' --param 'meal' | hg statbundle2
266 267 options count: 2
267 268 - caution
268 269 - meal
269 270 parts count: 0
270 271
271 272 advisory parameters, with value
272 273 -------------------------------
273 274
274 275 Test generation
275 276
276 277 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants'
277 278 HG2X\x00\x1ccaution meal=vegan elephants\x00\x00 (no-eol) (esc)
278 279
279 280 Test unbundling
280 281
281 282 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants' | hg statbundle2
282 283 options count: 3
283 284 - caution
284 285 - elephants
285 286 - meal
286 287 vegan
287 288 parts count: 0
288 289
289 290 parameter with special char in value
290 291 ---------------------------------------------------
291 292
292 293 Test generation
293 294
294 295 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple
295 296 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
296 297
297 298 Test unbundling
298 299
299 300 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple | hg statbundle2
300 301 options count: 2
301 302 - e|! 7/
302 303 babar%#==tutu
303 304 - simple
304 305 parts count: 0
305 306
306 307 Test unknown mandatory option
307 308 ---------------------------------------------------
308 309
309 310 $ hg bundle2 --param 'Gravity' | hg statbundle2
310 311 abort: unknown parameters: Stream Parameter - Gravity
311 312 [255]
312 313
313 314 Test debug output
314 315 ---------------------------------------------------
315 316
316 317 bundling debug
317 318
318 319 $ hg bundle2 --debug --param 'e|! 7/=babar%#==tutu' --param simple ../out.hg2
319 320 start emission of HG2X stream
320 321 bundle parameter: e%7C%21%207/=babar%25%23%3D%3Dtutu simple
321 322 start of parts
322 323 end of bundle
323 324
324 325 file content is ok
325 326
326 327 $ cat ../out.hg2
327 328 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
328 329
329 330 unbundling debug
330 331
331 332 $ hg statbundle2 --debug < ../out.hg2
332 333 start processing of HG2X stream
333 334 reading bundle2 stream parameters
334 335 ignoring unknown parameter 'e|! 7/'
335 336 ignoring unknown parameter 'simple'
336 337 options count: 2
337 338 - e|! 7/
338 339 babar%#==tutu
339 340 - simple
340 341 start extraction of bundle2 parts
341 342 part header size: 0
342 343 end of bundle2 stream
343 344 parts count: 0
344 345
345 346
346 347 Test buggy input
347 348 ---------------------------------------------------
348 349
349 350 empty parameter name
350 351
351 352 $ hg bundle2 --param '' --quiet
352 353 abort: empty parameter name
353 354 [255]
354 355
355 356 bad parameter name
356 357
357 358 $ hg bundle2 --param 42babar
358 359 abort: non letter first character: '42babar'
359 360 [255]
360 361
361 362
362 363 Test part
363 364 =================
364 365
365 366 $ hg bundle2 --parts ../parts.hg2 --debug
366 367 start emission of HG2X stream
367 368 bundle parameter:
368 369 start of parts
369 370 bundle part: "test:empty"
370 371 bundle part: "test:empty"
371 372 bundle part: "test:song"
372 373 bundle part: "test:debugreply"
373 374 bundle part: "test:math"
374 375 bundle part: "test:song"
375 376 bundle part: "test:ping"
376 377 end of bundle
377 378
378 379 $ cat ../parts.hg2
379 380 HG2X\x00\x00\x00\x11 (esc)
380 381 test:empty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11 (esc)
381 382 test:empty\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x10 test:song\x00\x00\x00\x02\x00\x00\x00\x00\x00\xb2Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko (esc)
382 383 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
383 384 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.\x00\x00\x00\x00\x00\x16\x0ftest:debugreply\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00+ test:math\x00\x00\x00\x04\x02\x01\x02\x04\x01\x04\x07\x03pi3.14e2.72cookingraw\x00\x00\x00\x0242\x00\x00\x00\x00\x00\x1d test:song\x00\x00\x00\x05\x01\x00\x0b\x00randomparam\x00\x00\x00\x00\x00\x10 test:ping\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
384 385
385 386
386 387 $ hg statbundle2 < ../parts.hg2
387 388 options count: 0
388 389 :test:empty:
389 390 mandatory: 0
390 391 advisory: 0
391 392 payload: 0 bytes
392 393 :test:empty:
393 394 mandatory: 0
394 395 advisory: 0
395 396 payload: 0 bytes
396 397 :test:song:
397 398 mandatory: 0
398 399 advisory: 0
399 400 payload: 178 bytes
400 401 :test:debugreply:
401 402 mandatory: 0
402 403 advisory: 0
403 404 payload: 0 bytes
404 405 :test:math:
405 406 mandatory: 2
406 407 advisory: 1
407 408 payload: 2 bytes
408 409 :test:song:
409 410 mandatory: 1
410 411 advisory: 0
411 412 payload: 0 bytes
412 413 :test:ping:
413 414 mandatory: 0
414 415 advisory: 0
415 416 payload: 0 bytes
416 417 parts count: 7
417 418
418 419 $ hg statbundle2 --debug < ../parts.hg2
419 420 start processing of HG2X stream
420 421 reading bundle2 stream parameters
421 422 options count: 0
422 423 start extraction of bundle2 parts
423 424 part header size: 17
424 425 part type: "test:empty"
425 426 part id: "0"
426 427 part parameters: 0
427 428 :test:empty:
428 429 mandatory: 0
429 430 advisory: 0
430 431 payload chunk size: 0
431 432 payload: 0 bytes
432 433 part header size: 17
433 434 part type: "test:empty"
434 435 part id: "1"
435 436 part parameters: 0
436 437 :test:empty:
437 438 mandatory: 0
438 439 advisory: 0
439 440 payload chunk size: 0
440 441 payload: 0 bytes
441 442 part header size: 16
442 443 part type: "test:song"
443 444 part id: "2"
444 445 part parameters: 0
445 446 :test:song:
446 447 mandatory: 0
447 448 advisory: 0
448 449 payload chunk size: 178
449 450 payload chunk size: 0
450 451 payload: 178 bytes
451 452 part header size: 22
452 453 part type: "test:debugreply"
453 454 part id: "3"
454 455 part parameters: 0
455 456 :test:debugreply:
456 457 mandatory: 0
457 458 advisory: 0
458 459 payload chunk size: 0
459 460 payload: 0 bytes
460 461 part header size: 43
461 462 part type: "test:math"
462 463 part id: "4"
463 464 part parameters: 3
464 465 :test:math:
465 466 mandatory: 2
466 467 advisory: 1
467 468 payload chunk size: 2
468 469 payload chunk size: 0
469 470 payload: 2 bytes
470 471 part header size: 29
471 472 part type: "test:song"
472 473 part id: "5"
473 474 part parameters: 1
474 475 :test:song:
475 476 mandatory: 1
476 477 advisory: 0
477 478 payload chunk size: 0
478 479 payload: 0 bytes
479 480 part header size: 16
480 481 part type: "test:ping"
481 482 part id: "6"
482 483 part parameters: 0
483 484 :test:ping:
484 485 mandatory: 0
485 486 advisory: 0
486 487 payload chunk size: 0
487 488 payload: 0 bytes
488 489 part header size: 0
489 490 end of bundle2 stream
490 491 parts count: 7
491 492
492 493 Test actual unbundling of test part
493 494 =======================================
494 495
495 496 Process the bundle
496 497
497 498 $ hg unbundle2 --debug < ../parts.hg2
498 499 start processing of HG2X stream
499 500 reading bundle2 stream parameters
500 501 start extraction of bundle2 parts
501 502 part header size: 17
502 503 part type: "test:empty"
503 504 part id: "0"
504 505 part parameters: 0
505 506 ignoring unsupported advisory part test:empty
506 507 payload chunk size: 0
507 508 part header size: 17
508 509 part type: "test:empty"
509 510 part id: "1"
510 511 part parameters: 0
511 512 ignoring unsupported advisory part test:empty
512 513 payload chunk size: 0
513 514 part header size: 16
514 515 part type: "test:song"
515 516 part id: "2"
516 517 part parameters: 0
517 518 found a handler for part 'test:song'
518 519 The choir starts singing:
519 520 payload chunk size: 178
520 521 payload chunk size: 0
521 522 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
522 523 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
523 524 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
524 525 part header size: 22
525 526 part type: "test:debugreply"
526 527 part id: "3"
527 528 part parameters: 0
528 529 found a handler for part 'test:debugreply'
529 530 debugreply: no reply
530 531 payload chunk size: 0
531 532 part header size: 43
532 533 part type: "test:math"
533 534 part id: "4"
534 535 part parameters: 3
535 536 ignoring unsupported advisory part test:math
536 537 payload chunk size: 2
537 538 payload chunk size: 0
538 539 part header size: 29
539 540 part type: "test:song"
540 541 part id: "5"
541 542 part parameters: 1
542 543 found a handler for part 'test:song'
543 544 ignoring unsupported advisory part test:song - randomparam
544 545 payload chunk size: 0
545 546 part header size: 16
546 547 part type: "test:ping"
547 548 part id: "6"
548 549 part parameters: 0
549 550 found a handler for part 'test:ping'
550 551 received ping request (id 6)
551 552 payload chunk size: 0
552 553 part header size: 0
553 554 end of bundle2 stream
554 555 0 unread bytes
555 556 3 total verses sung
556 557
557 558 Unbundle with an unknown mandatory part
558 559 (should abort)
559 560
560 561 $ hg bundle2 --parts --unknown ../unknown.hg2
561 562
562 563 $ hg unbundle2 < ../unknown.hg2
563 564 The choir starts singing:
564 565 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
565 566 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
566 567 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
567 568 debugreply: no reply
568 569 0 unread bytes
569 570 abort: missing support for test:unknown
570 571 [255]
571 572
572 573 Unbundle with an unknown mandatory part parameters
573 574 (should abort)
574 575
575 576 $ hg bundle2 --unknownparams ../unknown.hg2
576 577
577 578 $ hg unbundle2 < ../unknown.hg2
578 579 0 unread bytes
579 580 abort: missing support for test:song - randomparams
580 581 [255]
581 582
582 583 unbundle with a reply
583 584
584 585 $ hg bundle2 --parts --reply ../parts-reply.hg2
585 586 $ hg unbundle2 ../reply.hg2 < ../parts-reply.hg2
586 587 0 unread bytes
587 588 3 total verses sung
588 589
589 590 The reply is a bundle
590 591
591 592 $ cat ../reply.hg2
592 593 HG2X\x00\x00\x00\x1f (esc)
593 594 b2x:output\x00\x00\x00\x00\x00\x01\x0b\x01in-reply-to3\x00\x00\x00\xd9The choir starts singing: (esc)
594 595 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
595 596 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
596 597 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
597 598 \x00\x00\x00\x00\x00\x1f (esc)
598 599 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to4\x00\x00\x00\xc9debugreply: capabilities: (esc)
599 600 debugreply: 'city=!'
600 601 debugreply: 'celeste,ville'
601 602 debugreply: 'elephants'
602 603 debugreply: 'babar'
603 604 debugreply: 'celeste'
604 605 debugreply: 'ping-pong'
605 606 \x00\x00\x00\x00\x00\x1e test:pong\x00\x00\x00\x02\x01\x00\x0b\x01in-reply-to7\x00\x00\x00\x00\x00\x1f (esc)
606 607 b2x:output\x00\x00\x00\x03\x00\x01\x0b\x01in-reply-to7\x00\x00\x00=received ping request (id 7) (esc)
607 608 replying to ping request (id 7)
608 609 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
609 610
610 611 The reply is valid
611 612
612 613 $ hg statbundle2 < ../reply.hg2
613 614 options count: 0
614 615 :b2x:output:
615 616 mandatory: 0
616 617 advisory: 1
617 618 payload: 217 bytes
618 619 :b2x:output:
619 620 mandatory: 0
620 621 advisory: 1
621 622 payload: 201 bytes
622 623 :test:pong:
623 624 mandatory: 1
624 625 advisory: 0
625 626 payload: 0 bytes
626 627 :b2x:output:
627 628 mandatory: 0
628 629 advisory: 1
629 630 payload: 61 bytes
630 631 parts count: 4
631 632
632 633 Unbundle the reply to get the output:
633 634
634 635 $ hg unbundle2 < ../reply.hg2
635 636 remote: The choir starts singing:
636 637 remote: Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
637 638 remote: Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
638 639 remote: Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
639 640 remote: debugreply: capabilities:
640 641 remote: debugreply: 'city=!'
641 642 remote: debugreply: 'celeste,ville'
642 643 remote: debugreply: 'elephants'
643 644 remote: debugreply: 'babar'
644 645 remote: debugreply: 'celeste'
645 646 remote: debugreply: 'ping-pong'
646 647 remote: received ping request (id 7)
647 648 remote: replying to ping request (id 7)
648 649 0 unread bytes
649 650
650 651 Test push race detection
651 652
652 653 $ hg bundle2 --pushrace ../part-race.hg2
653 654
654 655 $ hg unbundle2 < ../part-race.hg2
655 656 0 unread bytes
656 657 abort: push race: repository changed while pushing - please try again
657 658 [255]
658 659
659 660 Support for changegroup
660 661 ===================================
661 662
662 663 $ hg unbundle $TESTDIR/bundles/rebase.hg
663 664 adding changesets
664 665 adding manifests
665 666 adding file changes
666 667 added 8 changesets with 7 changes to 7 files (+3 heads)
667 668 (run 'hg heads' to see heads, 'hg merge' to merge)
668 669
669 670 $ hg log -G
670 671 o 8:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
671 672 |
672 673 | o 7:eea13746799a draft Nicolas Dumazet <nicdumz.commits@gmail.com> G
673 674 |/|
674 675 o | 6:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
675 676 | |
676 677 | o 5:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
677 678 |/
678 679 | o 4:32af7686d403 draft Nicolas Dumazet <nicdumz.commits@gmail.com> D
679 680 | |
680 681 | o 3:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
681 682 | |
682 683 | o 2:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
683 684 |/
684 685 o 1:cd010b8cd998 draft Nicolas Dumazet <nicdumz.commits@gmail.com> A
685 686
686 687 @ 0:3903775176ed draft test a
687 688
688 689
689 690 $ hg bundle2 --debug --rev '8+7+5+4' ../rev.hg2
690 691 4 changesets found
691 692 list of changesets:
692 693 32af7686d403cf45b5d95f2d70cebea587ac806a
693 694 9520eea781bcca16c1e15acc0ba14335a0e8e5ba
694 695 eea13746799a9e0bfd88f29d3c2e9dc9389f524f
695 696 02de42196ebee42ef284b6780a87cdc96e8eaab6
696 697 start emission of HG2X stream
697 698 bundle parameter:
698 699 start of parts
699 700 bundle part: "b2x:changegroup"
700 701 bundling: 1/4 changesets (25.00%)
701 702 bundling: 2/4 changesets (50.00%)
702 703 bundling: 3/4 changesets (75.00%)
703 704 bundling: 4/4 changesets (100.00%)
704 705 bundling: 1/4 manifests (25.00%)
705 706 bundling: 2/4 manifests (50.00%)
706 707 bundling: 3/4 manifests (75.00%)
707 708 bundling: 4/4 manifests (100.00%)
708 709 bundling: D 1/3 files (33.33%)
709 710 bundling: E 2/3 files (66.67%)
710 711 bundling: H 3/3 files (100.00%)
711 712 end of bundle
712 713
713 714 $ cat ../rev.hg2
714 715 HG2X\x00\x00\x00\x16\x0fb2x:changegroup\x00\x00\x00\x00\x00\x00\x00\x00\x06\x13\x00\x00\x00\xa42\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c (esc)
715 716 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02D (esc)
716 717 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01D\x00\x00\x00\xa4\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xcd\x01\x0b\x8c\xd9\x98\xf3\x98\x1aZ\x81\x15\xf9O\x8d\xa4\xabP`\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)4dece9c826f69490507b98c6383a3009b295837d (esc)
717 718 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02E (esc)
718 719 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01E\x00\x00\x00\xa2\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)365b93d57fdf4814e2b5911d6bacff2b12014441 (esc)
719 720 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01G\x00\x00\x00\xa4\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
720 721 \x87\xcd\xc9n\x8e\xaa\xb6$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
721 722 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)8bee48edc7318541fc0013ee41b089276a8c24bf (esc)
722 723 \x00\x00\x00f\x00\x00\x00f\x00\x00\x00\x02H (esc)
723 724 \x00\x00\x00g\x00\x00\x00h\x00\x00\x00\x01H\x00\x00\x00\x00\x00\x00\x00\x8bn\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0cf\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+D\x00c3f1ca2924c16a19b0656a84900e504e5b0aec2d (esc)
724 725 \x00\x00\x00\x8bM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\x00}\x8c\x9d\x88\x84\x13%\xf5\xc6\xb0cq\xb3[N\x8a+\x1a\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00+\x00\x00\x00\xac\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
725 726 \x00\x00\x00\x8b6[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xceM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00V\x00\x00\x00V\x00\x00\x00+F\x0022bfcfd62a21a3287edbd4d656218d0f525ed76a (esc)
726 727 \x00\x00\x00\x97\x8b\xeeH\xed\xc71\x85A\xfc\x00\x13\xeeA\xb0\x89'j\x8c$\xbf(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
727 728 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00+\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+H\x008500189e74a9e0475e822093bc7db0d631aeb0b4 (esc)
728 729 \x00\x00\x00\x00\x00\x00\x00\x05D\x00\x00\x00b\xc3\xf1\xca)$\xc1j\x19\xb0ej\x84\x90\x0ePN[ (esc)
729 730 \xec-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02D (esc)
730 731 \x00\x00\x00\x00\x00\x00\x00\x05E\x00\x00\x00b\x9co\xd05 (esc)
731 732 l\r (no-eol) (esc)
732 733 \x0cI\xd4\xa9\xc5\x01|\xf0pC\xf5NX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02E (esc)
733 734 \x00\x00\x00\x00\x00\x00\x00\x05H\x00\x00\x00b\x85\x00\x18\x9et\xa9\xe0G^\x82 \x93\xbc}\xb0\xd61\xae\xb0\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
734 735 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
735 736 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
736 737
737 738 $ hg unbundle2 < ../rev.hg2
738 739 adding changesets
739 740 adding manifests
740 741 adding file changes
741 742 added 0 changesets with 0 changes to 3 files
742 743 0 unread bytes
743 744 addchangegroup return: 1
744 745
745 746 with reply
746 747
747 748 $ hg bundle2 --rev '8+7+5+4' --reply ../rev-rr.hg2
748 749 $ hg unbundle2 ../rev-reply.hg2 < ../rev-rr.hg2
749 750 0 unread bytes
750 751 addchangegroup return: 1
751 752
752 753 $ cat ../rev-reply.hg2
753 754 HG2X\x00\x00\x003\x15b2x:reply:changegroup\x00\x00\x00\x00\x00\x02\x0b\x01\x06\x01in-reply-to1return1\x00\x00\x00\x00\x00\x1f (esc)
754 755 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to1\x00\x00\x00dadding changesets (esc)
755 756 adding manifests
756 757 adding file changes
757 758 added 0 changesets with 0 changes to 3 files
758 759 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
759 760
760 761 Real world exchange
761 762 =====================
762 763
763 764
764 765 clone --pull
765 766
766 767 $ cd ..
767 768 $ hg -R main phase --public cd010b8cd998
768 769 $ hg clone main other --pull --rev 9520eea781bc
769 770 adding changesets
770 771 adding manifests
771 772 adding file changes
772 773 added 2 changesets with 2 changes to 2 files
773 774 updating to branch default
774 775 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
775 776 $ hg -R other log -G
776 777 @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
777 778 |
778 779 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
779 780
780 781
781 782 pull
782 783
783 784 $ hg -R main phase --public 9520eea781bc
784 785 $ hg -R other pull -r 24b6387c8c8c
785 786 pulling from $TESTTMP/main (glob)
786 787 searching for changes
787 788 adding changesets
788 789 adding manifests
789 790 adding file changes
790 791 added 1 changesets with 1 changes to 1 files (+1 heads)
791 792 (run 'hg heads' to see heads, 'hg merge' to merge)
792 793 $ hg -R other log -G
793 794 o 2:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
794 795 |
795 796 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
796 797 |/
797 798 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
798 799
799 800
800 801 pull empty (with phase movement)
801 802
802 803 $ hg -R main phase --public 24b6387c8c8c
803 804 $ hg -R other pull -r 24b6387c8c8c
804 805 pulling from $TESTTMP/main (glob)
805 806 no changes found
806 807 $ hg -R other log -G
807 808 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
808 809 |
809 810 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
810 811 |/
811 812 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
812 813
813 814 pull empty
814 815
815 816 $ hg -R other pull -r 24b6387c8c8c
816 817 pulling from $TESTTMP/main (glob)
817 818 no changes found
818 819 $ hg -R other log -G
819 820 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
820 821 |
821 822 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
822 823 |/
823 824 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
824 825
825 826
826 827 push
827 828
828 829 $ hg -R main phase --public eea13746799a
829 830 $ hg -R main push other --rev eea13746799a
830 831 pushing to other
831 832 searching for changes
832 833 remote: adding changesets
833 834 remote: adding manifests
834 835 remote: adding file changes
835 836 remote: added 1 changesets with 0 changes to 0 files (-1 heads)
836 837 $ hg -R other log -G
837 838 o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
838 839 |\
839 840 | o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
840 841 | |
841 842 @ | 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
842 843 |/
843 844 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
844 845
845 846
846 847 pull over ssh
847 848
848 849 $ hg -R other pull ssh://user@dummy/main -r 02de42196ebe --traceback
849 850 pulling from ssh://user@dummy/main
850 851 searching for changes
851 852 adding changesets
852 853 adding manifests
853 854 adding file changes
854 855 added 1 changesets with 1 changes to 1 files (+1 heads)
855 856 (run 'hg heads' to see heads, 'hg merge' to merge)
856 857
857 858 pull over http
858 859
859 860 $ hg -R main serve -p $HGPORT -d --pid-file=main.pid -E main-error.log
860 861 $ cat main.pid >> $DAEMON_PIDS
861 862
862 863 $ hg -R other pull http://localhost:$HGPORT/ -r 42ccdea3bb16
863 864 pulling from http://localhost:$HGPORT/
864 865 searching for changes
865 866 adding changesets
866 867 adding manifests
867 868 adding file changes
868 869 added 1 changesets with 1 changes to 1 files (+1 heads)
869 870 (run 'hg heads .' to see heads, 'hg merge' to merge)
870 871 $ cat main-error.log
871 872
872 873 push over ssh
873 874
874 875 $ hg -R main push ssh://user@dummy/other -r 5fddd98957c8
875 876 pushing to ssh://user@dummy/other
876 877 searching for changes
877 878 remote: adding changesets
878 879 remote: adding manifests
879 880 remote: adding file changes
880 881 remote: added 1 changesets with 1 changes to 1 files
881 882 $ hg -R other log -G
882 883 o 6:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
883 884 |
884 885 o 5:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
885 886 |
886 887 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
887 888 | |
888 889 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
889 890 | |/|
890 891 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
891 892 |/ /
892 893 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
893 894 |/
894 895 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
895 896
896 897
897 898 push over http
898 899
899 900 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
900 901 $ cat other.pid >> $DAEMON_PIDS
901 902
902 903 $ hg -R main phase --public 32af7686d403
903 904 $ hg -R main push http://localhost:$HGPORT2/ -r 32af7686d403
904 905 pushing to http://localhost:$HGPORT2/
905 906 searching for changes
906 907 remote: adding changesets
907 908 remote: adding manifests
908 909 remote: adding file changes
909 910 remote: added 1 changesets with 1 changes to 1 files
910 911 $ cat other-error.log
911 912
912 913 Check final content.
913 914
914 915 $ hg -R other log -G
915 916 o 7:32af7686d403 public Nicolas Dumazet <nicdumz.commits@gmail.com> D
916 917 |
917 918 o 6:5fddd98957c8 public Nicolas Dumazet <nicdumz.commits@gmail.com> C
918 919 |
919 920 o 5:42ccdea3bb16 public Nicolas Dumazet <nicdumz.commits@gmail.com> B
920 921 |
921 922 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
922 923 | |
923 924 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
924 925 | |/|
925 926 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
926 927 |/ /
927 928 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
928 929 |/
929 930 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
930 931
931 932
932 933 Error Handling
933 934 ==============
934 935
935 936 Check that errors are properly returned to the client during push.
936 937
937 938 Setting up
938 939
939 940 $ cat > failpush.py << EOF
940 941 > """A small extension that makes push fails when using bundle2
941 942 >
942 943 > used to test error handling in bundle2
943 944 > """
944 945 >
945 946 > from mercurial import util
946 947 > from mercurial import bundle2
947 948 > from mercurial import exchange
948 949 > from mercurial import extensions
949 950 >
950 951 > def _pushbundle2failpart(pushop, bundler):
951 952 > reason = pushop.ui.config('failpush', 'reason', None)
952 953 > part = None
953 954 > if reason == 'abort':
954 955 > bundler.newpart('test:abort')
955 956 > if reason == 'unknown':
956 957 > bundler.newpart('TEST:UNKNOWN')
957 958 > if reason == 'race':
958 959 > # 20 Bytes of crap
959 960 > bundler.newpart('b2x:check:heads', data='01234567890123456789')
960 961 >
961 962 > @bundle2.parthandler("test:abort")
962 963 > def handleabort(op, part):
963 964 > raise util.Abort('Abandon ship!', hint="don't panic")
964 965 >
965 966 > def uisetup(ui):
966 967 > exchange.bundle2partsgenerators.insert(0, _pushbundle2failpart)
967 968 >
968 969 > EOF
969 970
970 971 $ cd main
971 972 $ hg up tip
972 973 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
973 974 $ echo 'I' > I
974 975 $ hg add I
975 976 $ hg ci -m 'I'
976 977 $ hg id
977 978 e7ec4e813ba6 tip
978 979 $ cd ..
979 980
980 981 $ cat << EOF >> $HGRCPATH
981 982 > [extensions]
982 983 > failpush=$TESTTMP/failpush.py
983 984 > EOF
984 985
985 986 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
986 987 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
987 988 $ cat other.pid >> $DAEMON_PIDS
988 989
989 990 Doing the actual push: Abort error
990 991
991 992 $ cat << EOF >> $HGRCPATH
992 993 > [failpush]
993 994 > reason = abort
994 995 > EOF
995 996
996 997 $ hg -R main push other -r e7ec4e813ba6
997 998 pushing to other
998 999 searching for changes
999 1000 abort: Abandon ship!
1000 1001 (don't panic)
1001 1002 [255]
1002 1003
1003 1004 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1004 1005 pushing to ssh://user@dummy/other
1005 1006 searching for changes
1006 1007 abort: Abandon ship!
1007 1008 (don't panic)
1008 1009 [255]
1009 1010
1010 1011 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1011 1012 pushing to http://localhost:$HGPORT2/
1012 1013 searching for changes
1013 1014 abort: Abandon ship!
1014 1015 (don't panic)
1015 1016 [255]
1016 1017
1017 1018
1018 1019 Doing the actual push: unknown mandatory parts
1019 1020
1020 1021 $ cat << EOF >> $HGRCPATH
1021 1022 > [failpush]
1022 1023 > reason = unknown
1023 1024 > EOF
1024 1025
1025 1026 $ hg -R main push other -r e7ec4e813ba6
1026 1027 pushing to other
1027 1028 searching for changes
1028 1029 abort: missing support for test:unknown
1029 1030 [255]
1030 1031
1031 1032 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1032 1033 pushing to ssh://user@dummy/other
1033 1034 searching for changes
1034 1035 abort: missing support for test:unknown
1035 1036 [255]
1036 1037
1037 1038 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1038 1039 pushing to http://localhost:$HGPORT2/
1039 1040 searching for changes
1040 1041 abort: missing support for test:unknown
1041 1042 [255]
1042 1043
1043 1044 Doing the actual push: race
1044 1045
1045 1046 $ cat << EOF >> $HGRCPATH
1046 1047 > [failpush]
1047 1048 > reason = race
1048 1049 > EOF
1049 1050
1050 1051 $ hg -R main push other -r e7ec4e813ba6
1051 1052 pushing to other
1052 1053 searching for changes
1053 1054 abort: push failed:
1054 1055 'repository changed while pushing - please try again'
1055 1056 [255]
1056 1057
1057 1058 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1058 1059 pushing to ssh://user@dummy/other
1059 1060 searching for changes
1060 1061 abort: push failed:
1061 1062 'repository changed while pushing - please try again'
1062 1063 [255]
1063 1064
1064 1065 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1065 1066 pushing to http://localhost:$HGPORT2/
1066 1067 searching for changes
1067 1068 abort: push failed:
1068 1069 'repository changed while pushing - please try again'
1069 1070 [255]
1070 1071
1071 1072 Doing the actual push: hook abort
1072 1073
1073 1074 $ cat << EOF >> $HGRCPATH
1074 1075 > [failpush]
1075 1076 > reason =
1076 1077 > [hooks]
1077 1078 > b2x-pretransactionclose.failpush = false
1078 1079 > EOF
1079 1080
1080 1081 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1081 1082 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
1082 1083 $ cat other.pid >> $DAEMON_PIDS
1083 1084
1084 1085 $ hg -R main push other -r e7ec4e813ba6
1085 1086 pushing to other
1086 1087 searching for changes
1087 1088 transaction abort!
1088 1089 rollback completed
1089 1090 abort: b2x-pretransactionclose.failpush hook exited with status 1
1090 1091 [255]
1091 1092
1092 1093 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1093 1094 pushing to ssh://user@dummy/other
1094 1095 searching for changes
1095 1096 abort: b2x-pretransactionclose.failpush hook exited with status 1
1096 1097 remote: transaction abort!
1097 1098 remote: rollback completed
1098 1099 [255]
1099 1100
1100 1101 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1101 1102 pushing to http://localhost:$HGPORT2/
1102 1103 searching for changes
1103 1104 abort: b2x-pretransactionclose.failpush hook exited with status 1
1104 1105 [255]
1105 1106
1106 1107
General Comments 0
You need to be logged in to leave comments. Login now