13 > from mercurial import util |
13 > from mercurial import util |
14 > from mercurial import bundle2 |
14 > from mercurial import bundle2 |
15 > from mercurial import scmutil |
15 > from mercurial import scmutil |
16 > from mercurial import discovery |
16 > from mercurial import discovery |
17 > from mercurial import changegroup |
17 > from mercurial import changegroup |
|
18 > from mercurial import error |
18 > cmdtable = {} |
19 > cmdtable = {} |
19 > command = cmdutil.command(cmdtable) |
20 > command = cmdutil.command(cmdtable) |
20 > |
21 > |
21 > ELEPHANTSSONG = """Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko |
22 > ELEPHANTSSONG = """Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko |
22 > Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko |
23 > Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko |
57 > @command('bundle2', |
58 > @command('bundle2', |
58 > [('', 'param', [], 'stream level parameter'), |
59 > [('', 'param', [], 'stream level parameter'), |
59 > ('', 'unknown', False, 'include an unknown mandatory part in the bundle'), |
60 > ('', 'unknown', False, 'include an unknown mandatory part in the bundle'), |
60 > ('', 'parts', False, 'include some arbitrary parts to the bundle'), |
61 > ('', 'parts', False, 'include some arbitrary parts to the bundle'), |
61 > ('', 'reply', False, 'produce a reply bundle'), |
62 > ('', 'reply', False, 'produce a reply bundle'), |
|
63 > ('', 'pushrace', False, 'includes a check:head part with unknown nodes'), |
62 > ('r', 'rev', [], 'includes those changeset in the bundle'),], |
64 > ('r', 'rev', [], 'includes those changeset in the bundle'),], |
63 > '[OUTPUTFILE]') |
65 > '[OUTPUTFILE]') |
64 > def cmdbundle2(ui, repo, path=None, **opts): |
66 > def cmdbundle2(ui, repo, path=None, **opts): |
65 > """write a bundle2 container on standard ouput""" |
67 > """write a bundle2 container on standard ouput""" |
66 > bundler = bundle2.bundle20(ui) |
68 > bundler = bundle2.bundle20(ui) |
72 > raise util.Abort('%s' % exc) |
74 > raise util.Abort('%s' % exc) |
73 > |
75 > |
74 > if opts['reply']: |
76 > if opts['reply']: |
75 > capsstring = 'ping-pong\nelephants=babar,celeste\ncity%3D%21=celeste%2Cville' |
77 > capsstring = 'ping-pong\nelephants=babar,celeste\ncity%3D%21=celeste%2Cville' |
76 > bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsstring)) |
78 > bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsstring)) |
|
79 > |
|
80 > if opts['pushrace']: |
|
81 > dummynode = '01234567890123456789' |
|
82 > bundler.addpart(bundle2.bundlepart('b2x:check:heads', data=dummynode)) |
77 > |
83 > |
78 > revs = opts['rev'] |
84 > revs = opts['rev'] |
79 > if 'rev' in opts: |
85 > if 'rev' in opts: |
80 > revs = scmutil.revrange(repo, opts['rev']) |
86 > revs = scmutil.revrange(repo, opts['rev']) |
81 > if revs: |
87 > if revs: |
130 > unbundler = bundle2.unbundle20(ui, sys.stdin) |
136 > unbundler = bundle2.unbundle20(ui, sys.stdin) |
131 > op = bundle2.processbundle(repo, unbundler, lambda: tr) |
137 > op = bundle2.processbundle(repo, unbundler, lambda: tr) |
132 > tr.close() |
138 > tr.close() |
133 > except KeyError, exc: |
139 > except KeyError, exc: |
134 > raise util.Abort('missing support for %s' % exc) |
140 > raise util.Abort('missing support for %s' % exc) |
|
141 > except error.PushRaced, exc: |
|
142 > raise util.Abort('push race') |
135 > finally: |
143 > finally: |
136 > if tr is not None: |
144 > if tr is not None: |
137 > tr.release() |
145 > tr.release() |
138 > lock.release() |
146 > lock.release() |
139 > remains = sys.stdin.read() |
147 > remains = sys.stdin.read() |
598 remote: debugreply: 'celeste' |
606 remote: debugreply: 'celeste' |
599 remote: debugreply: 'ping-pong' |
607 remote: debugreply: 'ping-pong' |
600 remote: received ping request (id 6) |
608 remote: received ping request (id 6) |
601 remote: replying to ping request (id 6) |
609 remote: replying to ping request (id 6) |
602 0 unread bytes |
610 0 unread bytes |
|
611 |
|
612 Test push race detection |
|
613 |
|
614 $ hg bundle2 --pushrace ../part-race.hg2 |
|
615 |
|
616 $ hg unbundle2 < ../part-race.hg2 |
|
617 0 unread bytes |
|
618 abort: push race |
|
619 [255] |
603 |
620 |
604 Support for changegroup |
621 Support for changegroup |
605 =================================== |
622 =================================== |
606 |
623 |
607 $ hg unbundle $TESTDIR/bundles/rebase.hg |
624 $ hg unbundle $TESTDIR/bundles/rebase.hg |