Mercurial > hg
changeset 37170:b837655c1509
streamclonebundle: make sure we accept new stream clone bundle spec
When asked specifically, the code do a sanity check on the clone bundle to
ensure it's a stream bundle. As we introduced a new stream bundle spec, update
the logic to support it.
With this final changeset, we can now announce safely a stream v2 clone bundle
and old clients would not crash trying to process it.
This changeset address the last comment from Gregory Szorc on the stream v2
bundle series.
Differential Revision: https://phab.mercurial-scm.org/D1957
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Wed, 31 Jan 2018 17:15:44 +0100 |
parents | 99f28a4b2a3a |
children | d7f3fdab94c4 |
files | mercurial/exchange.py tests/test-stream-bundle-v2.t |
diffstat | 2 files changed, 65 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/exchange.py Wed Jan 31 11:44:33 2018 +0100 +++ b/mercurial/exchange.py Wed Jan 31 17:15:44 2018 +0100 @@ -2180,6 +2180,18 @@ return m +def isstreamclonespec(bundlespec): + # Stream clone v1 + if (bundlespec.compression == 'UN' and bundlespec.version == 's1'): + return True + + # Stream clone v2 + if (bundlespec.compression == 'UN' and bundlespec.version == '02' and \ + bundlespec.contentopts.get('streamv2')): + return True + + return False + def filterclonebundleentries(repo, entries, streamclonerequested=False): """Remove incompatible clone bundle manifest entries. @@ -2199,9 +2211,7 @@ # If a stream clone was requested, filter out non-streamclone # entries. - comp = bundlespec.compression - version = bundlespec.version - if streamclonerequested and (comp != 'UN' or version != 's1'): + if streamclonerequested and not isstreamclonespec(bundlespec): repo.ui.debug('filtering %s because not a stream clone\n' % entry['URL']) continue
--- a/tests/test-stream-bundle-v2.t Wed Jan 31 11:44:33 2018 +0100 +++ b/tests/test-stream-bundle-v2.t Wed Jan 31 17:15:44 2018 +0100 @@ -112,3 +112,55 @@ E: remote created -> g getting E 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ hg clone --stream http://localhost:$HGPORT streamv2-clone-explicit --debug + using http://localhost:$HGPORT/ + sending capabilities command + sending clonebundles command + applying clone bundle from http://localhost:$HGPORT1/bundle.hg + bundle2-input-bundle: with-transaction + bundle2-input-part: "stream2" (params: 3 mandatory) supported + applying stream bundle + 11 files to transfer, 1.65 KB of data + adding [s] data/A.i (66 bytes) + adding [s] data/B.i (66 bytes) + adding [s] data/C.i (66 bytes) + adding [s] data/D.i (66 bytes) + adding [s] data/E.i (66 bytes) + adding [s] 00manifest.i (584 bytes) + adding [s] 00changelog.i (595 bytes) + adding [s] phaseroots (43 bytes) + adding [c] branch2-served (94 bytes) + adding [c] rbc-names-v1 (7 bytes) + adding [c] rbc-revs-v1 (40 bytes) + transferred 1.65 KB in *.* seconds (*/sec) (glob) + bundle2-input-part: total payload size 1840 + bundle2-input-bundle: 0 parts total + finished applying clone bundle + query 1; heads + sending batch command + searching for changes + all remote heads known locally + no changes found + sending getbundle command + bundle2-input-bundle: with-transaction + bundle2-input-part: "listkeys" (params: 1 mandatory) supported + bundle2-input-part: "phase-heads" supported + bundle2-input-part: total payload size 24 + bundle2-input-bundle: 1 parts total + checking for updated bookmarks + updating to branch default + resolving manifests + branchmerge: False, force: False, partial: False + ancestor: 000000000000, local: 000000000000+, remote: 9bc730a19041 + A: remote created -> g + getting A + B: remote created -> g + getting B + C: remote created -> g + getting C + D: remote created -> g + getting D + E: remote created -> g + getting E + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved