From patchwork Wed Feb 3 06:01:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4,of,4] treemanifests: fix streaming clone From: Martin von Zweigbergk X-Patchwork-Id: 12946 Message-Id: <2431679901e4a4227a90.1454479317@waste.org> To: mercurial-devel@mercurial-scm.org Date: Wed, 03 Feb 2016 00:01:57 -0600 # HG changeset patch # User Martin von Zweigbergk # Date 1454457679 28800 # Tue Feb 02 16:01:19 2016 -0800 # Node ID 2431679901e4a4227a9051936991f7e7a22e5df0 # Parent 8f1c2d81ff45633457a1ba8b8f91d5bd347a0605 treemanifests: fix streaming clone Similar to the previous patch, the .hg/store/meta/ directory does not get copied when when using "hg clone --uncompressed". Fix by making sure that the files in the directory are generated by store.walk(). Also update test-treemanifest.t to use an uppercase directory name so we test that the path encoding works. diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -332,6 +332,9 @@ def datafiles(self): return self._walk('data', True) + def metafiles(self): + pass + def topfiles(self): # yield manifest before changelog return reversed(self._walk('', False)) @@ -341,6 +344,8 @@ # yield data files first for x in self.datafiles(): yield x + for x in self.metafiles(): + yield x for x in self.topfiles(): yield x @@ -503,6 +508,14 @@ if err.errno != errno.ENOENT: raise + def metafiles(self): + for a, b, size in self._walk('meta', True): + try: + a = decodefilename(a) + except KeyError: + a = None + yield a, b, size + def copylist(self): d = ('data meta dh fncache phaseroots obsstore' ' 00manifest.d 00manifest.i 00changelog.d 00changelog.i') diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t --- a/tests/test-treemanifest.t +++ b/tests/test-treemanifest.t @@ -367,7 +367,7 @@ $ hg --config experimental.treemanifest=True init deeprepo $ cd deeprepo - $ mkdir a + $ mkdir A $ mkdir b $ mkdir b/bar $ mkdir b/bar/orange @@ -376,8 +376,8 @@ $ mkdir b/foo/apple $ mkdir b/foo/apple/bees - $ touch a/one.txt - $ touch a/two.txt + $ touch A/one.txt + $ touch A/two.txt $ touch b/bar/fruits.txt $ touch b/bar/orange/fly/gnat.py $ touch b/bar/orange/fly/housefly.txt @@ -393,8 +393,8 @@ Test files from the root. $ hg files -r . - a/one.txt (glob) - a/two.txt (glob) + A/one.txt (glob) + A/two.txt (glob) b/bar/fruits.txt (glob) b/bar/orange/fly/gnat.py (glob) b/bar/orange/fly/housefly.txt (glob) @@ -411,56 +411,56 @@ Test files for a subdirectory. - $ mv .hg/store/meta/a oldmf + $ mv .hg/store/meta/_a oldmf $ hg files -r . b b/bar/fruits.txt (glob) b/bar/orange/fly/gnat.py (glob) b/bar/orange/fly/housefly.txt (glob) b/foo/apple/bees/flower.py (glob) - $ mv oldmf .hg/store/meta/a + $ mv oldmf .hg/store/meta/_a Test files with just includes and excludes. - $ mv .hg/store/meta/a oldmf + $ mv .hg/store/meta/_a oldmf $ mv .hg/store/meta/b/bar/orange/fly oldmf2 $ mv .hg/store/meta/b/foo/apple/bees oldmf3 $ hg files -r . -I path:b/bar -X path:b/bar/orange/fly -I path:b/foo -X path:b/foo/apple/bees b/bar/fruits.txt (glob) - $ mv oldmf .hg/store/meta/a + $ mv oldmf .hg/store/meta/_a $ mv oldmf2 .hg/store/meta/b/bar/orange/fly $ mv oldmf3 .hg/store/meta/b/foo/apple/bees Test files for a subdirectory, excluding a directory within it. - $ mv .hg/store/meta/a oldmf + $ mv .hg/store/meta/_a oldmf $ mv .hg/store/meta/b/foo oldmf2 $ hg files -r . -X path:b/foo b b/bar/fruits.txt (glob) b/bar/orange/fly/gnat.py (glob) b/bar/orange/fly/housefly.txt (glob) - $ mv oldmf .hg/store/meta/a + $ mv oldmf .hg/store/meta/_a $ mv oldmf2 .hg/store/meta/b/foo Test files for a sub directory, including only a directory within it, and including an unrelated directory. - $ mv .hg/store/meta/a oldmf + $ mv .hg/store/meta/_a oldmf $ mv .hg/store/meta/b/foo oldmf2 $ hg files -r . -I path:b/bar/orange -I path:a b b/bar/orange/fly/gnat.py (glob) b/bar/orange/fly/housefly.txt (glob) - $ mv oldmf .hg/store/meta/a + $ mv oldmf .hg/store/meta/_a $ mv oldmf2 .hg/store/meta/b/foo Test files for a pattern, including a directory, and excluding a directory within that. - $ mv .hg/store/meta/a oldmf + $ mv .hg/store/meta/_a oldmf $ mv .hg/store/meta/b/foo oldmf2 $ mv .hg/store/meta/b/bar/orange oldmf3 $ hg files -r . glob:**.txt -I path:b/bar -X path:b/bar/orange b/bar/fruits.txt (glob) - $ mv oldmf .hg/store/meta/a + $ mv oldmf .hg/store/meta/_a $ mv oldmf2 .hg/store/meta/b/foo $ mv oldmf3 .hg/store/meta/b/bar/orange @@ -493,8 +493,8 @@ Tree manifest revlogs exist. $ find deepclone/.hg/store/meta | sort deepclone/.hg/store/meta - deepclone/.hg/store/meta/a - deepclone/.hg/store/meta/a/00manifest.i + deepclone/.hg/store/meta/_a + deepclone/.hg/store/meta/_a/00manifest.i deepclone/.hg/store/meta/b deepclone/.hg/store/meta/b/00manifest.i deepclone/.hg/store/meta/b/bar @@ -549,3 +549,19 @@ crosschecking files in changesets and manifests checking files 8 files, 3 changesets, 10 total revisions + +Stream clone should work + + $ hg clone --config experimental.changegroup3=True --uncompressed -U \ + > http://localhost:$HGPORT2 stream-clone + streaming all changes + 18 files to transfer, * of data (glob) + transferred * in * seconds (*) (glob) + searching for changes + no changes found + $ hg -R stream-clone verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 8 files, 3 changesets, 10 total revisions