Mercurial > public > mercurial-scm > hg
comparison mercurial/bundle2.py @ 50521:58adcabc295f
stream-clone: introduce the notion of an experimental "v3" version
We introduce a new experimental "v3" stream protocol, disabled by default. In
practice the "v3-exp" protocol introduced in this changeset is identical to v2,
but this changeset, lay the groundwork for having a new protocol:
configuration, capability exchange, test coverage, etc.
The actual protocol work will starts in the coming changesets.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 19 May 2023 14:49:50 +0200 |
parents | 3c0da0fa0eed |
children | 116da6bb7e3b |
comparison
equal
deleted
inserted
replaced
50520:a6543983b8f4 | 50521:58adcabc295f |
---|---|
1669 if not streamsupported or not featuresupported: | 1669 if not streamsupported or not featuresupported: |
1670 caps.pop(b'stream') | 1670 caps.pop(b'stream') |
1671 # Else always advertise support on client, because payload support | 1671 # Else always advertise support on client, because payload support |
1672 # should always be advertised. | 1672 # should always be advertised. |
1673 | 1673 |
1674 if repo.ui.configbool(b'experimental', b'stream-v3'): | |
1675 if b'stream' in caps: | |
1676 caps[b'stream'] += (b'v3-exp',) | |
1677 | |
1674 # b'rev-branch-cache is no longer advertised, but still supported | 1678 # b'rev-branch-cache is no longer advertised, but still supported |
1675 # for legacy clients. | 1679 # for legacy clients. |
1676 | 1680 |
1677 return caps | 1681 return caps |
1678 | 1682 |
1890 msg = _( | 1894 msg = _( |
1891 b'stream data requested but supported streaming clone versions were not specified' | 1895 b'stream data requested but supported streaming clone versions were not specified' |
1892 ) | 1896 ) |
1893 hint = _(b'the client seems buggy') | 1897 hint = _(b'the client seems buggy') |
1894 raise error.Abort(msg, hint=hint) | 1898 raise error.Abort(msg, hint=hint) |
1895 if not (b'v2' in bundler.capabilities[b'stream']): | 1899 client_supported = set(bundler.capabilities[b'stream']) |
1896 raise error.Abort(_(b'the client does not support streamclone v2')) | 1900 server_supported = set(getrepocaps(repo, role=b'client').get(b'stream', [])) |
1901 common_supported = client_supported & server_supported | |
1902 if not common_supported: | |
1903 msg = _(b'no common supported version with the client: %s; %s') | |
1904 str_server = b','.join(sorted(server_supported)) | |
1905 str_client = b','.join(sorted(client_supported)) | |
1906 msg %= (str_server, str_client) | |
1907 raise error.Abort(msg) | |
1908 version = max(common_supported) | |
1897 | 1909 |
1898 # Stream clones don't compress well. And compression undermines a | 1910 # Stream clones don't compress well. And compression undermines a |
1899 # goal of stream clones, which is to be fast. Communicate the desire | 1911 # goal of stream clones, which is to be fast. Communicate the desire |
1900 # to avoid compression to consumers of the bundle. | 1912 # to avoid compression to consumers of the bundle. |
1901 bundler.prefercompressed = False | 1913 bundler.prefercompressed = False |
1922 ) | 1934 ) |
1923 ) | 1935 ) |
1924 elif repo.obsstore._version in remoteversions: | 1936 elif repo.obsstore._version in remoteversions: |
1925 includeobsmarkers = True | 1937 includeobsmarkers = True |
1926 | 1938 |
1927 filecount, bytecount, it = streamclone.generatev2( | 1939 if version == b"v2": |
1928 repo, includepats, excludepats, includeobsmarkers | 1940 filecount, bytecount, it = streamclone.generatev2( |
1929 ) | 1941 repo, includepats, excludepats, includeobsmarkers |
1930 requirements = streamclone.streamed_requirements(repo) | 1942 ) |
1931 requirements = _formatrequirementsspec(requirements) | 1943 requirements = streamclone.streamed_requirements(repo) |
1932 part = bundler.newpart(b'stream2', data=it) | 1944 requirements = _formatrequirementsspec(requirements) |
1933 part.addparam(b'bytecount', b'%d' % bytecount, mandatory=True) | 1945 part = bundler.newpart(b'stream2', data=it) |
1934 part.addparam(b'filecount', b'%d' % filecount, mandatory=True) | 1946 part.addparam(b'bytecount', b'%d' % bytecount, mandatory=True) |
1935 part.addparam(b'requirements', requirements, mandatory=True) | 1947 part.addparam(b'filecount', b'%d' % filecount, mandatory=True) |
1948 part.addparam(b'requirements', requirements, mandatory=True) | |
1949 elif version == b"v3-exp": | |
1950 filecount, bytecount, it = streamclone.generatev2( | |
1951 repo, includepats, excludepats, includeobsmarkers | |
1952 ) | |
1953 requirements = streamclone.streamed_requirements(repo) | |
1954 requirements = _formatrequirementsspec(requirements) | |
1955 part = bundler.newpart(b'stream3', data=it) | |
1956 part.addparam(b'bytecount', b'%d' % bytecount, mandatory=True) | |
1957 part.addparam(b'filecount', b'%d' % filecount, mandatory=True) | |
1958 part.addparam(b'requirements', requirements, mandatory=True) | |
1936 | 1959 |
1937 | 1960 |
1938 def buildobsmarkerspart(bundler, markers, mandatory=True): | 1961 def buildobsmarkerspart(bundler, markers, mandatory=True): |
1939 """add an obsmarker part to the bundler with <markers> | 1962 """add an obsmarker part to the bundler with <markers> |
1940 | 1963 |
2586 | 2609 |
2587 repo.ui.debug(b'applying stream bundle\n') | 2610 repo.ui.debug(b'applying stream bundle\n') |
2588 streamclone.applybundlev2(repo, part, filecount, bytecount, requirements) | 2611 streamclone.applybundlev2(repo, part, filecount, bytecount, requirements) |
2589 | 2612 |
2590 | 2613 |
2614 @parthandler(b'stream3', (b'requirements', b'filecount', b'bytecount')) | |
2615 def handlestreamv3bundle(op, part): | |
2616 return handlestreamv2bundle(op, part) | |
2617 | |
2618 | |
2591 def widen_bundle( | 2619 def widen_bundle( |
2592 bundler, repo, oldmatcher, newmatcher, common, known, cgversion, ellipses | 2620 bundler, repo, oldmatcher, newmatcher, common, known, cgversion, ellipses |
2593 ): | 2621 ): |
2594 """generates bundle2 for widening a narrow clone | 2622 """generates bundle2 for widening a narrow clone |
2595 | 2623 |