Mercurial > hg-stable
comparison mercurial/exchange.py @ 46726: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
46725:e8c11a2c96c0 | 46726: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) |