D5139: store: introduce _matchtrackedpath() and use it to filter store files
pulkit (Pulkit Goyal)
phabricator at mercurial-scm.org
Thu Oct 18 10:38:33 UTC 2018
pulkit updated this revision to Diff 12233.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D5139?vs=12212&id=12233
REVISION DETAIL
https://phab.mercurial-scm.org/D5139
AFFECTED FILES
mercurial/store.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
--- 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 @@
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 (* MB/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
diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py
--- a/mercurial/streamclone.py
+++ b/mercurial/streamclone.py
@@ -545,10 +545,6 @@
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/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -24,6 +24,20 @@
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 = decodefilename(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 @@
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 @@
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)
To: pulkit, durin42, #hg-reviewers
Cc: mjpieters, mercurial-devel
More information about the Mercurial-devel
mailing list