diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -1239,10 +1239,10 @@ wlock = pullop.repo.wlock() lock = pullop.repo.lock() pullop.trmanager = transactionmanager(repo, 'pull', remote.url()) - streamclone.maybeperformlegacystreamclone(pullop) # This should ideally be in _pullbundle2(). However, it needs to run # before discovery to avoid extra work. _maybeapplyclonebundle(pullop) + streamclone.maybeperformlegacystreamclone(pullop) _pulldiscovery(pullop) if pullop.canusebundle2: _pullbundle2(pullop) @@ -1864,7 +1864,9 @@ 'falling back to regular clone\n')) return - entries = filterclonebundleentries(repo, entries) + entries = filterclonebundleentries( + repo, entries, streamclonerequested=pullop.streamclonerequested) + if not entries: # There is a thundering herd concern here. However, if a server # operator doesn't advertise bundles appropriate for its clients, @@ -1933,7 +1935,7 @@ return m -def filterclonebundleentries(repo, entries): +def filterclonebundleentries(repo, entries, streamclonerequested=False): """Remove incompatible clone bundle manifest entries. Accepts a list of entries parsed with ``parseclonebundlesmanifest`` @@ -1948,7 +1950,15 @@ spec = entry.get('BUNDLESPEC') if spec: try: - parsebundlespec(repo, spec, strict=True) + comp, version, params = parsebundlespec(repo, spec, strict=True) + + # If a stream clone was requested, filter out non-streamclone + # entries. + if streamclonerequested and (comp != 'UN' or version != 's1'): + repo.ui.debug('filtering %s because not a stream clone\n' % + entry['URL']) + continue + except error.InvalidBundleSpecification as e: repo.ui.debug(str(e) + '\n') continue @@ -1956,6 +1966,12 @@ repo.ui.debug('filtering %s because unsupported bundle ' 'spec: %s\n' % (entry['URL'], str(e))) continue + # If we don't have a spec and requested a stream clone, we don't know + # what the entry is so don't attempt to apply it. + elif streamclonerequested: + repo.ui.debug('filtering %s because cannot determine if a stream ' + 'clone bundle\n' % entry['URL']) + continue if 'REQUIRESNI' in entry and not sslutil.hassni: repo.ui.debug('filtering %s because SNI not supported\n' % diff --git a/tests/test-clonebundles.t b/tests/test-clonebundles.t --- a/tests/test-clonebundles.t +++ b/tests/test-clonebundles.t @@ -441,6 +441,8 @@ > EOF $ hg clone -U --uncompressed http://localhost:$HGPORT uncompressed-gzip + no compatible clone bundles available on server; falling back to regular clone + (you may want to report this to the server operator) streaming all changes 4 files to transfer, 613 bytes of data transferred 613 bytes in * seconds (*) (glob) @@ -454,6 +456,8 @@ > EOF $ hg clone -U --uncompressed http://localhost:$HGPORT uncompressed-no-bundlespec + no compatible clone bundles available on server; falling back to regular clone + (you may want to report this to the server operator) streaming all changes 4 files to transfer, 613 bytes of data transferred 613 bytes in * seconds (*) (glob) @@ -468,9 +472,10 @@ > EOF $ hg clone -U --uncompressed http://localhost:$HGPORT uncompressed-gzip-packed - streaming all changes + applying clone bundle from http://localhost:$HGPORT1/packed.hg 4 files to transfer, 613 bytes of data transferred 613 bytes in * seconds (*) (glob) + finished applying clone bundle searching for changes no changes found @@ -482,9 +487,10 @@ > EOF $ hg clone -U --uncompressed http://localhost:$HGPORT uncompressed-gzip-packed-requirements - streaming all changes + applying clone bundle from http://localhost:$HGPORT1/packed.hg 4 files to transfer, 613 bytes of data transferred 613 bytes in * seconds (*) (glob) + finished applying clone bundle searching for changes no changes found @@ -496,6 +502,8 @@ > EOF $ hg clone -U --uncompressed http://localhost:$HGPORT uncompressed-gzip-packed-unsupported-requirements + no compatible clone bundles available on server; falling back to regular clone + (you may want to report this to the server operator) streaming all changes 4 files to transfer, 613 bytes of data transferred 613 bytes in * seconds (*) (glob)