bundles: filter out unsupported requirements for non-packed1 format
stream bundle specs specify requirements, but we were ignoring this when
selecting which bundle to apply, causing spurious clone failures.
--- a/mercurial/bundlecaches.py Tue Feb 11 22:14:35 2025 -0500
+++ b/mercurial/bundlecaches.py Tue Feb 18 10:33:30 2025 +0100
@@ -318,10 +318,10 @@
% compression
)
- # The specification for packed1 can optionally declare the data formats
+ # The specification for stream bundles can optionally declare the data formats
# required to apply it. If we see this metadata, compare against what the
# repo supports and error if the bundle isn't compatible.
- if version == b'packed1' and b'requirements' in params:
+ if b'requirements' in params:
requirements = set(cast(bytes, params[b'requirements']).split(b','))
missingreqs = requirements - requirementsmod.STREAM_FIXED_REQUIREMENTS
if missingreqs:
--- a/tests/test-stream-bundle-v2.t Tue Feb 11 22:14:35 2025 -0500
+++ b/tests/test-stream-bundle-v2.t Tue Feb 18 10:33:30 2025 +0100
@@ -91,20 +91,44 @@
none-v2;stream=v3-exp;requirements%3Dgeneraldelta%2Crevlog-compression-zstd%2Crevlogv1%2Csparserevlog (stream-v3 zstd no-rust !)
none-v2;stream=v3-exp;requirements%3Dgeneraldelta%2Crevlog-compression-zstd%2Crevlogv1%2Csparserevlog (stream-v3 rust !)
-Test that we can apply the bundle as a stream clone bundle
-
- $ cat > .hg/clonebundles.manifest << EOF
- > http://localhost:$HGPORT1/bundle.hg BUNDLESPEC=`hg debugbundle --spec bundle.hg`
- > EOF
-
$ hg serve -d -p $HGPORT --pid-file hg.pid --accesslog access.log
$ cat hg.pid >> $DAEMON_PIDS
$ "$PYTHON" $TESTDIR/dumbhttp.py -p $HGPORT1 --pid http.pid
$ cat http.pid >> $DAEMON_PIDS
+Stream bundle spec with unknown requirements should be filtered out
+
+#if stream-v2
+ $ cat > .hg/clonebundles.manifest << EOF
+ > http://localhost:$HGPORT1/bundle.hg BUNDLESPEC=none-v2;stream=v2;requirements%3Drevlogv42
+ > EOF
+#endif
+#if stream-v3
+ $ cat > .hg/clonebundles.manifest << EOF
+ > http://localhost:$HGPORT1/bundle.hg BUNDLESPEC=none-v2;stream=v3-exp;requirements%3Drevlogv42
+ > EOF
+#endif
+
$ cd ..
+ $ hg clone -U http://localhost:$HGPORT stream-clone-unsupported-requirements
+ no compatible clone bundles available on server; falling back to regular clone
+ (you may want to report this to the server operator)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 5 files
+ new changesets 426bada5c675:9bc730a19041 (5 drafts)
+
+Test that we can apply the bundle as a stream clone bundle
+
+ $ cat > main/.hg/clonebundles.manifest << EOF
+ > http://localhost:$HGPORT1/bundle.hg BUNDLESPEC=`hg debugbundle --spec main/bundle.hg`
+ > EOF
+
+
#if stream-v2
$ hg clone http://localhost:$HGPORT stream-clone-implicit --debug
using http://localhost:$HGPORT/