streamclone: teach canperformstreamclone to be bundle2 aware
We add an argument to canperformstreamclone() to return False if a
bundle2 stream clone is available. This will enable the legacy stream
clone step to no-op when a bundle2 stream clone is supported.
The commented code will be made active when bundle2 supports streaming
clone.
This patch does foreshadow the introduction of the "stream" bundle2
capability and its "v1" sub-capability. The bundle2 capability mirrors
the existing "stream" capability and is needed so clients know whether a
server explicitly supports streaming clones over bundle2 (servers up to
this point support bundle2 without streaming clone support).
The sub-capability will denote which data formats and variations are
supported. Currently, the value "v1" denotes the existing streaming
clone data format, which I intend to reuse inside a bundle2 part. My
intent is to eventually introduce alternate data formats that can be
produced and consumed more efficiently. Having a sub-capability means
we don't need to introduce a new top-level bundle2 capability when new
formats are introduced. This doesn't really have any implications
beyond making the capabilities namespace more organized.
--- a/mercurial/streamclone.py Sun Oct 04 11:50:42 2015 -0700
+++ b/mercurial/streamclone.py Sun Oct 04 18:35:19 2015 -0700
@@ -17,9 +17,13 @@
util,
)
-def canperformstreamclone(pullop):
+def canperformstreamclone(pullop, bailifbundle2supported=False):
"""Whether it is possible to perform a streaming clone as part of pull.
+ ``bailifbundle2supported`` will cause the function to return False if
+ bundle2 stream clones are supported. It should only be called by the
+ legacy stream clone code path.
+
Returns a tuple of (supported, requirements). ``supported`` is True if
streaming clone is supported and False otherwise. ``requirements`` is
a set of repo requirements from the remote, or ``None`` if stream clone
@@ -28,6 +32,21 @@
repo = pullop.repo
remote = pullop.remote
+ bundle2supported = False
+ if pullop.canusebundle2:
+ if 'v1' in pullop.remotebundle2caps.get('stream', []):
+ bundle2supported = True
+ # else
+ # Server doesn't support bundle2 stream clone or doesn't support
+ # the versions we support. Fall back and possibly allow legacy.
+
+ # Ensures legacy code path uses available bundle2.
+ if bailifbundle2supported and bundle2supported:
+ return False, None
+ # Ensures bundle2 doesn't try to do a stream clone if it isn't supported.
+ #elif not bailifbundle2supported and not bundle2supported:
+ # return False, None
+
# Streaming clone only works on empty repositories.
if len(repo):
return False, None