merge with stable
authorMatt Mackall <mpm@selenic.com>
Tue, 15 Mar 2016 14:10:46 -0700
changeset 28532 ed75909c4c67
parent 28531 fe79a5821e5a (current diff)
parent 28518 aa440c3d7c5d (diff)
child 28533 dfd5a6830ea7
merge with stable
mercurial/streamclone.py
--- a/mercurial/streamclone.py	Fri Mar 11 20:34:49 2016 -0500
+++ b/mercurial/streamclone.py	Tue Mar 15 14:10:46 2016 -0700
@@ -206,7 +206,8 @@
                 # partially encode name over the wire for backwards compat
                 yield '%s\0%d\n' % (store.encodedir(name), size)
                 if size <= 65536:
-                    yield svfs.read(name)
+                    with svfs(name, 'rb') as fp:
+                        yield fp.read(size)
                 else:
                     for chunk in util.filechunkiter(svfs(name), limit=size):
                         yield chunk
--- a/tests/test-clone-uncompressed.t	Fri Mar 11 20:34:49 2016 -0500
+++ b/tests/test-clone-uncompressed.t	Tue Mar 15 14:10:46 2016 -0700
@@ -50,3 +50,43 @@
   preparing listkeys for "phases"
   sending listkeys command
   received listkey for "phases": 58 bytes
+
+
+Stream clone while repo is changing:
+
+  $ mkdir changing
+  $ cd changing
+
+extension for delaying the server process so we reliably can modify the repo
+while cloning
+
+  $ cat > delayer.py <<EOF
+  > import time
+  > from mercurial import extensions, scmutil
+  > def __call__(orig, self, path, *args, **kwargs):
+  >     if path == 'data/f1.i':
+  >         time.sleep(2)
+  >     return orig(self, path, *args, **kwargs)
+  > extensions.wrapfunction(scmutil.vfs, '__call__', __call__)
+  > EOF
+
+prepare repo with small and big file to cover both code paths in emitrevlogdata
+
+  $ hg init repo
+  $ touch repo/f1
+  $ $TESTDIR/seq.py 50000 > repo/f2
+  $ hg -R repo ci -Aqm "0"
+  $ hg -R repo serve -p $HGPORT1 -d --pid-file=hg.pid --config extensions.delayer=delayer.py
+  $ cat hg.pid >> $DAEMON_PIDS
+
+clone while modifying the repo between stating file with write lock and
+actually serving file content
+
+  $ hg clone -q --uncompressed -U http://localhost:$HGPORT1 clone &
+  $ sleep 1
+  $ echo >> repo/f1
+  $ echo >> repo/f2
+  $ hg -R repo ci -m "1"
+  $ wait
+  $ hg -R clone id
+  000000000000