D5137: streamclone: new server config and some API changes for narrow stream clones

pulkit (Pulkit Goyal) phabricator at mercurial-scm.org
Wed Oct 17 19:25:54 EDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rHGaf62936c2508: streamclone: new server config and some API changes for narrow stream clones (authored by pulkit, committed by ).

CHANGED PRIOR TO COMMIT
  https://phab.mercurial-scm.org/D5137?vs=12208&id=12227#toc

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D5137?vs=12208&id=12227

REVISION DETAIL
  https://phab.mercurial-scm.org/D5137

AFFECTED FILES
  mercurial/bundle2.py
  mercurial/configitems.py
  mercurial/streamclone.py
  tests/test-narrow-clone-stream.t

CHANGE DETAILS

diff --git a/tests/test-narrow-clone-stream.t b/tests/test-narrow-clone-stream.t
new file mode 100644
--- /dev/null
+++ b/tests/test-narrow-clone-stream.t
@@ -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]
diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py
--- a/mercurial/streamclone.py
+++ b/mercurial/streamclone.py
@@ -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 = []
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -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,
 )
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -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)



To: pulkit, durin42, #hg-reviewers, martinvonz
Cc: martinvonz, indygreg, mercurial-devel


More information about the Mercurial-devel mailing list