exchange: teach pull about requested stream clones
authorGregory Szorc <gregory.szorc@gmail.com>
Fri, 02 Oct 2015 22:16:34 -0700
changeset 26448 e05fd574c922
parent 26447 591088f7028a
child 26449 89b7a7883aee
exchange: teach pull about requested stream clones An upcoming patch will move the invocation of stream cloning logic to the normal pull code path (from localrepository.clone). In preparation for this, we teach pull() and pulloperation about whether a streaming clone is requested. The return logic in localrepository.clone() has been reformatted slightly because of line length issues.
mercurial/exchange.py
mercurial/localrepo.py
--- a/mercurial/exchange.py	Fri Oct 02 21:53:25 2015 -0700
+++ b/mercurial/exchange.py	Fri Oct 02 22:16:34 2015 -0700
@@ -846,7 +846,7 @@
     """
 
     def __init__(self, repo, remote, heads=None, force=False, bookmarks=(),
-                 remotebookmarks=None):
+                 remotebookmarks=None, streamclonerequested=None):
         # repo we pull into
         self.repo = repo
         # repo we pull from
@@ -857,6 +857,8 @@
         self.explicitbookmarks = bookmarks
         # do we force pull?
         self.force = force
+        # whether a streaming clone was requested
+        self.streamclonerequested = streamclonerequested
         # transaction manager
         self.trmanager = None
         # set of common changeset between local and remote before pull
@@ -924,7 +926,8 @@
         if self._tr is not None:
             self._tr.release()
 
-def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None):
+def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None,
+         streamclonerequested=None):
     """Fetch repository data from a remote.
 
     This is the main function used to retrieve data from a remote repository.
@@ -937,13 +940,18 @@
     default, all remote bookmarks are pulled.
     ``opargs`` are additional keyword arguments to pass to ``pulloperation``
     initialization.
+    ``streamclonerequested`` is a boolean indicating whether a "streaming
+    clone" is requested. A "streaming clone" is essentially a raw file copy
+    of revlogs from the server. This only works when the local repository is
+    empty. The default value of ``None`` means to respect the server
+    configuration for preferring stream clones.
 
     Returns the ``pulloperation`` created for this pull.
     """
     if opargs is None:
         opargs = {}
     pullop = pulloperation(repo, remote, heads, force, bookmarks=bookmarks,
-                           **opargs)
+                           streamclonerequested=streamclonerequested, **opargs)
     if pullop.remote.local():
         missing = set(pullop.remote.requirements) - pullop.repo.supported
         if missing:
--- a/mercurial/localrepo.py	Fri Oct 02 21:53:25 2015 -0700
+++ b/mercurial/localrepo.py	Fri Oct 02 22:16:34 2015 -0700
@@ -1800,10 +1800,11 @@
         quiet = self.ui.backupconfig('ui', 'quietbookmarkmove')
         try:
             self.ui.setconfig('ui', 'quietbookmarkmove', True, 'clone')
-            ret = exchange.pull(self, remote, heads).cgresult
+            pullop = exchange.pull(self, remote, heads,
+                                   streamclonerequested=stream)
+            return pullop.cgresult
         finally:
             self.ui.restoreconfig(quiet)
-        return ret
 
     def pushkey(self, namespace, key, old, new):
         try: