Show More
@@ -0,0 +1,31 b'' | |||
|
1 | from __future__ import absolute_import | |
|
2 | ||
|
3 | from mercurial import ( | |
|
4 | encoding, | |
|
5 | extensions, | |
|
6 | streamclone, | |
|
7 | testing, | |
|
8 | ) | |
|
9 | ||
|
10 | ||
|
11 | WALKED_FILE_1 = encoding.environ[b'HG_TEST_STREAM_WALKED_FILE_1'] | |
|
12 | WALKED_FILE_2 = encoding.environ[b'HG_TEST_STREAM_WALKED_FILE_2'] | |
|
13 | ||
|
14 | ||
|
15 | def _test_sync_point_walk_1(orig, repo): | |
|
16 | testing.write_file(WALKED_FILE_1) | |
|
17 | ||
|
18 | ||
|
19 | def _test_sync_point_walk_2(orig, repo): | |
|
20 | assert repo._currentlock(repo._lockref) is None | |
|
21 | testing.wait_file(WALKED_FILE_2) | |
|
22 | ||
|
23 | ||
|
24 | def uisetup(ui): | |
|
25 | extensions.wrapfunction( | |
|
26 | streamclone, '_test_sync_point_walk_1', _test_sync_point_walk_1 | |
|
27 | ) | |
|
28 | ||
|
29 | extensions.wrapfunction( | |
|
30 | streamclone, '_test_sync_point_walk_2', _test_sync_point_walk_2 | |
|
31 | ) |
@@ -247,6 +247,8 b' def generatev1(repo):' | |||
|
247 | 247 | if size: |
|
248 | 248 | entries.append((name, size)) |
|
249 | 249 | total_bytes += size |
|
250 | _test_sync_point_walk_1(repo) | |
|
251 | _test_sync_point_walk_2(repo) | |
|
250 | 252 | |
|
251 | 253 | repo.ui.debug( |
|
252 | 254 | b'%d files, %d bytes to transfer\n' % (len(entries), total_bytes) |
@@ -593,6 +595,14 b' def _emit2(repo, entries, totalfilesize)' | |||
|
593 | 595 | fp.close() |
|
594 | 596 | |
|
595 | 597 | |
|
598 | def _test_sync_point_walk_1(repo): | |
|
599 | """a function for synchronisation during tests""" | |
|
600 | ||
|
601 | ||
|
602 | def _test_sync_point_walk_2(repo): | |
|
603 | """a function for synchronisation during tests""" | |
|
604 | ||
|
605 | ||
|
596 | 606 | def generatev2(repo, includes, excludes, includeobsmarkers): |
|
597 | 607 | """Emit content for version 2 of a streaming clone. |
|
598 | 608 | |
@@ -635,6 +645,8 b' def generatev2(repo, includes, excludes,' | |||
|
635 | 645 | chunks = _emit2(repo, entries, totalfilesize) |
|
636 | 646 | first = next(chunks) |
|
637 | 647 | assert first is None |
|
648 | _test_sync_point_walk_1(repo) | |
|
649 | _test_sync_point_walk_2(repo) | |
|
638 | 650 | |
|
639 | 651 | return len(entries), totalfilesize, chunks |
|
640 | 652 |
@@ -433,14 +433,35 b' Stream clone while repo is changing:' | |||
|
433 | 433 | extension for delaying the server process so we reliably can modify the repo |
|
434 | 434 | while cloning |
|
435 | 435 | |
|
436 |
$ cat > |
|
|
437 |
> import |
|
|
438 | > from mercurial import extensions, vfs | |
|
439 | > def __call__(orig, self, path, *args, **kwargs): | |
|
440 | > if path == 'data/f1.i': | |
|
441 | > time.sleep(2) | |
|
442 | > return orig(self, path, *args, **kwargs) | |
|
443 | > extensions.wrapfunction(vfs.vfs, '__call__', __call__) | |
|
436 | $ cat > stream_steps.py <<EOF | |
|
437 | > import os | |
|
438 | > import sys | |
|
439 | > from mercurial import ( | |
|
440 | > encoding, | |
|
441 | > extensions, | |
|
442 | > streamclone, | |
|
443 | > testing, | |
|
444 | > ) | |
|
445 | > WALKED_FILE_1 = encoding.environ[b'HG_TEST_STREAM_WALKED_FILE_1'] | |
|
446 | > WALKED_FILE_2 = encoding.environ[b'HG_TEST_STREAM_WALKED_FILE_2'] | |
|
447 | > | |
|
448 | > def _test_sync_point_walk_1(orig, repo): | |
|
449 | > testing.write_file(WALKED_FILE_1) | |
|
450 | > | |
|
451 | > def _test_sync_point_walk_2(orig, repo): | |
|
452 | > assert repo._currentlock(repo._lockref) is None | |
|
453 | > testing.wait_file(WALKED_FILE_2) | |
|
454 | > | |
|
455 | > extensions.wrapfunction( | |
|
456 | > streamclone, | |
|
457 | > '_test_sync_point_walk_1', | |
|
458 | > _test_sync_point_walk_1 | |
|
459 | > ) | |
|
460 | > extensions.wrapfunction( | |
|
461 | > streamclone, | |
|
462 | > '_test_sync_point_walk_2', | |
|
463 | > _test_sync_point_walk_2 | |
|
464 | > ) | |
|
444 | 465 | > EOF |
|
445 | 466 | |
|
446 | 467 | prepare repo with small and big file to cover both code paths in emitrevlogdata |
@@ -449,20 +470,32 b' prepare repo with small and big file to ' | |||
|
449 | 470 | $ touch repo/f1 |
|
450 | 471 | $ $TESTDIR/seq.py 50000 > repo/f2 |
|
451 | 472 | $ hg -R repo ci -Aqm "0" |
|
452 | $ hg serve -R repo -p $HGPORT1 -d --pid-file=hg.pid --config extensions.delayer=delayer.py | |
|
473 | $ HG_TEST_STREAM_WALKED_FILE_1="$TESTTMP/sync_file_walked_1" | |
|
474 | $ export HG_TEST_STREAM_WALKED_FILE_1 | |
|
475 | $ HG_TEST_STREAM_WALKED_FILE_2="$TESTTMP/sync_file_walked_2" | |
|
476 | $ export HG_TEST_STREAM_WALKED_FILE_2 | |
|
477 | $ HG_TEST_STREAM_WALKED_FILE_3="$TESTTMP/sync_file_walked_3" | |
|
478 | $ export HG_TEST_STREAM_WALKED_FILE_3 | |
|
479 | # $ cat << EOF >> $HGRCPATH | |
|
480 | # > [hooks] | |
|
481 | # > pre-clone=rm -f "$TESTTMP/sync_file_walked_*" | |
|
482 | # > EOF | |
|
483 | $ hg serve -R repo -p $HGPORT1 -d --error errors.log --pid-file=hg.pid --config extensions.stream_steps="$RUNTESTDIR/testlib/ext-stream-clone-steps.py" | |
|
453 | 484 | $ cat hg.pid >> $DAEMON_PIDS |
|
454 | 485 | |
|
455 | 486 | clone while modifying the repo between stating file with write lock and |
|
456 | 487 | actually serving file content |
|
457 | 488 | |
|
458 | $ hg clone -q --stream -U http://localhost:$HGPORT1 clone & | |
|
459 | $ sleep 1 | |
|
489 | $ (hg clone -q --stream -U http://localhost:$HGPORT1 clone; touch "$HG_TEST_STREAM_WALKED_FILE_3") & | |
|
490 | $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1 | |
|
460 | 491 | $ echo >> repo/f1 |
|
461 | 492 | $ echo >> repo/f2 |
|
462 | 493 | $ hg -R repo ci -m "1" --config ui.timeout.warn=-1 |
|
463 | $ wait | |
|
494 | $ touch $HG_TEST_STREAM_WALKED_FILE_2 | |
|
495 | $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3 | |
|
464 | 496 | $ hg -R clone id |
|
465 | 497 | 000000000000 |
|
498 | $ cat errors.log | |
|
466 | 499 | $ cd .. |
|
467 | 500 | |
|
468 | 501 | Stream repository with bookmarks |
General Comments 0
You need to be logged in to leave comments.
Login now