Mercurial > evolve
comparison hgext/evolve.py @ 957:2cde59f3cb5d
evolve: add a push pass using bundle2
Instead of using a dedicated wireprotocol commands, we use bundle2 to transmit
an obs marker parts. This aims at both testing bundle2 more and to limit the
amount of special code we needs to put in simple for server to fit our needs.
The massive test changes comes from the fact we can use this fast path for both
remote and local push.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Tue, 20 May 2014 13:41:27 -0700 |
parents | b107f3549ec2 |
children | 6d18a1ab496c |
comparison
equal
deleted
inserted
replaced
956:b107f3549ec2 | 957:2cde59f3cb5d |
---|---|
64 from mercurial.commands import walkopts, commitopts, commitopts2 | 64 from mercurial.commands import walkopts, commitopts, commitopts2 |
65 from mercurial.node import nullid | 65 from mercurial.node import nullid |
66 from mercurial import wireproto | 66 from mercurial import wireproto |
67 from mercurial import localrepo | 67 from mercurial import localrepo |
68 from mercurial.hgweb import hgweb_mod | 68 from mercurial.hgweb import hgweb_mod |
69 from mercurial import bundle2 | |
69 | 70 |
70 _pack = struct.pack | 71 _pack = struct.pack |
71 | 72 |
72 if gboptsmap is not None: | 73 if gboptsmap is not None: |
73 memfilectx = context.memfilectx | 74 memfilectx = context.memfilectx |
2273 else: | 2274 else: |
2274 repo.ui.status("OBSEXC: markers already in sync\n") | 2275 repo.ui.status("OBSEXC: markers already in sync\n") |
2275 markers = [] | 2276 markers = [] |
2276 if not markers: | 2277 if not markers: |
2277 repo.ui.status("OBSEXC: no marker to push\n") | 2278 repo.ui.status("OBSEXC: no marker to push\n") |
2279 elif remote.capable('_evoext_b2x_obsmarkers_0_pushonly'): | |
2280 obsdata = StringIO() | |
2281 _encodemarkersstream(obsdata, markers) | |
2282 obsdata.seek(0) | |
2283 repo.ui.status("OBSEXC: pushing %i markers (%i bytes)\n" | |
2284 % (len(markers), len(obsdata.getvalue()))) | |
2285 bundler = bundle2.bundle20(pushop.ui, {}) | |
2286 capsblob = bundle2.encodecaps(pushop.repo.bundle2caps) | |
2287 bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsblob)) | |
2288 cgpart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1', data=obsdata.getvalue()) | |
2289 bundler.addpart(cgpart) | |
2290 stream = util.chunkbuffer(bundler.getchunks()) | |
2291 try: | |
2292 reply = pushop.remote.unbundle(stream, ['force'], 'push') | |
2293 except bundle2.UnknownPartError, exc: | |
2294 raise util.Abort('missing support for %s' % exc) | |
2295 try: | |
2296 op = bundle2.processbundle(pushop.repo, reply) | |
2297 except bundle2.UnknownPartError, exc: | |
2298 raise util.Abort('missing support for %s' % exc) | |
2278 elif remote.capable('_evoext_pushobsmarkers_0'): | 2299 elif remote.capable('_evoext_pushobsmarkers_0'): |
2279 obsdata = pushobsmarkerStringIO() | 2300 obsdata = pushobsmarkerStringIO() |
2280 _encodemarkersstream(obsdata, markers) | 2301 _encodemarkersstream(obsdata, markers) |
2281 obsdata.seek(0) | 2302 obsdata.seek(0) |
2282 obsdata.ui = repo.ui | 2303 obsdata.ui = repo.ui |
2345 tr.release() | 2366 tr.release() |
2346 finally: | 2367 finally: |
2347 lock.release() | 2368 lock.release() |
2348 repo.hook('evolve_pushobsmarkers') | 2369 repo.hook('evolve_pushobsmarkers') |
2349 return wireproto.pushres(0) | 2370 return wireproto.pushres(0) |
2371 | |
2372 @bundle2.parthandler('evolve:b2x:obsmarkerv1') | |
2373 def handleobsmarkerv1(op, inpart): | |
2374 """add a stream of obsmarker to the repo""" | |
2375 tr = op.gettransaction() | |
2376 op.repo.obsstore.mergemarkers(tr, inpart.read()) | |
2350 | 2377 |
2351 def _buildpullobsmerkersboundaries(pullop): | 2378 def _buildpullobsmerkersboundaries(pullop): |
2352 """small funtion returning the argument for pull markers call | 2379 """small funtion returning the argument for pull markers call |
2353 may to contains 'heads' and 'common'. skip the key for None. | 2380 may to contains 'heads' and 'common'. skip the key for None. |
2354 | 2381 |
2580 caps = orig(repo, proto) | 2607 caps = orig(repo, proto) |
2581 if obsolete._enabled: | 2608 if obsolete._enabled: |
2582 caps += ' _evoext_pushobsmarkers_0' | 2609 caps += ' _evoext_pushobsmarkers_0' |
2583 caps += ' _evoext_pullobsmarkers_0' | 2610 caps += ' _evoext_pullobsmarkers_0' |
2584 caps += ' _evoext_obshash_0' | 2611 caps += ' _evoext_obshash_0' |
2612 caps += ' _evoext_b2x_obsmarkers_0_pushonly' | |
2585 return caps | 2613 return caps |
2586 | 2614 |
2587 | 2615 |
2588 @eh.extsetup | 2616 @eh.extsetup |
2589 def _installwireprotocol(ui): | 2617 def _installwireprotocol(ui): |
2590 localrepo.moderncaps.add('_evoext_pullobsmarkers_0') | 2618 localrepo.moderncaps.add('_evoext_pullobsmarkers_0') |
2619 localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0_pushonly') | |
2591 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push' | 2620 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push' |
2592 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull' | 2621 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull' |
2593 hgweb_mod.perms['evoext_obshash'] = 'pull' | 2622 hgweb_mod.perms['evoext_obshash'] = 'pull' |
2594 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '') | 2623 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '') |
2595 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*') | 2624 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*') |