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) 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/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/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]