diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -24,6 +24,20 @@ from . import ( parsers = policy.importmod(r'parsers') +def _matchtrackedpath(path, matcher): + """parses a fncache entry and returns whether the entry is tracking a path + matched by matcher or not. + + If matcher is None, returns True""" + + if matcher is None: + return True + path = decodedir(path) + if path.startswith('data/'): + return matcher(path[len('data/'):-len('.i')]) + elif path.startswith('meta/'): + return matcher.visitdir(path[len('meta/'):-len('/00manifest.i')] or '.') + # This avoids a collision between a file named foo and a dir named # foo.i or foo.d def _encodedir(path): @@ -413,6 +427,8 @@ class encodedstore(basicstore): def datafiles(self, matcher=None): for a, b, size in super(encodedstore, self).datafiles(): + if not _matchtrackedpath(a, matcher): + continue try: a = decodefilename(a) except KeyError: @@ -542,6 +558,8 @@ class fncachestore(basicstore): def datafiles(self, matcher=None): for f in sorted(self.fncache): + if not _matchtrackedpath(f, matcher): + continue ef = self.encode(f) try: yield f, ef, self.getsize(ef) diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -545,10 +545,6 @@ def generatev2(repo, includes, excludes, 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 --- a/tests/test-narrow-clone-stream.t +++ b/tests/test-narrow-clone-stream.t @@ -1,7 +1,16 @@ +#testcases tree flat + Tests narrow stream clones $ . "$TESTDIR/narrow-library.sh" +#if tree + $ cat << EOF >> $HGRCPATH + > [experimental] + > treemanifest = 1 + > EOF +#endif + Server setup $ hg init master @@ -27,13 +36,51 @@ Trying to stream clone when the server d Enable stream clone on the server - $ echo "[server]" >> master/.hg/hgrc + $ echo "[experimental.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] + * files to transfer, * KB of data (glob) + transferred * KB in * seconds (* */sec) (glob) + + $ cd narrow + $ ls + $ hg tracked + I path:dir/src/f10 + +Making sure we have the correct set of requirements + + $ cat .hg/requires + dotencode + fncache + generaldelta + narrowhg-experimental + revlogv1 + store + treemanifest (tree !) + +Making sure store has the required files + + $ ls .hg/store/ + 00changelog.i + 00manifest.i + data + fncache + meta (tree !) + narrowspec + undo + undo.backupfiles + undo.phaseroots + +Checking that repository has all the required data and not broken + + $ hg verify + checking changesets + checking manifests + checking directory manifests (tree !) + crosschecking files in changesets and manifests + checking files + checked 40 changesets with 1 changes to 1 files