streamclone: new server config and some API changes for narrow stream clones
authorPulkit Goyal <pulkit@yandex-team.ru>
Wed, 26 Sep 2018 17:20:04 +0300
changeset 40338 af62936c2508
parent 40337 cb516a854bc7
child 40339 f0e8f27768eb
streamclone: new server config and some API changes for narrow stream clones This patch introduces a new server config `experimental.server.stream-narrow-clones` which if set to True will advertise that the server supports narrow stream clones. This patch also pass on the includes and excludes from getbundle command to streamclone generation code. There is a test added to show that the includepats and excludepats are correctly passed. Upcoming patches will implement storage layer filtering for streamclones and then we can remove the temporary error and plug in the whole logic together to make narrow stream clones working. Differential Revision: https://phab.mercurial-scm.org/D5137
mercurial/bundle2.py
mercurial/configitems.py
mercurial/streamclone.py
tests/test-narrow-clone-stream.t
--- a/mercurial/bundle2.py	Wed Oct 10 17:36:59 2018 +0300
+++ b/mercurial/bundle2.py	Wed Sep 26 17:20:04 2018 +0300
@@ -1687,7 +1687,18 @@
     # to avoid compression to consumers of the bundle.
     bundler.prefercompressed = False
 
-    filecount, bytecount, it = streamclone.generatev2(repo)
+    # get the includes and excludes
+    includepats = kwargs.get(r'includepats')
+    excludepats = kwargs.get(r'excludepats')
+
+    narrowstream = repo.ui.configbool('experimental.server',
+                                      'stream-narrow-clones')
+
+    if (includepats or excludepats) and not narrowstream:
+        raise error.Abort(_('server does not support narrow stream clones'))
+
+    filecount, bytecount, it = streamclone.generatev2(repo, includepats,
+                                                      excludepats)
     requirements = _formatrequirementsspec(repo.requirements)
     part = bundler.newpart('stream2', data=it)
     part.addparam('bytecount', '%d' % bytecount, mandatory=True)
--- a/mercurial/configitems.py	Wed Oct 10 17:36:59 2018 +0300
+++ b/mercurial/configitems.py	Wed Sep 26 17:20:04 2018 +0300
@@ -610,6 +610,9 @@
 coreconfigitem('experimental', 'server.manifestdata.recommended-batch-size',
     default=100000,
 )
+coreconfigitem('experimental.server', 'stream-narrow-clones',
+    default=False,
+)
 coreconfigitem('experimental', 'single-head-per-branch',
     default=False,
 )
--- a/mercurial/streamclone.py	Wed Oct 10 17:36:59 2018 +0300
+++ b/mercurial/streamclone.py	Wed Sep 26 17:20:04 2018 +0300
@@ -531,7 +531,7 @@
             finally:
                 fp.close()
 
-def generatev2(repo):
+def generatev2(repo, includes, excludes):
     """Emit content for version 2 of a streaming clone.
 
     the data stream consists the following entries:
@@ -544,6 +544,10 @@
     Returns a 3-tuple of (file count, file size, data iterator).
     """
 
+    # temporarily raise error until we add storage level logic
+    if includes or excludes:
+        raise error.Abort(_("server does not support narrow stream clones"))
+
     with repo.lock():
 
         entries = []
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-narrow-clone-stream.t	Wed Sep 26 17:20:04 2018 +0300
@@ -0,0 +1,39 @@
+Tests narrow stream clones
+
+  $ . "$TESTDIR/narrow-library.sh"
+
+Server setup
+
+  $ hg init master
+  $ cd master
+  $ mkdir dir
+  $ mkdir dir/src
+  $ cd dir/src
+  $ for x in `$TESTDIR/seq.py 20`; do echo $x > "f$x"; hg add "f$x"; hg commit -m "Commit src $x"; done
+
+  $ cd ..
+  $ mkdir tests
+  $ cd tests
+  $ for x in `$TESTDIR/seq.py 20`; do echo $x > "f$x"; hg add "f$x"; hg commit -m "Commit src $x"; done
+  $ cd ../../..
+
+Trying to stream clone when the server does not support it
+
+  $ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/f10" --stream
+  streaming all changes
+  remote: abort: server does not support narrow stream clones
+  abort: pull failed on remote
+  [255]
+
+Enable stream clone on the server
+
+  $ echo "[server]" >> master/.hg/hgrc
+  $ echo "stream-narrow-clones=True" >> master/.hg/hgrc
+
+Cloning a specific file when stream clone is supported
+
+  $ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/f10" --stream
+  streaming all changes
+  remote: abort: server does not support narrow stream clones
+  abort: pull failed on remote
+  [255]