Mercurial > public > mercurial-scm > hg-stable
diff mercurial/exchange.py @ 52012:aa7f4a45d8fa
clonebundles: allow manifest to specify sha256 digest of bundles
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Thu, 27 Jun 2024 03:32:52 +0200 |
parents | 8583d138f436 |
children |
line wrap: on
line diff
--- a/mercurial/exchange.py Thu Oct 03 14:45:01 2024 +0200 +++ b/mercurial/exchange.py Thu Jun 27 03:32:52 2024 +0200 @@ -2900,8 +2900,23 @@ entries = bundlecaches.sortclonebundleentries(repo.ui, entries) url = entries[0][b'URL'] + digest = entries[0].get(b'DIGEST') + if digest: + algorithms = urlmod.digesthandler.digest_algorithms.keys() + preference = dict(zip(algorithms, range(len(algorithms)))) + best_entry = None + best_preference = len(preference) + for digest_entry in digest.split(b','): + cur_algo, cur_digest = digest_entry.split(b':') + if cur_algo not in preference: + continue + if preference[cur_algo] < best_preference: + best_entry = digest_entry + best_preference = preference[cur_algo] + digest = best_entry + repo.ui.status(_(b'applying clone bundle from %s\n') % url) - if trypullbundlefromurl(repo.ui, repo, url, remote): + if trypullbundlefromurl(repo.ui, repo, url, remote, digest): repo.ui.status(_(b'finished applying clone bundle\n')) # Bundle failed. # @@ -2930,14 +2945,14 @@ return util.chunkbuffer(peerclonebundle) -def trypullbundlefromurl(ui, repo, url, peer): +def trypullbundlefromurl(ui, repo, url, peer, digest): """Attempt to apply a bundle from a URL.""" with repo.lock(), repo.transaction(b'bundleurl') as tr: try: if url.startswith(bundlecaches.CLONEBUNDLESCHEME): fh = inline_clone_bundle_open(ui, url, peer) else: - fh = urlmod.open(ui, url) + fh = urlmod.open(ui, url, digest=digest) cg = readbundle(ui, fh, b'stream') if isinstance(cg, streamclone.streamcloneapplier):