[PATCH 5 of 5 modernize-streamclone] streamclone: teach canperformstreamclone to be bundle2 aware

Gregory Szorc gregory.szorc at gmail.com
Sun Oct 4 15:11:31 CDT 2015


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1443988941 25200
#      Sun Oct 04 13:02:21 2015 -0700
# Node ID 58f83a9c79c23b14c98c76f1131ed5f3a2222fb4
# Parent  ece85c11593b6bd8a318e40acd47804e40ceaf98
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.

diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py
--- a/mercurial/streamclone.py
+++ b/mercurial/streamclone.py
@@ -16,19 +16,38 @@ from . import (
     store,
     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
     isn't supported.
     """
     repo = pullop.repo
     remote = pullop.remote
 
+    bundle2supported = False
+    if pullop.canusebundle2:
+        if 'v1' in pullop.bundle2caps.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
 


More information about the Mercurial-devel mailing list