changeset 26760:a18ee7da38c2

exchange: parse requirements from stream clone specification string Stream clone bundles can only be consumed if the consumer supports the exact format requirements that were present on the producer. This patch adds support for encoding and verifying the format requirements on the bundle specification string for a stream clone bundle are supported by the local repository. If they aren't, we raise an UnsupportedBundleSpecification, just like we do when an unknown compression or bundle type is encountered. The impetus for this patch is so the clone bundles manifest can advertise stream clone bundles and so clients can filter out stream clones with unsupported format requirements. e.g. a stream clone produced with the not-yet-invented "revlogv2" format will be ignored by clients that only support "revlogv1."
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 17 Oct 2015 10:26:34 -0700
parents c0f475ac997e
children 8270ee357dd9
files mercurial/exchange.py
diffstat 1 files changed, 11 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/exchange.py	Wed Oct 14 17:00:34 2015 -0700
+++ b/mercurial/exchange.py	Sat Oct 17 10:26:34 2015 -0700
@@ -124,6 +124,17 @@
             raise error.UnsupportedBundleSpecification(
                     _('%s is not a recognized bundle specification') % spec)
 
+    # The specification for packed1 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 == 'packed1' and 'requirements' in params:
+        requirements = set(params['requirements'].split(','))
+        missingreqs = requirements - repo.supportedformats
+        if missingreqs:
+            raise error.UnsupportedBundleSpecification(
+                    _('missing support for repository features: %s') %
+                      ', '.join(sorted(missingreqs)))
+
     if not externalnames:
         compression = _bundlespeccompressions[compression]
         version = _bundlespeccgversions[version]