comparison mercurial/exchange.py @ 46713:bc2519513ae0

sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos Each repo will advertise the sidedata categories it requires (categories being unique and canonical), and have a set of "computers", functions to generate sidedata from `(repo, revlog, rev, previous_sidedata)`, for a given category. The set of computers can be a superset of the set of the wanted categories, but not smaller: repos are expected to be coherent in their handling of sidedata. Differential Revision: https://phab.mercurial-scm.org/D10028
author Raphaël Gomès <rgomes@octobus.net>
date Fri, 19 Feb 2021 10:53:27 +0100
parents a41565bef69f
children 6266d19556ad
comparison
equal deleted inserted replaced
46712:e8c11a2c96c0 46713:bc2519513ae0
418 _( 418 _(
419 b'cannot push: destination does not support the ' 419 b'cannot push: destination does not support the '
420 b'unbundle wire protocol command' 420 b'unbundle wire protocol command'
421 ) 421 )
422 ) 422 )
423 423 for category in sorted(bundle2.read_remote_wanted_sidedata(pushop.remote)):
424 # Check that a computer is registered for that category for at least
425 # one revlog kind.
426 for kind, computers in repo._sidedata_computers.items():
427 if computers.get(category):
428 break
429 else:
430 raise error.Abort(
431 _(
432 b'cannot push: required sidedata category not supported'
433 b" by this client: '%s'"
434 )
435 % pycompat.bytestr(category)
436 )
424 # get lock as we might write phase data 437 # get lock as we might write phase data
425 wlock = lock = None 438 wlock = lock = None
426 try: 439 try:
427 # bundle2 push may receive a reply bundle touching bookmarks 440 # bundle2 push may receive a reply bundle touching bookmarks
428 # requiring the wlock. Take it now to ensure proper ordering. 441 # requiring the wlock. Take it now to ensure proper ordering.
863 if v in changegroup.supportedoutgoingversions(pushop.repo) 876 if v in changegroup.supportedoutgoingversions(pushop.repo)
864 ] 877 ]
865 if not cgversions: 878 if not cgversions:
866 raise error.Abort(_(b'no common changegroup version')) 879 raise error.Abort(_(b'no common changegroup version'))
867 version = max(cgversions) 880 version = max(cgversions)
881
882 remote_sidedata = bundle2.read_remote_wanted_sidedata(pushop.remote)
868 cgstream = changegroup.makestream( 883 cgstream = changegroup.makestream(
869 pushop.repo, pushop.outgoing, version, b'push' 884 pushop.repo,
885 pushop.outgoing,
886 version,
887 b'push',
888 bundlecaps=b2caps,
889 remote_sidedata=remote_sidedata,
870 ) 890 )
871 cgpart = bundler.newpart(b'changegroup', data=cgstream) 891 cgpart = bundler.newpart(b'changegroup', data=cgstream)
872 if cgversions: 892 if cgversions:
873 cgpart.addparam(b'version', version) 893 cgpart.addparam(b'version', version)
874 if scmutil.istreemanifest(pushop.repo): 894 if scmutil.istreemanifest(pushop.repo):
1605 b" supported in the destination:" 1625 b" supported in the destination:"
1606 b" %s" 1626 b" %s"
1607 ) % (b', '.join(sorted(missing))) 1627 ) % (b', '.join(sorted(missing)))
1608 raise error.Abort(msg) 1628 raise error.Abort(msg)
1609 1629
1630 for category in repo._wanted_sidedata:
1631 # Check that a computer is registered for that category for at least
1632 # one revlog kind.
1633 for kind, computers in repo._sidedata_computers.items():
1634 if computers.get(category):
1635 break
1636 else:
1637 # This should never happen since repos are supposed to be able to
1638 # generate the sidedata they require.
1639 raise error.ProgrammingError(
1640 _(
1641 b'sidedata category requested by local side without local'
1642 b"support: '%s'"
1643 )
1644 % pycompat.bytestr(category)
1645 )
1646
1610 pullop.trmanager = transactionmanager(repo, b'pull', remote.url()) 1647 pullop.trmanager = transactionmanager(repo, b'pull', remote.url())
1611 wlock = util.nullcontextmanager() 1648 wlock = util.nullcontextmanager()
1612 if not bookmod.bookmarksinstore(repo): 1649 if not bookmod.bookmarksinstore(repo):
1613 wlock = repo.wlock() 1650 wlock = repo.wlock()
1614 with wlock, repo.lock(), pullop.trmanager: 1651 with wlock, repo.lock(), pullop.trmanager:
1817 remoteversions = bundle2.obsmarkersversion(pullop.remotebundle2caps) 1854 remoteversions = bundle2.obsmarkersversion(pullop.remotebundle2caps)
1818 if obsolete.commonversion(remoteversions) is not None: 1855 if obsolete.commonversion(remoteversions) is not None:
1819 kwargs[b'obsmarkers'] = True 1856 kwargs[b'obsmarkers'] = True
1820 pullop.stepsdone.add(b'obsmarkers') 1857 pullop.stepsdone.add(b'obsmarkers')
1821 _pullbundle2extraprepare(pullop, kwargs) 1858 _pullbundle2extraprepare(pullop, kwargs)
1859
1860 remote_sidedata = bundle2.read_remote_wanted_sidedata(pullop.remote)
1861 if remote_sidedata:
1862 kwargs[b'remote_sidedata'] = remote_sidedata
1822 1863
1823 with pullop.remote.commandexecutor() as e: 1864 with pullop.remote.commandexecutor() as e:
1824 args = dict(kwargs) 1865 args = dict(kwargs)
1825 args[b'source'] = b'pull' 1866 args[b'source'] = b'pull'
1826 bundle = e.callcommand(b'getbundle', args).result() 1867 bundle = e.callcommand(b'getbundle', args).result()
2386 if scmutil.istreemanifest(repo): 2427 if scmutil.istreemanifest(repo):
2387 part.addparam(b'treemanifest', b'1') 2428 part.addparam(b'treemanifest', b'1')
2388 2429
2389 if b'exp-sidedata-flag' in repo.requirements: 2430 if b'exp-sidedata-flag' in repo.requirements:
2390 part.addparam(b'exp-sidedata', b'1') 2431 part.addparam(b'exp-sidedata', b'1')
2432 sidedata = bundle2.format_remote_wanted_sidedata(repo)
2433 part.addparam(b'exp-wanted-sidedata', sidedata)
2391 2434
2392 if ( 2435 if (
2393 kwargs.get('narrow', False) 2436 kwargs.get('narrow', False)
2394 and kwargs.get('narrow_acl', False) 2437 and kwargs.get('narrow_acl', False)
2395 and (include or exclude) 2438 and (include or exclude)