Mercurial > hg
comparison mercurial/streamclone.py @ 47444:2f4ca4807033
streamingclone: extract the scanning part from the generation part
We will reuse the scanning part for local clone, so we need it in a dedicated
function.
Differential Revision: https://phab.mercurial-scm.org/D10852
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 08 Jun 2021 02:06:02 +0200 |
parents | aed6ceaad6d7 |
children | 377d8fc20e34 |
comparison
equal
deleted
inserted
replaced
47443:9ab54aa56982 | 47444:2f4ca4807033 |
---|---|
601 | 601 |
602 def _test_sync_point_walk_2(repo): | 602 def _test_sync_point_walk_2(repo): |
603 """a function for synchronisation during tests""" | 603 """a function for synchronisation during tests""" |
604 | 604 |
605 | 605 |
606 def _v2_walk(repo, includes, excludes, includeobsmarkers): | |
607 """emit a seris of files information useful to clone a repo | |
608 | |
609 return (entries, totalfilesize) | |
610 | |
611 entries is a list of tuple (vfs-key, file-path, file-type, size) | |
612 | |
613 - `vfs-key`: is a key to the right vfs to write the file (see _makemap) | |
614 - `name`: file path of the file to copy (to be feed to the vfss) | |
615 - `file-type`: do this file need to be copied with the source lock ? | |
616 - `size`: the size of the file (or None) | |
617 """ | |
618 assert repo._currentlock(repo._lockref) is not None | |
619 entries = [] | |
620 totalfilesize = 0 | |
621 | |
622 matcher = None | |
623 if includes or excludes: | |
624 matcher = narrowspec.match(repo.root, includes, excludes) | |
625 | |
626 for rl_type, name, ename, size in _walkstreamfiles(repo, matcher): | |
627 if size: | |
628 ft = _fileappend | |
629 if rl_type & store.FILEFLAGS_VOLATILE: | |
630 ft = _filefull | |
631 entries.append((_srcstore, name, ft, size)) | |
632 totalfilesize += size | |
633 for name in _walkstreamfullstorefiles(repo): | |
634 if repo.svfs.exists(name): | |
635 totalfilesize += repo.svfs.lstat(name).st_size | |
636 entries.append((_srcstore, name, _filefull, None)) | |
637 if includeobsmarkers and repo.svfs.exists(b'obsstore'): | |
638 totalfilesize += repo.svfs.lstat(b'obsstore').st_size | |
639 entries.append((_srcstore, b'obsstore', _filefull, None)) | |
640 for name in cacheutil.cachetocopy(repo): | |
641 if repo.cachevfs.exists(name): | |
642 totalfilesize += repo.cachevfs.lstat(name).st_size | |
643 entries.append((_srccache, name, _filefull, None)) | |
644 return entries, totalfilesize | |
645 | |
646 | |
606 def generatev2(repo, includes, excludes, includeobsmarkers): | 647 def generatev2(repo, includes, excludes, includeobsmarkers): |
607 """Emit content for version 2 of a streaming clone. | 648 """Emit content for version 2 of a streaming clone. |
608 | 649 |
609 the data stream consists the following entries: | 650 the data stream consists the following entries: |
610 1) A char representing the file destination (eg: store or cache) | 651 1) A char representing the file destination (eg: store or cache) |
616 Returns a 3-tuple of (file count, file size, data iterator). | 657 Returns a 3-tuple of (file count, file size, data iterator). |
617 """ | 658 """ |
618 | 659 |
619 with repo.lock(): | 660 with repo.lock(): |
620 | 661 |
621 entries = [] | |
622 totalfilesize = 0 | |
623 | |
624 matcher = None | |
625 if includes or excludes: | |
626 matcher = narrowspec.match(repo.root, includes, excludes) | |
627 | |
628 repo.ui.debug(b'scanning\n') | 662 repo.ui.debug(b'scanning\n') |
629 for rl_type, name, ename, size in _walkstreamfiles(repo, matcher): | 663 |
630 if size: | 664 entries, totalfilesize = _v2_walk( |
631 ft = _fileappend | 665 repo, |
632 if rl_type & store.FILEFLAGS_VOLATILE: | 666 includes=includes, |
633 ft = _filefull | 667 excludes=excludes, |
634 entries.append((_srcstore, name, ft, size)) | 668 includeobsmarkers=includeobsmarkers, |
635 totalfilesize += size | 669 ) |
636 for name in _walkstreamfullstorefiles(repo): | |
637 if repo.svfs.exists(name): | |
638 totalfilesize += repo.svfs.lstat(name).st_size | |
639 entries.append((_srcstore, name, _filefull, None)) | |
640 if includeobsmarkers and repo.svfs.exists(b'obsstore'): | |
641 totalfilesize += repo.svfs.lstat(b'obsstore').st_size | |
642 entries.append((_srcstore, b'obsstore', _filefull, None)) | |
643 for name in cacheutil.cachetocopy(repo): | |
644 if repo.cachevfs.exists(name): | |
645 totalfilesize += repo.cachevfs.lstat(name).st_size | |
646 entries.append((_srccache, name, _filefull, None)) | |
647 | 670 |
648 chunks = _emit2(repo, entries, totalfilesize) | 671 chunks = _emit2(repo, entries, totalfilesize) |
649 first = next(chunks) | 672 first = next(chunks) |
650 assert first is None | 673 assert first is None |
651 _test_sync_point_walk_1(repo) | 674 _test_sync_point_walk_1(repo) |