Mercurial > hg
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]