def get_clonebundle_url(repo): bundles = repo._call(b'clonebundles') supported_bundles = (b'v1', b'v2') supported_compressions = tuple( k for k, v in ( (b'none', b'UN'), (b'gzip', b'GZ'), (b'bzip2', b'BZ'), (b'zstd', b'ZS'), ) if HgRepoHelper.supports((b'compression', v)) ) has_sni = getattr(ssl, 'HAS_SNI', False) logger = logging.getLogger('clonebundle') for line in bundles.splitlines(): attrs = line.split() if not attrs: continue url = attrs.pop(0) logger.debug(url) attrs = { unquote_to_bytes(k): unquote_to_bytes(v) for k, _, v in (a.partition(b'=') for a in attrs) } logger.debug(attrs) if b'REQUIRESNI' in attrs and not has_sni: logger.debug('Skip because of REQUIRESNI, but SNI unsupported') continue spec = attrs.get(b'BUNDLESPEC') if not spec: logger.debug('Skip because missing BUNDLESPEC') continue typ, _, params = spec.partition(b';') compression, _, version = typ.partition(b'-') if compression not in supported_compressions: logger.debug('Skip because unsupported compression (%s)', compression) continue if version not in supported_bundles: logger.debug('Skip because unsupported bundle type (%s)', version) continue params_dict = {} for p in params.split(b':'): k, _, v = p.partition(b'=') params_dict[k] = v if 'stream' in params_dict: logger.debug('Skip because stream bundles are not supported') continue return url
def get_clonebundle_url(repo): bundles = repo._call(b'clonebundles') try: if check_enabled('no-mercurial'): raise ImportError('Do not use mercurial') from mercurial.exchange import ( parseclonebundlesmanifest, filterclonebundleentries, ) except ImportError: parseclonebundlesmanifest = False if parseclonebundlesmanifest: class dummy(object): pass fakerepo = dummy() fakerepo.requirements = set() fakerepo.supportedformats = set() fakerepo.ui = repo.ui entries = parseclonebundlesmanifest(fakerepo, bundles) if not entries: return None entries = filterclonebundleentries(fakerepo, entries) if not entries: return None return entries[0].get(b'URL') supported_bundles = (b'v1', b'v2') supported_compressions = tuple(k for k, v in ( (b'none', b'UN'), (b'gzip', b'GZ'), (b'bzip2', b'BZ'), (b'zstd', b'ZS'), ) if HgRepoHelper.supports((b'compression', v))) has_sni = getattr(ssl, 'HAS_SNI', False) logger = logging.getLogger('clonebundle') for line in bundles.splitlines(): attrs = line.split() if not attrs: continue url = attrs.pop(0) logger.debug(url) attrs = { unquote_to_bytes(k): unquote_to_bytes(v) for k, _, v in (a.partition(b'=') for a in attrs) } logger.debug(attrs) if b'REQUIRESNI' in attrs and not has_sni: logger.debug('Skip because of REQUIRESNI, but SNI unsupported') continue spec = attrs.get(b'BUNDLESPEC') if not spec: logger.debug('Skip because missing BUNDLESPEC') continue typ, _, params = spec.partition(b';') compression, _, version = typ.partition(b'-') if compression not in supported_compressions: logger.debug('Skip because unsupported compression (%s)', compression) continue if version not in supported_bundles: logger.debug('Skip because unsupported bundle type (%s)', version) continue params_dict = {} for p in params.split(b':'): k, _, v = p.partition(b'=') params_dict[k] = v if 'stream' in params_dict: logger.debug('Skip because stream bundles are not supported') continue return url
def get_clonebundle_url(repo): bundles = repo._call('clonebundles') try: if check_enabled('no-mercurial'): raise ImportError('Do not use mercurial') from mercurial.exchange import ( parseclonebundlesmanifest, filterclonebundleentries, ) except ImportError: parseclonebundlesmanifest = False if parseclonebundlesmanifest: class dummy(object): pass fakerepo = dummy() fakerepo.requirements = set() fakerepo.supportedformats = set() fakerepo.ui = repo.ui entries = parseclonebundlesmanifest(fakerepo, bundles) if not entries: return None entries = filterclonebundleentries(fakerepo, entries) if not entries: return None return entries[0].get('URL') supported_bundles = ('v1', 'v2') supported_compressions = tuple( k for k, v in ( ('none', 'UN'), ('gzip', 'GZ'), ('bzip2', 'BZ'), ('zstd', 'ZS'), ) if HgRepoHelper.supports(('compression', v)) ) has_sni = getattr(ssl, 'HAS_SNI', False) logger = logging.getLogger('clonebundle') for line in bundles.splitlines(): attrs = line.split() if not attrs: continue url = attrs.pop(0) logger.debug(url) attrs = { urllib.unquote(k): urllib.unquote(v) for k, _, v in (a.partition('=') for a in attrs) } logger.debug(attrs) if 'REQUIRESNI' in attrs and not has_sni: logger.debug('Skip because of REQUIRESNI, but SNI unsupported') continue spec = attrs.get('BUNDLESPEC') if not spec: logger.debug('Skip because missing BUNDLESPEC') continue typ, _, params = spec.partition(';') compression, _, version = typ.partition('-') if compression not in supported_compressions: logger.debug('Skip because unsupported compression (%s)', compression) continue if version not in supported_bundles: logger.debug('Skip because unsupported bundle type (%s)', version) continue return url