# HG changeset patch # User Gregory Szorc # Date 2015-10-17 17:26:34 # Node ID a18ee7da38c26c4e3da6885c5fb119e1637b999c # Parent c0f475ac997e634b71ed0bed9ae9652c2c950811 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." diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -124,6 +124,17 @@ def parsebundlespec(repo, spec, strict=T 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]