Mercurial > public > mercurial-scm > hg
annotate mercurial/streamclone.py @ 52922:0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
The `threading.Condition` object from the stdlib suffer for excessive
creation/destruction of the underlying locks. This destroy its performance to a
quite noticeable point.
Recreating the same logic with persistent lock yields an absurdly big
performance gain. In practice, most of the slowdown introduced by threading is
recovered.
This benchmark compare the non-threaded baseline, the naive threaded
implementation with memory limitation, the previous changeset and this one.
### benchmark.name = hg.perf.exchange.stream.consume
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.memory-target = default
# benchmark.variants.num-writer = default
# benchmark.variants.parallel-processing = yes
# benchmark.variants.progress = no
# benchmark.variants.read-from-memory = yes
# benchmark.variants.version = v2
## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
no-thread: 0.249693 ~~~~~
naive-thread: 0.305973 (+22.54%, +0.06)
prev-change: 0.305442 (+22.33%, +0.06)
this-change: 0.258450 (+3.51%, +0.01)
## data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
no-thread: 13.136674 ~~~~~
naive-thread: 18.467590 (+40.58%, +5.33)
prev-change: 17.788205 (+35.41%, +4.65)
this-change: 13.715187 (+4.40%, +0.58)
## data-env-vars.name = netbsd-xsrc-all-2024-09-19-zstd-sparse-revlog
no-thread: 5.317709 ~~~~~
naive-thread: 7.338505 (+38.00%, +2.02)
prev-change: 7.122798 (+33.94%, +1.81)
this-change: 5.687069 (+6.95%, +0.37)
## data-env-vars.name = netbsd-xsrc-draft-2024-09-19-zstd-sparse-revlog
no-thread: 5.398368 ~~~~~
naive-thread: 7.333354 (+35.84%, +1.93)
prev-change: 7.123533 (+31.96%, +1.73)
this-change: 5.749082 (+6.50%, +0.35)
## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
no-thread: 3.acbb55 ~~~~~
naive-thread: 4.238172 (+38.11%, +1.17)
prev-change: 4.095587 (+33.47%, +1.03)
this-change: 3.179653 (+3.62%, +0.11)
## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
no-thread: 7.244015 ~~~~~
naive-thread: 9.901032 (+36.68%, +2.66)
prev-change: 9.728038 (+34.29%, +2.48)
this-change: 7.638277 (+5.44%, +0.39)
## data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
no-thread: 51.934795 ~~~~~
naive-thread: 78.194540 (+50.56%, +26.26)
prev-change: 72.574373 (+39.74%, +20.64)
this-change: 56.267824 (+8.34%, +4.33)
## data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
no-thread: 52.253858 ~~~~~
naive-thread: 77.492938 (+48.30%, +25.24)
prev-change: 72.845963 (+39.41%, +20.59)
this-change: 55.368316 (+5.96%, +3.11)
## data-env-vars.name = mozilla-try-2024-03-26-zstd-sparse-revlog
# benchmark.variants.read-from-memory = no
no-thread: 130.584329 ~~~~~
naive-thread: 164.366925 (+25.87%, +33.78)
prev-change: 154.873570 (+18.60%, +24.29)
this-change: 132.137611 (+1.19%, +1.55)
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 05 Feb 2025 12:17:00 +0100 |
parents | 363914ba328d |
children | f1ac5117459b |
rev | line source |
---|---|
26441
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
1 # streamclone.py - producing and consuming streaming repository data |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
2 # |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
3 # Copyright 2015 Gregory Szorc <gregory.szorc@gmail.com> |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
4 # |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
7 |
51859
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51699
diff
changeset
|
8 from __future__ import annotations |
26441
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
9 |
52922
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
10 import collections |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
11 import contextlib |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
12 import errno |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
13 import os |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
14 import struct |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
15 import threading |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
16 |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
17 from typing import ( |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
18 Callable, |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
19 Iterable, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
20 Iterator, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
21 Optional, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
22 Set, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
23 Tuple, |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
24 Type, |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
25 ) |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
26 |
26442
ef8d27f53204
streamclone: move stream_in() from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26441
diff
changeset
|
27 from .i18n import _ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
28 from .interfaces import repository |
26441
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
29 from . import ( |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
30 bookmarks, |
50520
a6543983b8f4
stream-clone: check is a compatible protocol can be found
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50519
diff
changeset
|
31 bundle2 as bundle2mod, |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
32 cacheutil, |
26442
ef8d27f53204
streamclone: move stream_in() from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26441
diff
changeset
|
33 error, |
40339
f0e8f27768eb
streamclone: pass narrowing related info in _walkstreamfiles()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
40338
diff
changeset
|
34 narrowspec, |
32744
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
35 phases, |
38164
aac4be30e250
py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
37638
diff
changeset
|
36 pycompat, |
46626
ee91966aec0f
requirements: add constant for revlog v1 requirement
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45106
diff
changeset
|
37 requirements as requirementsmod, |
45106
a03c177a4679
scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
43117
diff
changeset
|
38 scmutil, |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
39 store, |
50286
3d0b5760851c
undo-files: move the undo cleanup code in the transaction module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50279
diff
changeset
|
40 transaction, |
26442
ef8d27f53204
streamclone: move stream_in() from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26441
diff
changeset
|
41 util, |
26441
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
42 ) |
48693
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
43 from .revlogutils import ( |
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
44 nodemap, |
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
45 ) |
26441
56527b886d1d
streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff
changeset
|
46 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
47 |
52913
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
48 # Number arbitrarily picked, feel free to change them (but the LOW one) |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
49 # |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
50 # update the configuration documentation if you touch this. |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
51 DEFAULT_NUM_WRITER = { |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
52 scmutil.RESOURCE_LOW: 1, |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
53 scmutil.RESOURCE_MEDIUM: 2, |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
54 scmutil.RESOURCE_HIGH: 4, |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
55 } |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
56 |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
57 |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
58 # Number arbitrarily picked, feel free to adjust them. Do update the |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
59 # documentation if you do so |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
60 DEFAULT_MEMORY_TARGET = { |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
61 scmutil.RESOURCE_LOW: 100 * (2**20), # 100 MB |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
62 scmutil.RESOURCE_MEDIUM: 2**30, # 1 GB |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
63 scmutil.RESOURCE_HIGH: None, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
64 } |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
65 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
66 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
67 def new_stream_clone_requirements( |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
68 default_requirements: Iterable[bytes], |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
69 streamed_requirements: Iterable[bytes], |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
70 ) -> Set[bytes]: |
48596
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
71 """determine the final set of requirement for a new stream clone |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
72 |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
73 this method combine the "default" requirements that a new repository would |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
74 use with the constaint we get from the stream clone content. We keep local |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
75 configuration choice when possible. |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
76 """ |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
77 requirements = set(default_requirements) |
48601
baddab229b86
stream-clone: add a explicit set list requirements relevant to stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48600
diff
changeset
|
78 requirements -= requirementsmod.STREAM_FIXED_REQUIREMENTS |
48596
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
79 requirements.update(streamed_requirements) |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
80 return requirements |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
81 |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
82 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
83 def streamed_requirements(repo) -> Set[bytes]: |
48597
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
84 """the set of requirement the new clone will have to support |
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
85 |
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
86 This is used for advertising the stream options and to generate the actual |
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
87 stream content.""" |
48601
baddab229b86
stream-clone: add a explicit set list requirements relevant to stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48600
diff
changeset
|
88 requiredformats = ( |
baddab229b86
stream-clone: add a explicit set list requirements relevant to stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48600
diff
changeset
|
89 repo.requirements & requirementsmod.STREAM_FIXED_REQUIREMENTS |
baddab229b86
stream-clone: add a explicit set list requirements relevant to stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48600
diff
changeset
|
90 ) |
48597
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
91 return requiredformats |
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
92 |
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
93 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
94 def canperformstreamclone(pullop, bundle2: bool = False): |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
95 """Whether it is possible to perform a streaming clone as part of pull. |
26445
f134fb33c906
streamclone: move streaming clone logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26444
diff
changeset
|
96 |
35757
bbf7abd09ff0
streamclone: rework canperformstreamclone
Boris Feld <boris.feld@octobus.net>
parents:
35756
diff
changeset
|
97 ``bundle2`` will cause the function to consider stream clone through |
bbf7abd09ff0
streamclone: rework canperformstreamclone
Boris Feld <boris.feld@octobus.net>
parents:
35756
diff
changeset
|
98 bundle2 and only through bundle2. |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
99 |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
100 Returns a tuple of (supported, requirements). ``supported`` is True if |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
101 streaming clone is supported and False otherwise. ``requirements`` is |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
102 a set of repo requirements from the remote, or ``None`` if stream clone |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
103 isn't supported. |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
104 """ |
26466
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
105 repo = pullop.repo |
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
106 remote = pullop.remote |
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
107 |
50519
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
108 # should we consider streaming clone at all ? |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
109 streamrequested = pullop.streamclonerequested |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
110 # If we don't have a preference, let the server decide for us. This |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
111 # likely only comes into play in LANs. |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
112 if streamrequested is None: |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
113 # The server can advertise whether to prefer streaming clone. |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
114 streamrequested = remote.capable(b'stream-preferred') |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
115 if not streamrequested: |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
116 return False, None |
58e4842fbfc1
stream-clone: bail-out earlier if stream clone is not requested
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50518
diff
changeset
|
117 |
50517
0558866957fa
stream-clone: bail-out earlier if destination repo is not empty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50513
diff
changeset
|
118 # Streaming clone only works on an empty destination repository |
0558866957fa
stream-clone: bail-out earlier if destination repo is not empty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50513
diff
changeset
|
119 if len(repo): |
0558866957fa
stream-clone: bail-out earlier if destination repo is not empty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50513
diff
changeset
|
120 return False, None |
0558866957fa
stream-clone: bail-out earlier if destination repo is not empty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50513
diff
changeset
|
121 |
50518
f697af015683
stream-clone: bail-out earlier if pull is partial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50517
diff
changeset
|
122 # Streaming clone only works if all data is being requested. |
f697af015683
stream-clone: bail-out earlier if pull is partial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50517
diff
changeset
|
123 if pullop.heads: |
f697af015683
stream-clone: bail-out earlier if pull is partial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50517
diff
changeset
|
124 return False, None |
f697af015683
stream-clone: bail-out earlier if pull is partial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50517
diff
changeset
|
125 |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
126 bundle2supported = False |
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
127 if pullop.canusebundle2: |
50520
a6543983b8f4
stream-clone: check is a compatible protocol can be found
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50519
diff
changeset
|
128 local_caps = bundle2mod.getrepocaps(repo, role=b'client') |
a6543983b8f4
stream-clone: check is a compatible protocol can be found
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50519
diff
changeset
|
129 local_supported = set(local_caps.get(b'stream', [])) |
a6543983b8f4
stream-clone: check is a compatible protocol can be found
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50519
diff
changeset
|
130 remote_supported = set(pullop.remotebundle2caps.get(b'stream', [])) |
a6543983b8f4
stream-clone: check is a compatible protocol can be found
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50519
diff
changeset
|
131 bundle2supported = bool(local_supported & remote_supported) |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
132 # else |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
133 # Server doesn't support bundle2 stream clone or doesn't support |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
134 # the versions we support. Fall back and possibly allow legacy. |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
135 |
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
136 # Ensures legacy code path uses available bundle2. |
35757
bbf7abd09ff0
streamclone: rework canperformstreamclone
Boris Feld <boris.feld@octobus.net>
parents:
35756
diff
changeset
|
137 if bundle2supported and not bundle2: |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
138 return False, None |
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
139 # Ensures bundle2 doesn't try to do a stream clone if it isn't supported. |
35757
bbf7abd09ff0
streamclone: rework canperformstreamclone
Boris Feld <boris.feld@octobus.net>
parents:
35756
diff
changeset
|
140 elif bundle2 and not bundle2supported: |
bbf7abd09ff0
streamclone: rework canperformstreamclone
Boris Feld <boris.feld@octobus.net>
parents:
35756
diff
changeset
|
141 return False, None |
26467
ff2c89239d49
streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26466
diff
changeset
|
142 |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
143 # In order for stream clone to work, the client has to support all the |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
144 # requirements advertised by the server. |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
145 # |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
146 # The server advertises its requirements via the "stream" and "streamreqs" |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
147 # capability. "stream" (a value-less capability) is advertised if and only |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
148 # if the only requirement is "revlogv1." Else, the "streamreqs" capability |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
149 # is advertised and contains a comma-delimited list of requirements. |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
150 requirements = set() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
151 if remote.capable(b'stream'): |
46626
ee91966aec0f
requirements: add constant for revlog v1 requirement
Rapha?l Gom?s <rgomes@octobus.net>
parents:
45106
diff
changeset
|
152 requirements.add(requirementsmod.REVLOGV1_REQUIREMENT) |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
153 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
154 streamreqs = remote.capable(b'streamreqs') |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
155 # This is weird and shouldn't happen with modern servers. |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
156 if not streamreqs: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
157 pullop.repo.ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
158 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 b'warning: stream clone requested but server has them ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
160 b'disabled\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
161 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
162 ) |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
163 return False, None |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
164 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
165 streamreqs = set(streamreqs.split(b',')) |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
166 # Server requires something we don't support. Bail. |
48670
6d2ddea0721a
stream-clone: filter possible missing requirements using all supported one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
167 missingreqs = streamreqs - repo.supported |
32259
076f1ff43f0f
clone: warn when streaming was requested but couldn't be performed
Siddharth Agarwal <sid0@fb.com>
parents:
30975
diff
changeset
|
168 if missingreqs: |
076f1ff43f0f
clone: warn when streaming was requested but couldn't be performed
Siddharth Agarwal <sid0@fb.com>
parents:
30975
diff
changeset
|
169 pullop.repo.ui.warn( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
170 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
171 b'warning: stream clone requested but client is missing ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
172 b'requirements: %s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
173 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
174 % b', '.join(sorted(missingreqs)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
175 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
176 pullop.repo.ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
177 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
178 b'(see https://www.mercurial-scm.org/wiki/MissingRequirement ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
179 b'for more information)\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
180 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
181 ) |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
182 return False, None |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
183 requirements = streamreqs |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
184 |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
185 return True, requirements |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
186 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
187 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
188 def maybeperformlegacystreamclone(pullop) -> None: |
26462
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
189 """Possibly perform a legacy stream clone operation. |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
190 |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
191 Legacy stream clones are performed as part of pull but before all other |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
192 operations. |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
193 |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
194 A legacy stream clone will not be performed if a bundle2 stream clone is |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
195 supported. |
3b0ec09192ae
streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26461
diff
changeset
|
196 """ |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
197 from . import localrepo |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
198 |
26466
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
199 supported, requirements = canperformstreamclone(pullop) |
26458
362793295640
streamclone: refactor maybeperformstreamclone to take a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26447
diff
changeset
|
200 |
26446
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
201 if not supported: |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
202 return |
3ea10bb761ce
streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26445
diff
changeset
|
203 |
26466
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
204 repo = pullop.repo |
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
205 remote = pullop.remote |
3515db5aae05
streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26462
diff
changeset
|
206 |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
207 # Save remote branchmap. We will use it later to speed up branchcache |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
208 # creation. |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
209 rbranchmap = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
210 if remote.capable(b'branchmap'): |
37638
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
211 with remote.commandexecutor() as e: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 rbranchmap = e.callcommand(b'branchmap', {}).result() |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
213 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
214 repo.ui.status(_(b'streaming all changes\n')) |
26470
4b5647d9ee13
streamclone: move "streaming all changes" message location
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26469
diff
changeset
|
215 |
37638
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
216 with remote.commandexecutor() as e: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
217 fp = e.callcommand(b'stream_out', {}).result() |
37638
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
218 |
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
219 # TODO strictly speaking, this code should all be inside the context |
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
220 # manager because the context manager is supposed to ensure all wire state |
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
221 # is flushed when exiting. But the legacy peers don't do this, so it |
65b86ee69383
streamclone: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35804
diff
changeset
|
222 # doesn't matter. |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
223 l = fp.readline() |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
224 try: |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
225 resp = int(l) |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
226 except ValueError: |
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
227 raise error.ResponseError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
228 _(b'unexpected response from remote server:'), l |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
229 ) |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
230 if resp == 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
231 raise error.Abort(_(b'operation forbidden by server')) |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
232 elif resp == 2: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 raise error.Abort(_(b'locking the remote repository failed')) |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
234 elif resp != 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
235 raise error.Abort(_(b'the server sent an unknown error code')) |
26459
3b28ffde133a
streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26458
diff
changeset
|
236 |
26468
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
237 l = fp.readline() |
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
238 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
239 filecount, bytecount = map(int, l.split(b' ', 1)) |
26468
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
240 except (ValueError, TypeError): |
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
241 raise error.ResponseError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
242 _(b'unexpected response from remote server:'), l |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
243 ) |
26468
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
244 |
27850
49cfddbf54ba
with: use context manager in maybeperformlegacystreamclone
Bryan O'Sullivan <bryano@fb.com>
parents:
27845
diff
changeset
|
245 with repo.lock(): |
26468
19bbd53af46d
streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26467
diff
changeset
|
246 consumev1(repo, fp, filecount, bytecount) |
48596
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
247 repo.requirements = new_stream_clone_requirements( |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
248 repo.requirements, |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
249 requirements, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
250 ) |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
251 repo.svfs.options = localrepo.resolvestorevfsoptions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
252 repo.ui, repo.requirements, repo.features |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
253 ) |
45106
a03c177a4679
scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
43117
diff
changeset
|
254 scmutil.writereporequirements(repo) |
48693
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
255 nodemap.post_stream_cleanup(repo) |
26461
09cc3c2e9ece
streamclone: move applyremotedata() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26460
diff
changeset
|
256 |
09cc3c2e9ece
streamclone: move applyremotedata() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26460
diff
changeset
|
257 if rbranchmap: |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
40494
diff
changeset
|
258 repo._branchcaches.replace(repo, rbranchmap) |
26461
09cc3c2e9ece
streamclone: move applyremotedata() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26460
diff
changeset
|
259 |
09cc3c2e9ece
streamclone: move applyremotedata() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26460
diff
changeset
|
260 repo.invalidate() |
26445
f134fb33c906
streamclone: move streaming clone logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26444
diff
changeset
|
261 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
262 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
263 def allowservergeneration(repo) -> bool: |
26444
623743010133
streamclone: move _allowstream() from wireproto
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26443
diff
changeset
|
264 """Whether streaming clones are allowed from the server.""" |
40028
51f10e6d66c7
streamclone: don't support stream clone unless repo feature present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
265 if repository.REPO_FEATURE_STREAM_CLONE not in repo.features: |
51f10e6d66c7
streamclone: don't support stream clone unless repo feature present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
266 return False |
51f10e6d66c7
streamclone: don't support stream clone unless repo feature present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
267 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
268 if not repo.ui.configbool(b'server', b'uncompressed', untrusted=True): |
32744
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
269 return False |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
270 |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
271 # The way stream clone works makes it impossible to hide secret changesets. |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
272 # So don't allow this by default. |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
273 secret = phases.hassecret(repo) |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
274 if secret: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
275 return repo.ui.configbool(b'server', b'uncompressedallowsecret') |
32744
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
276 |
33b7283a3828
streamclone: consider secret changesets (BC) (issue5589)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32259
diff
changeset
|
277 return True |
26444
623743010133
streamclone: move _allowstream() from wireproto
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26443
diff
changeset
|
278 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
279 |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
280 # This is it's own function so extensions can override it. |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
281 def _walkstreamfiles( |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
282 repo, matcher=None, phase: bool = False, obsolescence: bool = False |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
283 ): |
50511
0925eaf09c8b
store: make `walk` return an entry for obsolescence if requested so
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50509
diff
changeset
|
284 return repo.store.walk(matcher, phase=phase, obsolescence=obsolescence) |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
285 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
286 |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
287 def _report_transferred( |
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
288 repo, start_time: float, file_count: int, byte_count: int |
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
289 ): |
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
290 """common utility to report time it took to apply the stream bundle""" |
52700
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
291 elapsed = util.timer() - start_time |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
292 if elapsed <= 0: |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
293 elapsed = 0.001 |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
294 m = _(b'stream-cloned %d files / %s in %.1f seconds (%s/sec)\n') |
52700
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
295 m %= ( |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
296 file_count, |
52700
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
297 util.bytecount(byte_count), |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
298 elapsed, |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
299 util.bytecount(byte_count / elapsed), |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
300 ) |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
301 repo.ui.status(m) |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
302 |
061bfd699a56
stream: use an utility function to report transferred bytes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52696
diff
changeset
|
303 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
304 def generatev1(repo) -> tuple[int, int, Iterator[bytes]]: |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
305 """Emit content for version 1 of a streaming clone. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
306 |
26469
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
307 This returns a 3-tuple of (file count, byte size, data iterator). |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
308 |
26469
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
309 The data iterator consists of N entries for each file being transferred. |
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
310 Each file entry starts as a line with the file name and integer size |
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
311 delimited by a null byte. |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
312 |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
313 The raw file data follows. Following the raw file data is the next file |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
314 entry, or EOF. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
315 |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
316 When used on the wire protocol, an additional line indicating protocol |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
317 success will be prepended to the stream. This function is not responsible |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
318 for adding it. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
319 |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
320 This function will obtain a repository lock to ensure a consistent view of |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
321 the store is captured. It therefore may raise LockError. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
322 """ |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
323 entries = [] |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
324 total_bytes = 0 |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
325 # Get consistent snapshot of repo, lock during scan. |
27845
7417e1c10253
with: use context manager in streamclone generatev1
Bryan O'Sullivan <bryano@fb.com>
parents:
27794
diff
changeset
|
326 with repo.lock(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
327 repo.ui.debug(b'scanning\n') |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
328 _test_sync_point_walk_1_2(repo) |
50468
521fec115dad
store: use a StoreEntry object instead of tuple for store files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50288
diff
changeset
|
329 for entry in _walkstreamfiles(repo): |
50469
9fdc28e21b68
store: introduce a EntryFile object to actually access file info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50468
diff
changeset
|
330 for f in entry.files(): |
50474
4cbdfab6f812
store: lazily get file size on demand for the fncache case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50469
diff
changeset
|
331 file_size = f.file_size(repo.store.vfs) |
4cbdfab6f812
store: lazily get file size on demand for the fncache case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50469
diff
changeset
|
332 if file_size: |
4cbdfab6f812
store: lazily get file size on demand for the fncache case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50469
diff
changeset
|
333 entries.append((f.unencoded_path, file_size)) |
4cbdfab6f812
store: lazily get file size on demand for the fncache case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50469
diff
changeset
|
334 total_bytes += file_size |
52358
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
335 _test_sync_point_walk_3(repo) |
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
336 _test_sync_point_walk_4(repo) |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
337 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
338 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
339 b'%d files, %d bytes to transfer\n' % (len(entries), total_bytes) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
340 ) |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
341 |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
342 svfs = repo.svfs |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
343 debugflag = repo.ui.debugflag |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
344 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
345 def emitrevlogdata() -> Iterator[bytes]: |
33258
761ccfeff8b1
streamclone: stop using 'vfs.mustaudit = False'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33257
diff
changeset
|
346 for name, size in entries: |
761ccfeff8b1
streamclone: stop using 'vfs.mustaudit = False'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33257
diff
changeset
|
347 if debugflag: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 repo.ui.debug(b'sending %s (%d bytes)\n' % (name, size)) |
33258
761ccfeff8b1
streamclone: stop using 'vfs.mustaudit = False'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33257
diff
changeset
|
349 # partially encode name over the wire for backwards compat |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
350 yield b'%s\0%d\n' % (store.encodedir(name), size) |
33411
50b49bb0fff3
streamclone: comment why path auditing is disabled in generatev1()
Yuya Nishihara <yuya@tcha.org>
parents:
33410
diff
changeset
|
351 # auditing at this stage is both pointless (paths are already |
50b49bb0fff3
streamclone: comment why path auditing is disabled in generatev1()
Yuya Nishihara <yuya@tcha.org>
parents:
33410
diff
changeset
|
352 # trusted by the local repo) and expensive |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
353 with svfs(name, b'rb', auditpath=False) as fp: |
33410
c784308305c6
streamclone: close large revlog files explicitly in generatev1()
Yuya Nishihara <yuya@tcha.org>
parents:
33258
diff
changeset
|
354 if size <= 65536: |
33258
761ccfeff8b1
streamclone: stop using 'vfs.mustaudit = False'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33257
diff
changeset
|
355 yield fp.read(size) |
33410
c784308305c6
streamclone: close large revlog files explicitly in generatev1()
Yuya Nishihara <yuya@tcha.org>
parents:
33258
diff
changeset
|
356 else: |
52644
e627cc25b6f3
pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52640
diff
changeset
|
357 yield from util.filechunkiter(fp, limit=size) |
26469
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
358 |
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
359 return len(entries), total_bytes, emitrevlogdata() |
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
360 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
361 |
52691
279e217d6041
typing: lock in the new type annotations detected with the pyupgrade changes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52644
diff
changeset
|
362 def generatev1wireproto(repo) -> Iterator[bytes]: |
26469
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
363 """Emit content for version 1 of streaming clone suitable for the wire. |
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
364 |
35491
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
365 This is the data output from ``generatev1()`` with 2 header lines. The |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
366 first line indicates overall success. The 2nd contains the file count and |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
367 byte size of payload. |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
368 |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
369 The success line contains "0" for success, "1" for stream generation not |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
370 allowed, and "2" for error locking the repository (possibly indicating |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
371 a permissions error for the server process). |
26469
fb743268510e
streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26468
diff
changeset
|
372 """ |
35491
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
373 if not allowservergeneration(repo): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
374 yield b'1\n' |
35491
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
375 return |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
376 |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
377 try: |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
378 filecount, bytecount, it = generatev1(repo) |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
379 except error.LockError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
380 yield b'2\n' |
35491
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
381 return |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
382 |
ded3a63f305b
streamclone: move wire protocol status code from wireproto command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33499
diff
changeset
|
383 # Indicates successful response. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
384 yield b'0\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
385 yield b'%d %d\n' % (filecount, bytecount) |
52644
e627cc25b6f3
pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52640
diff
changeset
|
386 yield from it |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
387 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
388 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
389 def generatebundlev1( |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
390 repo, compression: bytes = b'UN' |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
391 ) -> tuple[Set[bytes], Iterator[bytes]]: |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
392 """Emit content for version 1 of a stream clone bundle. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
393 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
394 The first 4 bytes of the output ("HGS1") denote this as stream clone |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
395 bundle version 1. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
396 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
397 The next 2 bytes indicate the compression type. Only "UN" is currently |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
398 supported. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
399 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
400 The next 16 bytes are two 64-bit big endian unsigned integers indicating |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
401 file count and byte count, respectively. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
402 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
403 The next 2 bytes is a 16-bit big endian unsigned short declaring the length |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
404 of the requirements string, including a trailing \0. The following N bytes |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
405 are the requirements string, which is ASCII containing a comma-delimited |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
406 list of repo requirements that are needed to support the data. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
407 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
408 The remaining content is the output of ``generatev1()`` (which may be |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
409 compressed in the future). |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
410 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
411 Returns a tuple of (requirements, data generator). |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
412 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 if compression != b'UN': |
52696
10e7adbffa8c
streamclone: unbyteify string args to builtin Error classes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52695
diff
changeset
|
414 raise ValueError('we do not support the compression argument yet') |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
415 |
48597
8475a1364909
stream-clone: factor computation of requirement of a stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48596
diff
changeset
|
416 requirements = streamed_requirements(repo) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
417 requires = b','.join(sorted(requirements)) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
418 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
419 def gen() -> Iterator[bytes]: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
420 yield b'HGS1' |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
421 yield compression |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
422 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
423 filecount, bytecount, it = generatev1(repo) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
424 repo.ui.status( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
425 _(b'writing %d bytes for %d files\n') % (bytecount, filecount) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
426 ) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
427 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
428 yield struct.pack(b'>QQ', filecount, bytecount) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
429 yield struct.pack(b'>H', len(requires) + 1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
430 yield requires + b'\0' |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
431 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
432 # This is where we'll add compression in the future. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
433 assert compression == b'UN' |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
434 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
435 progress = repo.ui.makeprogress( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
436 _(b'bundle'), total=bytecount, unit=_(b'bytes') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
437 ) |
38349
e59eaf51cc0d
streamclone: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38164
diff
changeset
|
438 progress.update(0) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
439 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
440 for chunk in it: |
38349
e59eaf51cc0d
streamclone: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38164
diff
changeset
|
441 progress.increment(step=len(chunk)) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
442 yield chunk |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
443 |
38373
ef692614e601
progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38360
diff
changeset
|
444 progress.complete() |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
445 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
446 return requirements, gen() |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
447 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
448 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
449 def consumev1(repo, fp, filecount: int, bytecount: int) -> None: |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
450 """Apply the contents from version 1 of a streaming clone file handle. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
451 |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
29919
diff
changeset
|
452 This takes the output from "stream_out" and applies it to the specified |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
453 repository. |
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
454 |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
29919
diff
changeset
|
455 Like "stream_out," the status line added by the wire protocol is not |
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
29919
diff
changeset
|
456 handled by this function. |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
457 """ |
27859
f55a5ace8e69
with: use context manager in streamclone consumev1
Bryan O'Sullivan <bryano@fb.com>
parents:
27850
diff
changeset
|
458 with repo.lock(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
459 repo.ui.status( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
460 _(b'%d files to transfer, %s of data\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
461 % (filecount, util.bytecount(bytecount)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
462 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
463 progress = repo.ui.makeprogress( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
464 _(b'clone'), total=bytecount, unit=_(b'bytes') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
465 ) |
38349
e59eaf51cc0d
streamclone: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38164
diff
changeset
|
466 progress.update(0) |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
30332
diff
changeset
|
467 start = util.timer() |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
468 |
29919
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
469 # TODO: get rid of (potential) inconsistency |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
470 # |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
471 # If transaction is started and any @filecache property is |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
472 # changed at this point, it causes inconsistency between |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
473 # in-memory cached property and streamclone-ed file on the |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
474 # disk. Nested transaction prevents transaction scope "clone" |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
475 # below from writing in-memory changes out at the end of it, |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
476 # even though in-memory changes are discarded at the end of it |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
477 # regardless of transaction nesting. |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
478 # |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
479 # But transaction nesting can't be simply prohibited, because |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
480 # nesting occurs also in ordinary case (e.g. enabling |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
481 # clonebundles). |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
482 |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
483 total_file_count = 0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
484 with repo.transaction(b'clone'): |
27897
2fdbf22a1b63
streamclone: use backgroundfilecloser (issue4889)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27896
diff
changeset
|
485 with repo.svfs.backgroundclosing(repo.ui, expectedcount=filecount): |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
49190
diff
changeset
|
486 for i in range(filecount): |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
487 # XXX doesn't support '\n' or '\r' in filenames |
50925
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50703
diff
changeset
|
488 if hasattr(fp, 'readline'): |
50663
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
489 l = fp.readline() |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
490 else: |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
491 # inline clonebundles use a chunkbuffer, so no readline |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
492 # --> this should be small anyway, the first line |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
493 # only contains the size of the bundle |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
494 l_buf = [] |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
495 while not (l_buf and l_buf[-1] == b'\n'): |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
496 l_buf.append(fp.read(1)) |
60f9602b413e
clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents:
50637
diff
changeset
|
497 l = b''.join(l_buf) |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
498 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
499 name, size = l.split(b'\0', 1) |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
500 size = int(size) |
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
501 except (ValueError, TypeError): |
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
502 raise error.ResponseError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
503 _(b'unexpected response from remote server:'), l |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
504 ) |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
505 if repo.ui.debugflag: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
506 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
507 b'adding %s (%s)\n' % (name, util.bytecount(size)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
508 ) |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
509 # for backwards compat, name was partially encoded |
27897
2fdbf22a1b63
streamclone: use backgroundfilecloser (issue4889)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27896
diff
changeset
|
510 path = store.decodedir(name) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
511 with repo.svfs(path, b'w', backgroundclose=True) as ofp: |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
512 total_file_count += 1 |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
513 for chunk in util.filechunkiter(fp, limit=size): |
38349
e59eaf51cc0d
streamclone: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents:
38164
diff
changeset
|
514 progress.increment(step=len(chunk)) |
27896
1d29893240cc
streamclone: indent code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27882
diff
changeset
|
515 ofp.write(chunk) |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
516 |
29919
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
517 # force @filecache properties to be reloaded from |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
518 # streamclone-ed file at next access |
519a02267f90
streamclone: clear caches after writing changes into files for visibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29917
diff
changeset
|
519 repo.invalidate(clearfilecache=True) |
26443
d947086d8973
streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26442
diff
changeset
|
520 |
38373
ef692614e601
progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38360
diff
changeset
|
521 progress.complete() |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
522 _report_transferred(repo, start, total_file_count, bytecount) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
523 |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
524 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
525 def readbundle1header(fp) -> tuple[int, int, Set[bytes]]: |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
526 compression = fp.read(2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
527 if compression != b'UN': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
528 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
529 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
530 b'only uncompressed stream clone bundles are ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
531 b'supported; got %s' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
532 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
533 % compression |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
534 ) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
535 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
536 filecount, bytecount = struct.unpack(b'>QQ', fp.read(16)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
537 requireslen = struct.unpack(b'>H', fp.read(2))[0] |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
538 requires = fp.read(requireslen) |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
539 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
540 if not requires.endswith(b'\0'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
541 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
542 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
543 b'malformed stream clone bundle: ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
544 b'requirements not properly encoded' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
545 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
546 ) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
547 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
548 requirements = set(requires.rstrip(b'\0').split(b',')) |
27882
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
549 |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
550 return filecount, bytecount, requirements |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
551 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
552 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
553 def applybundlev1(repo, fp) -> None: |
27882
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
554 """Apply the content from a stream clone bundle version 1. |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
555 |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
556 We assume the 4 byte header has been read and validated and the file handle |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
557 is at the 2 byte compression identifier. |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
558 """ |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
559 if len(repo): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
560 raise error.Abort( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43085
diff
changeset
|
561 _(b'cannot apply stream clone bundle on non-empty repo') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
562 ) |
27882
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
563 |
319b0bf6ecc9
streamclone: extract code for reading header fields
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27870
diff
changeset
|
564 filecount, bytecount, requirements = readbundle1header(fp) |
48670
6d2ddea0721a
stream-clone: filter possible missing requirements using all supported one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
565 missingreqs = requirements - repo.supported |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
566 if missingreqs: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
567 raise error.Abort( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43085
diff
changeset
|
568 _(b'unable to apply stream clone: unsupported format: %s') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 % b', '.join(sorted(missingreqs)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
570 ) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
571 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
572 consumev1(repo, fp, filecount, bytecount) |
48693
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
573 nodemap.post_stream_cleanup(repo) |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
574 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
575 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
576 class streamcloneapplier: |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
577 """Class to manage applying streaming clone bundles. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
578 |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
579 We need to wrap ``applybundlev1()`` in a dedicated type to enable bundle |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
580 readers to perform bundle type-specific functionality. |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
581 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
582 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
583 def __init__(self, fh) -> None: |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
584 self._fh = fh |
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
585 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
586 def apply(self, repo) -> None: |
26755
bb0b955d050d
streamclone: support for producing and consuming stream clone bundles
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
587 return applybundlev1(repo, self._fh) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
588 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
589 |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
590 # type of file to stream |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
591 _fileappend = 0 # append only file |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
592 _filefull = 1 # full snapshot file |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
593 |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
594 # Source of the file |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
595 _srcstore = b's' # store (svfs) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
596 _srccache = b'c' # cache (cache) |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
597 |
51699
ca7bde5dbafb
black: format the codebase with 23.3.0
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51696
diff
changeset
|
598 |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
599 # This is it's own function so extensions can override it. |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
600 def _walkstreamfullstorefiles(repo) -> list[bytes]: |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
601 """list snapshot file from the store""" |
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
602 fnames = [] |
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
603 if not repo.publishing(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
604 fnames.append(b'phaseroots') |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
605 return fnames |
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
606 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
607 |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
608 def _filterfull(entry, copy, vfsmap): |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
609 """actually copy the snapshot files""" |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
610 src, name, ftype, data = entry |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
611 if ftype != _filefull: |
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
612 return entry |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
613 return (src, name, ftype, copy(vfsmap[src].join(name))) |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
614 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
615 |
52012
e308439339e2
stream: rename TempCopyManager to VolatileManager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51859
diff
changeset
|
616 class VolatileManager: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
617 """Manage temporary backups of volatile files during stream clone. |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
618 |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
619 This class will keep open file handles for the volatile files, writing the |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
620 smaller ones on disk if the number of open file handles grow too much. |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
621 |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
622 This should be used as a Python context, the file handles and copies will |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
623 be discarded when exiting the context. |
49190
4ff4e23de7df
clone: use better names for temp files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48946
diff
changeset
|
624 |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
625 The preservation can be done by calling the object on the real path |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
626 (encoded full path). |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
627 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
628 Valid filehandles for any file should be retrieved by calling `open(path)`. |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
629 """ |
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
630 |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
631 # arbitrarily picked as "it seemed fine" and much higher than the current |
52184
e4b242f9d4d9
streamclone: disable the volatile file open handle optimization on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
52015
diff
changeset
|
632 # usage. The Windows value of 2 is actually 1 file open at a time, due to |
e4b242f9d4d9
streamclone: disable the volatile file open handle optimization on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
52015
diff
changeset
|
633 # the `flush_count = self.MAX_OPEN // 2` and `self.MAX_OPEN - 1` threshold |
e4b242f9d4d9
streamclone: disable the volatile file open handle optimization on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
52015
diff
changeset
|
634 # for flushing to disk in __call__(). |
e4b242f9d4d9
streamclone: disable the volatile file open handle optimization on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
52015
diff
changeset
|
635 MAX_OPEN = 2 if pycompat.iswindows else 100 |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
636 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
637 def __init__(self) -> None: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
638 self._counter = 0 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
639 self._volatile_fps = None |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
640 self._copies = None |
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
641 self._dst_dir = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
642 |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
643 def __enter__(self): |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
644 if self._counter == 0: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
645 assert self._volatile_fps is None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
646 self._volatile_fps = {} |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
647 self._counter += 1 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
648 return self |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
649 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
650 def __exit__(self, *args, **kwars): |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
651 """discard all backups""" |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
652 self._counter -= 1 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
653 if self._counter == 0: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
654 for _size, fp in self._volatile_fps.values(): |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
655 fp.close() |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
656 self._volatile_fps = None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
657 if self._copies is not None: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
658 for tmp in self._copies.values(): |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
659 util.tryunlink(tmp) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
660 util.tryrmdir(self._dst_dir) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
661 self._copies = None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
662 self._dst_dir = None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
663 assert self._volatile_fps is None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
664 assert self._copies is None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
665 assert self._dst_dir is None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
666 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
667 def _init_tmp_copies(self) -> None: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
668 """prepare a temporary directory to save volatile files |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
669 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
670 This will be used as backup if we have too many files open""" |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
671 assert 0 < self._counter |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
672 assert self._copies is None |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
673 assert self._dst_dir is None |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
674 self._copies = {} |
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
675 self._dst_dir = pycompat.mkdtemp(prefix=b'hg-clone-') |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
676 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
677 def _flush_some_on_disk(self) -> None: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
678 """move some of the open files to tempory files on disk""" |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
679 if self._copies is None: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
680 self._init_tmp_copies() |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
681 flush_count = self.MAX_OPEN // 2 |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
682 for src, (size, fp) in sorted(self._volatile_fps.items())[:flush_count]: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
683 prefix = os.path.basename(src) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
684 fd, dst = pycompat.mkstemp(prefix=prefix, dir=self._dst_dir) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
685 self._copies[src] = dst |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
686 os.close(fd) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
687 # we no longer hardlink, but on the other hand we rarely do this, |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
688 # and we do it for the smallest file only and not at all in the |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
689 # common case. |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
690 with open(dst, 'wb') as bck: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
691 fp.seek(0) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
692 bck.write(fp.read()) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
693 del self._volatile_fps[src] |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
694 fp.close() |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
695 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
696 def _keep_one(self, src: bytes) -> int: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
697 """preserve an open file handle for a given path""" |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
698 # store the file quickly to ensure we close it if any error happens |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
699 _, fp = self._volatile_fps[src] = (None, open(src, 'rb')) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
700 fp.seek(0, os.SEEK_END) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
701 size = fp.tell() |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
702 self._volatile_fps[src] = (size, fp) |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
703 return size |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
704 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
705 def __call__(self, src: bytes) -> None: |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
706 """preserve the volatile file at src""" |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
707 assert 0 < self._counter |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
708 if len(self._volatile_fps) >= (self.MAX_OPEN - 1): |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
709 self._flush_some_on_disk() |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
710 self._keep_one(src) |
50627
8c7b04e69894
stream-clone: introduce a richer TempCopyManager object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50521
diff
changeset
|
711 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
712 def try_keep(self, src: bytes) -> Optional[int]: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
713 """record a volatile file and returns it size |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
714 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
715 return None if the file does not exists. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
716 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
717 Used for cache file that are not lock protected. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
718 """ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
719 assert 0 < self._counter |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
720 if len(self._volatile_fps) >= (self.MAX_OPEN - 1): |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
721 self._flush_some_on_disk() |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
722 try: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
723 return self._keep_one(src) |
52640
24ee91ba9aa8
pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52359
diff
changeset
|
724 except OSError as err: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
725 if err.errno not in (errno.ENOENT, errno.EPERM): |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
726 raise |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
727 return None |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
728 |
52013
0ad269e24075
stream: open volatile file through the manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52012
diff
changeset
|
729 @contextlib.contextmanager |
0ad269e24075
stream: open volatile file through the manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52012
diff
changeset
|
730 def open(self, src): |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
731 assert 0 < self._counter |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
732 entry = self._volatile_fps.get(src) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
733 if entry is not None: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
734 _size, fp = entry |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
735 fp.seek(0) |
52013
0ad269e24075
stream: open volatile file through the manager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52012
diff
changeset
|
736 yield fp |
52015
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
737 else: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
738 if self._copies is None: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
739 actual_path = src |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
740 else: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
741 actual_path = self._copies.get(src, src) |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
742 with open(actual_path, 'rb') as fp: |
a47f09da8bd1
stream: prefer keeping an open file handle to volatile file instead of copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52014
diff
changeset
|
743 yield fp |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
744 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
745 |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
746 def _makemap(repo): |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
747 """make a (src -> vfs) map for the repo""" |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
748 vfsmap = { |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
749 _srcstore: repo.svfs, |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
750 _srccache: repo.cachevfs, |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
751 } |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
752 # we keep repo.vfs out of the on purpose, ther are too many danger there |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
753 # (eg: .hg/hgrc) |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
754 assert repo.vfs not in vfsmap.values() |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
755 |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
756 return vfsmap |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
757 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
758 |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
759 def _emit2(repo, entries): |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
760 """actually emit the stream bundle""" |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
761 vfsmap = _makemap(repo) |
47502
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
762 # we keep repo.vfs out of the on purpose, ther are too many danger there |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
763 # (eg: .hg/hgrc), |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
764 # |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
765 # this assert is duplicated (from _makemap) as author might think this is |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
766 # fine, while this is really not fine. |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
767 if repo.vfs in vfsmap.values(): |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
768 raise error.ProgrammingError( |
52696
10e7adbffa8c
streamclone: unbyteify string args to builtin Error classes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52695
diff
changeset
|
769 'repo.vfs must not be added to vfsmap for security reasons' |
47502
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
770 ) |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
771 |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
772 # translate the vfs one |
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
773 entries = [(vfs_key, vfsmap[vfs_key], e) for (vfs_key, e) in entries] |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
774 _test_sync_point_walk_1_2(repo) |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
775 |
50637
9caa860dcbec
stream-clone: implement decidated `get_streams` method for revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50636
diff
changeset
|
776 max_linkrev = len(repo) |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
777 file_count = totalfilesize = 0 |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
778 with VolatileManager() as volatiles: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
779 # make sure we preserve volatile files |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
780 with util.nogc(): |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
781 # record the expected size of every file |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
782 for k, vfs, e in entries: |
52357
a260d326458f
stream: create a `e.preserve_volatiles` method directly on StoreEntry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52356
diff
changeset
|
783 e.preserve_volatiles(vfs, volatiles) |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
784 for f in e.files(): |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
785 file_count += 1 |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
786 totalfilesize += f.file_size(vfs) |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
787 |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
788 progress = repo.ui.makeprogress( |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
789 _(b'bundle'), total=totalfilesize, unit=_(b'bytes') |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
790 ) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
791 progress.update(0) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
792 with progress: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
793 # the first yield release the lock on the repository |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
794 yield file_count, totalfilesize |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
795 totalbytecount = 0 |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
796 |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
797 for src, vfs, e in entries: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
798 entry_streams = e.get_streams( |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
799 repo=repo, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
800 vfs=vfs, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
801 volatiles=volatiles, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
802 max_changeset=max_linkrev, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
803 preserve_file_count=True, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
804 ) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
805 for name, stream, size in entry_streams: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
806 yield src |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
807 yield util.uvarintencode(len(name)) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
808 yield util.uvarintencode(size) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
809 yield name |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
810 bytecount = 0 |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
811 for chunk in stream: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
812 bytecount += len(chunk) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
813 totalbytecount += len(chunk) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
814 progress.update(totalbytecount) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
815 yield chunk |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
816 if bytecount != size: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
817 # Would most likely be caused by a race due to `hg |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
818 # strip` or a revlog split |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
819 msg = _( |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
820 b'clone could only read %d bytes from %s, but ' |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
821 b'expected %d bytes' |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
822 ) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
823 raise error.Abort(msg % (bytecount, name, size)) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
824 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
825 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
826 def _emit3(repo, entries) -> Iterator[bytes | None]: |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
827 """actually emit the stream bundle (v3)""" |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
828 vfsmap = _makemap(repo) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
829 # we keep repo.vfs out of the map on purpose, ther are too many dangers |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
830 # there (eg: .hg/hgrc), |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
831 # |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
832 # this assert is duplicated (from _makemap) as authors might think this is |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
833 # fine, while this is really not fine. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
834 if repo.vfs in vfsmap.values(): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
835 raise error.ProgrammingError( |
52696
10e7adbffa8c
streamclone: unbyteify string args to builtin Error classes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52695
diff
changeset
|
836 'repo.vfs must not be added to vfsmap for security reasons' |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
837 ) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
838 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
839 # translate the vfs once |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
840 # we only turn this into a list for the `_test_sync`, this is not ideal |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
841 base_entries = list(entries) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
842 _test_sync_point_walk_1_2(repo) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
843 entries = [] |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
844 with VolatileManager() as volatiles: |
52012
e308439339e2
stream: rename TempCopyManager to VolatileManager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51859
diff
changeset
|
845 # make sure we preserve volatile files |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
846 for vfs_key, e in base_entries: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
847 vfs = vfsmap[vfs_key] |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
848 any_files = True |
51549
49faa72b994e
streamclone: stop listing files for entries that have no volatile files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51548
diff
changeset
|
849 if e.maybe_volatile: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
850 any_files = False |
52357
a260d326458f
stream: create a `e.preserve_volatiles` method directly on StoreEntry
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52356
diff
changeset
|
851 e.preserve_volatiles(vfs, volatiles) |
51549
49faa72b994e
streamclone: stop listing files for entries that have no volatile files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51548
diff
changeset
|
852 for f in e.files(): |
49faa72b994e
streamclone: stop listing files for entries that have no volatile files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51548
diff
changeset
|
853 if f.is_volatile: |
49faa72b994e
streamclone: stop listing files for entries that have no volatile files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51548
diff
changeset
|
854 # record the expected size under lock |
49faa72b994e
streamclone: stop listing files for entries that have no volatile files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51548
diff
changeset
|
855 f.file_size(vfs) |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
856 any_files = True |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
857 if any_files: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
858 entries.append((vfs_key, vfsmap[vfs_key], e)) |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
859 |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
860 total_entry_count = len(entries) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
861 |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
862 max_linkrev = len(repo) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
863 progress = repo.ui.makeprogress( |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
864 _(b'bundle'), |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
865 total=total_entry_count, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
866 unit=_(b'entry'), |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
867 ) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
868 progress.update(0) |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
869 # the first yield release the lock on the repository |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
870 yield None |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
871 with progress: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
872 yield util.uvarintencode(total_entry_count) |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
873 |
52356
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
874 for src, vfs, e in entries: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
875 entry_streams = e.get_streams( |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
876 repo=repo, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
877 vfs=vfs, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
878 volatiles=volatiles, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
879 max_changeset=max_linkrev, |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
880 ) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
881 yield util.uvarintencode(len(entry_streams)) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
882 for name, stream, size in entry_streams: |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
883 yield src |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
884 yield util.uvarintencode(len(name)) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
885 yield util.uvarintencode(size) |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
886 yield name |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
887 yield from stream |
46574e588017
stream: start the volatile manager sooner during emission
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52184
diff
changeset
|
888 progress.increment() |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
889 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
890 |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
891 def _test_sync_point_walk_1_2(repo): |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
892 """a function for synchronisation during tests |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
893 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
894 Triggered after gather entry, but before starting to process/preserve them |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
895 under lock. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
896 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
897 (on v1 is triggered before the actual walk start) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
898 """ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
899 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
900 |
52358
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
901 def _test_sync_point_walk_3(repo): |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
902 """a function for synchronisation during tests |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
903 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
904 Triggered right before releasing the lock, but after computing what need |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
905 needed to compute under lock. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
906 """ |
46986
faa43f09ad98
streamclone: remove sleep based "synchronisation" in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46895
diff
changeset
|
907 |
faa43f09ad98
streamclone: remove sleep based "synchronisation" in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46895
diff
changeset
|
908 |
52358
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
909 def _test_sync_point_walk_4(repo): |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
910 """a function for synchronisation during tests |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
911 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
912 Triggered right after releasing the lock. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
913 """ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
914 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
915 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
916 # not really a StoreEntry, but close enough |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
917 class CacheEntry(store.SimpleStoreEntry): |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
918 """Represent an entry for Cache files |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
919 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
920 It has special logic to preserve cache file early and accept optional |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
921 presence. |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
922 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
923 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
924 (Yes... this is not really a StoreEntry, but close enough. We could have a |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
925 BaseEntry base class, bbut the store one would be identical) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
926 """ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
927 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
928 def __init__(self, entry_path) -> None: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
929 super().__init__( |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
930 entry_path, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
931 # we will directly deal with that in `setup_cache_file` |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
932 is_volatile=True, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
933 ) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
934 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
935 def preserve_volatiles(self, vfs, volatiles) -> None: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
936 self._file_size = volatiles.try_keep(vfs.join(self._entry_path)) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
937 if self._file_size is None: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
938 self._files = [] |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
939 else: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
940 assert self._is_volatile |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
941 self._files = [ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
942 CacheFile( |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
943 unencoded_path=self._entry_path, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
944 file_size=self._file_size, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
945 is_volatile=self._is_volatile, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
946 ) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
947 ] |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
948 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
949 def files(self) -> list[store.StoreFile]: |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
950 if self._files is None: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
951 self._files = [ |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
952 CacheFile( |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
953 unencoded_path=self._entry_path, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
954 is_volatile=self._is_volatile, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
955 ) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
956 ] |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
957 return super().files() |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
958 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
959 |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
960 class CacheFile(store.StoreFile): |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
961 # inform the "copy/hardlink" version that this file might be missing |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
962 # without consequences. |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
963 optional: bool = True |
46986
faa43f09ad98
streamclone: remove sleep based "synchronisation" in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46895
diff
changeset
|
964 |
faa43f09ad98
streamclone: remove sleep based "synchronisation" in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46895
diff
changeset
|
965 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
966 def _entries_walk(repo, includes, excludes, includeobsmarkers: bool): |
50512
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
967 """emit a seris of files information useful to clone a repo |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
968 |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
969 return (vfs-key, entry) iterator |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
970 |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
971 Where `entry` is StoreEntry. (used even for cache entries) |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
972 """ |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
973 assert repo._currentlock(repo._lockref) is not None |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
974 |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
975 matcher = None |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
976 if includes or excludes: |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
977 matcher = narrowspec.match(repo.root, includes, excludes) |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
978 |
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
979 phase = not repo.publishing() |
51547
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
980 # Python is getting crazy at all the small container we creates, disabling |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
981 # the gc while we do so helps performance a lot. |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
982 with util.nogc(): |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
983 entries = _walkstreamfiles( |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
984 repo, |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
985 matcher, |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
986 phase=phase, |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
987 obsolescence=includeobsmarkers, |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
988 ) |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
989 for entry in entries: |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
990 yield (_srcstore, entry) |
50512
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
991 |
51547
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
992 for name in cacheutil.cachetocopy(repo): |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
993 if repo.cachevfs.exists(name): |
463e63aa547c
stream-clone: disable gc for `_entries_walk` duration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51545
diff
changeset
|
994 # not really a StoreEntry, but close enough |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
995 yield (_srccache, CacheEntry(entry_path=name)) |
50513
43ed1f12b00a
stream-clone: yield cache entry in `_entries_walk` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50512
diff
changeset
|
996 |
50512
06d580b8f432
stream-clone: introduce a _entries_walk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50511
diff
changeset
|
997 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
998 def generatev2(repo, includes, excludes, includeobsmarkers: bool): |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
999 """Emit content for version 2 of a streaming clone. |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1000 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1001 the data stream consists the following entries: |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1002 1) A char representing the file destination (eg: store or cache) |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1003 2) A varint containing the length of the filename |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1004 3) A varint containing the length of file data |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1005 4) N bytes containing the filename (the internal, store-agnostic form) |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1006 5) N bytes containing the file data |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1007 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1008 Returns a 3-tuple of (file count, file size, data iterator). |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1009 """ |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1010 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1011 with repo.lock(): |
47444
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1012 repo.ui.debug(b'scanning\n') |
40339
f0e8f27768eb
streamclone: pass narrowing related info in _walkstreamfiles()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
40338
diff
changeset
|
1013 |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
1014 entries = _entries_walk( |
47444
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1015 repo, |
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1016 includes=includes, |
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1017 excludes=excludes, |
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1018 includeobsmarkers=includeobsmarkers, |
2f4ca4807033
streamingclone: extract the scanning part from the generation part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1019 ) |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
1020 chunks = _emit2(repo, entries) |
35765
56c30b31afbe
streamclone: add support for cloning non append-only file
Boris Feld <boris.feld@octobus.net>
parents:
35757
diff
changeset
|
1021 first = next(chunks) |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
1022 file_count, total_file_size = first |
52358
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
1023 _test_sync_point_walk_3(repo) |
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
1024 _test_sync_point_walk_4(repo) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1025 |
50632
3416b46320dc
stream-clone: directly use `_entries_walk` to generate stream-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50631
diff
changeset
|
1026 return file_count, total_file_size, chunks |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1027 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1028 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1029 def generatev3( |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1030 repo, includes, excludes, includeobsmarkers: bool |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1031 ) -> Iterator[bytes | None]: |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1032 """Emit content for version 3 of a streaming clone. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1033 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1034 the data stream consists the following: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1035 1) A varint E containing the number of entries (can be 0), then E entries follow |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1036 2) For each entry: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1037 2.1) The number of files in this entry (can be 0, but typically 1 or 2) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1038 2.2) For each file: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1039 2.2.1) A char representing the file destination (eg: store or cache) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1040 2.2.2) A varint N containing the length of the filename |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1041 2.2.3) A varint M containing the length of file data |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1042 2.2.4) N bytes containing the filename (the internal, store-agnostic form) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1043 2.2.5) M bytes containing the file data |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1044 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1045 Returns the data iterator. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1046 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1047 XXX This format is experimental and subject to change. Here is a |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1048 XXX non-exhaustive list of things this format could do or change: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1049 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1050 - making it easier to write files in parallel |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1051 - holding the lock for a shorter time |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1052 - improving progress information |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1053 - ways to adjust the number of expected entries/files ? |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1054 """ |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1055 |
51548
6e4c8366c5ce
stream-clone: disable gc for the initial section for the v3 format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51547
diff
changeset
|
1056 # Python is getting crazy at all the small container we creates while |
6e4c8366c5ce
stream-clone: disable gc for the initial section for the v3 format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51547
diff
changeset
|
1057 # considering the files to preserve, disabling the gc while we do so helps |
6e4c8366c5ce
stream-clone: disable gc for the initial section for the v3 format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51547
diff
changeset
|
1058 # performance a lot. |
6e4c8366c5ce
stream-clone: disable gc for the initial section for the v3 format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51547
diff
changeset
|
1059 with repo.lock(), util.nogc(): |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1060 repo.ui.debug(b'scanning\n') |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1061 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1062 entries = _entries_walk( |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1063 repo, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1064 includes=includes, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1065 excludes=excludes, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1066 includeobsmarkers=includeobsmarkers, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1067 ) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1068 chunks = _emit3(repo, list(entries)) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1069 first = next(chunks) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1070 assert first is None |
52358
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
1071 _test_sync_point_walk_3(repo) |
11484a19cd77
stream: rename all test hook point one number up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52357
diff
changeset
|
1072 _test_sync_point_walk_4(repo) |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1073 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1074 return chunks |
50521
58adcabc295f
stream-clone: introduce the notion of an experimental "v3" version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50520
diff
changeset
|
1075 |
58adcabc295f
stream-clone: introduce the notion of an experimental "v3" version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50520
diff
changeset
|
1076 |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1077 @contextlib.contextmanager |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1078 def nested(*ctxs): |
39757
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1079 this = ctxs[0] |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1080 rest = ctxs[1:] |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1081 with this: |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1082 if rest: |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1083 with nested(*rest): |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1084 yield |
97f2992c26f6
streamclone: reimplement nested context manager
Augie Fackler <augie@google.com>
parents:
39700
diff
changeset
|
1085 else: |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1086 yield |
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1087 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1088 |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1089 class V2Report: |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1090 """a small class to track the data we saw within the stream""" |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1091 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1092 def __init__(self): |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1093 self.byte_count = 0 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1094 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1095 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1096 def consumev2(repo, fp, filecount: int, filesize: int) -> None: |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1097 """Apply the contents from a version 2 streaming clone. |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1098 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1099 Data is read from an object that only needs to provide a ``read(size)`` |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1100 method. |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1101 """ |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1102 with repo.lock(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1103 repo.ui.status( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1104 _(b'%d files to transfer, %s of data\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1105 % (filecount, util.bytecount(filesize)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1106 ) |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1107 progress = repo.ui.makeprogress( |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1108 _(b'clone'), |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1109 total=filesize, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1110 unit=_(b'bytes'), |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1111 ) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1112 start = util.timer() |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1113 report = V2Report() |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1114 |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1115 vfsmap = _makemap(repo) |
47502
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1116 # we keep repo.vfs out of the on purpose, ther are too many danger |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1117 # there (eg: .hg/hgrc), |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1118 # |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1119 # this assert is duplicated (from _makemap) as author might think this |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1120 # is fine, while this is really not fine. |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1121 if repo.vfs in vfsmap.values(): |
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1122 raise error.ProgrammingError( |
52696
10e7adbffa8c
streamclone: unbyteify string args to builtin Error classes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52695
diff
changeset
|
1123 'repo.vfs must not be added to vfsmap for security reasons' |
47502
65c519661991
stream: double check that self.vfs is *not* in the vfsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46989
diff
changeset
|
1124 ) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1125 |
52913
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
1126 cpu_profile = scmutil.get_resource_profile(repo.ui, b'cpu') |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1127 mem_profile = scmutil.get_resource_profile(repo.ui, b'memory') |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1128 threaded = repo.ui.configbool( |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1129 b"worker", b"parallel-stream-bundle-processing" |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1130 ) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1131 num_writer = repo.ui.configint( |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1132 b"worker", |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1133 b"parallel-stream-bundle-processing.num-writer", |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1134 ) |
52913
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
1135 if num_writer <= 0: |
58baa86c7a02
stream-clone-v2: make the number of writer dependent of usage config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52912
diff
changeset
|
1136 num_writer = DEFAULT_NUM_WRITER[cpu_profile] |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1137 memory_target = repo.ui.configbytes( |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1138 b"worker", |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1139 b"parallel-stream-bundle-processing.memory-target", |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1140 ) |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1141 if memory_target < 0: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1142 memory_target = None |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1143 elif memory_target == 0: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1144 memory_target = DEFAULT_MEMORY_TARGET[mem_profile] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1145 with repo.transaction(b'clone'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1146 ctxs = (vfs.backgroundclosing(repo.ui) for vfs in vfsmap.values()) |
35767
5f5fb279fd39
streamclone: also stream caches to the client
Boris Feld <boris.feld@octobus.net>
parents:
35765
diff
changeset
|
1147 with nested(*ctxs): |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1148 workers = [] |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1149 info_queue = None |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1150 data_queue = None |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1151 mark_used = None |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1152 try: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1153 if not threaded: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1154 fc = _FileChunker |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1155 raw_data = fp |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1156 else: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1157 fc = _ThreadSafeFileChunker |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1158 data_queue = _DataQueue(memory_target=memory_target) |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1159 mark_used = data_queue.mark_used |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1160 raw_data = util.chunkbuffer(data_queue) |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1161 |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1162 w = threading.Thread( |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1163 target=data_queue.fill_from, |
52917
9abf173a958b
stream-clone-v2: use the pass through for threaded stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52914
diff
changeset
|
1164 args=(fp,), |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1165 ) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1166 workers.append(w) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1167 w.start() |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1168 files = _v2_parse_files( |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1169 repo, |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1170 raw_data, |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1171 filecount, |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1172 progress, |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1173 report, |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1174 file_chunker=fc, |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1175 mark_used=mark_used, |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1176 ) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1177 if not threaded: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1178 _write_files(vfsmap, files) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1179 else: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1180 info_queue = _FileInfoQueue(files) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1181 |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1182 for __ in range(num_writer): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1183 w = threading.Thread( |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1184 target=_write_files, |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1185 args=(vfsmap, info_queue), |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1186 ) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1187 workers.append(w) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1188 w.start() |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1189 info_queue.fill() |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1190 except: # re-raises |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1191 if data_queue is not None: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1192 data_queue.abort() |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1193 raise |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1194 finally: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1195 # shut down all the workers |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1196 if info_queue is not None: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1197 # this is strictly speaking one too many worker for |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1198 # this queu, but closing too many is not a problem. |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1199 info_queue.close(len(workers)) |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1200 for w in workers: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1201 w.join() |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1202 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1203 # force @filecache properties to be reloaded from |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1204 # streamclone-ed file at next access |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1205 repo.invalidate(clearfilecache=True) |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1206 |
38373
ef692614e601
progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents:
38360
diff
changeset
|
1207 progress.complete() |
52703
2e82bd50978c
stream: acknowledge the end of the bundle part earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52702
diff
changeset
|
1208 # acknowledge the end of the bundle2 part, this help aligning |
2e82bd50978c
stream: acknowledge the end of the bundle part earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52702
diff
changeset
|
1209 # sequential and parallel behavior. |
2e82bd50978c
stream: acknowledge the end of the bundle part earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52702
diff
changeset
|
1210 remains = fp.read(1) |
2e82bd50978c
stream: acknowledge the end of the bundle part earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52702
diff
changeset
|
1211 assert not remains |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1212 _report_transferred(repo, start, filecount, report.byte_count) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1213 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1214 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1215 # iterator of chunk of bytes that constitute a file content. |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1216 FileChunksT = Iterator[bytes] |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1217 # Contains the information necessary to write stream file on disk |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1218 FileInfoT = Tuple[ |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1219 bytes, # vfs key |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1220 bytes, # file name (non-vfs-encoded) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1221 FileChunksT, # content |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1222 ] |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1223 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1224 |
52922
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1225 class _Queue: |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1226 """a reimplementation of queue.Queue which doesn't use thread.Condition""" |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1227 |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1228 def __init__(self): |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1229 self._queue = collections.deque() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1230 |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1231 # the "_lock" protect manipulation of the "_queue" deque |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1232 # the "_wait" is used to have the "get" thread waits for the |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1233 # "put" thread when the queue is empty. |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1234 # |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1235 # This is similar to the "threading.Condition", but without the absurd |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1236 # slowness of the stdlib implementation. |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1237 # |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1238 # the "_wait" is always released while holding the "_lock". |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1239 self._lock = threading.Lock() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1240 self._wait = threading.Lock() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1241 |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1242 def put(self, item): |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1243 with self._lock: |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1244 self._queue.append(item) |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1245 # if anyone is waiting on item, unblock it. |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1246 if self._wait.locked(): |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1247 self._wait.release() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1248 |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1249 def get(self): |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1250 with self._lock: |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1251 while len(self._queue) == 0: |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1252 # "arm" the waiting lock |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1253 self._wait.acquire(blocking=False) |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1254 # release the lock to let other touch the queue |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1255 # (especially the put call we wait on) |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1256 self._lock.release() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1257 # wait for for a `put` call to release the lock |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1258 self._wait.acquire() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1259 # grab the lock to look at a possible available value |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1260 self._lock.acquire() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1261 # disarm the lock if necessary. |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1262 if self._wait.locked(): |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1263 self._wait.release() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1264 return self._queue.popleft() |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1265 |
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1266 |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1267 class _DataQueue: |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1268 """A queue passing data from the bundle stream to other thread |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1269 |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1270 It has a "target_memory" optional parameter to avoid buffering too much |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1271 information. The implementation is not exact and the memory target might be |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1272 exceed for a time in some situation. |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1273 """ |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1274 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1275 def __init__(self, memory_target=None): |
52922
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1276 self._q = _Queue() |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1277 self._abort = False |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1278 self._memory_target = memory_target |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1279 if self._memory_target is not None and self._memory_target <= 0: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1280 raise error.ProgrammingError("memory target should be > 0") |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1281 |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1282 # the "_lock" protect manipulation of the _current_used" variable |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1283 # the "_wait" is used to have the "reading" thread waits for the |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1284 # "using" thread when the buffer is full. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1285 # |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1286 # This is similar to the "threading.Condition", but without the absurd |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1287 # slowness of the stdlib implementation. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1288 # |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1289 # the "_wait" is always released while holding the "_lock". |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1290 self._lock = threading.Lock() |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1291 self._wait = threading.Lock() |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1292 # only the stream reader touch this, it is find to touch without the lock |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1293 self._current_read = 0 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1294 # do not touch this without the lock |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1295 self._current_used = 0 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1296 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1297 def _has_free_space(self): |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1298 """True if more data can be read without further exceeding memory target |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1299 |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1300 Must be called under the lock. |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1301 """ |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1302 if self._memory_target is None: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1303 # Ideally we should not even get into the locking business in that |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1304 # case, but we keep the implementation simple for now. |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1305 return True |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1306 return (self._current_read - self._current_used) < self._memory_target |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1307 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1308 def mark_used(self, offset): |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1309 """Notify we have used the buffer up to "offset" |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1310 |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1311 This is meant to be used from another thread than the one filler the queue. |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1312 """ |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1313 with self._lock: |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1314 if offset > self._current_used: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1315 self._current_used = offset |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1316 # If the reader is waiting for room, unblock it. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1317 if self._wait.locked() and self._has_free_space(): |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1318 self._wait.release() |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1319 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1320 def fill_from(self, data): |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1321 """fill the data queue from a bundle2 part object |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1322 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1323 This is meant to be called by the data reading thread |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1324 """ |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1325 q = self._q |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1326 try: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1327 for item in data: |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1328 self._current_read += len(item) |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1329 q.put(item) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1330 if self._abort: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1331 break |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1332 with self._lock: |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1333 while not self._has_free_space(): |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1334 # make sure the _wait lock is locked |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1335 # this is done under lock, so there case be no race with the release logic |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1336 self._wait.acquire(blocking=False) |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1337 self._lock.release() |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1338 # acquiring the lock will block until some other thread release it. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1339 self._wait.acquire() |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1340 # lets dive into the locked section again |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1341 self._lock.acquire() |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1342 # make sure we release the lock we just grabed if |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1343 # needed. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1344 if self._wait.locked(): |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1345 self._wait.release() |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1346 finally: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1347 q.put(None) |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1348 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1349 def __iter__(self): |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1350 """Iterate over the bundle chunkgs |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1351 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1352 This is meant to be called by the data parsing thread.""" |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1353 q = self._q |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1354 while (i := q.get()) is not None: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1355 yield i |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1356 if self._abort: |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1357 break |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1358 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1359 def abort(self): |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1360 """stop the data-reading thread and interrupt the comsuming iteration |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1361 |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1362 This is meant to be called on errors. |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1363 """ |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1364 self._abort = True |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1365 self._q.put(None) |
52921
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1366 with self._lock: |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1367 # make sure we unstuck the reader thread. |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1368 if self._wait.locked(): |
363914ba328d
stream-clone-v2: no longer use the stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52920
diff
changeset
|
1369 self._wait.release() |
52914
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1370 |
d5ae681834e8
stream-clone-v2: also use a thread to read the streamed data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52913
diff
changeset
|
1371 |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1372 class _FileInfoQueue: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1373 """A thread-safe queue to passer parsed file information to the writers""" |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1374 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1375 def __init__(self, info: Iterable[FileInfoT]): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1376 self._info = info |
52922
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1377 self._q = _Queue() |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1378 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1379 def fill(self): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1380 """iterate over the parsed information to file the queue |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1381 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1382 This is meant to be call from the thread parsing the stream information. |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1383 """ |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1384 q = self._q |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1385 for i in self._info: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1386 q.put(i) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1387 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1388 def close(self, number_worker): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1389 """signal all the workers that we no longer have any file info coming |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1390 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1391 Called from the thread parsing the stream information (and/or the main |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1392 thread if different). |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1393 """ |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1394 for __ in range(number_worker): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1395 self._q.put(None) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1396 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1397 def __iter__(self): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1398 """iterate over the available file info |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1399 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1400 This is meant to be called from the writer threads. |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1401 """ |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1402 q = self._q |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1403 while (i := q.get()) is not None: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1404 yield i |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1405 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1406 |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1407 class _FileChunker: |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1408 """yield the chunk that constitute a file |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1409 |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1410 This class exists as the counterpart of the threaded version and |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1411 would not be very useful on its own. |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1412 """ |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1413 |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1414 def __init__( |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1415 self, |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1416 fp: bundle2mod.unbundlepart, |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1417 data_len: int, |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1418 progress: scmutil.progress, |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1419 report: V2Report, |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1420 mark_used: Optional[Callable[[int], None]] = None, |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1421 ): |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1422 self.report = report |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1423 self.progress = progress |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1424 self._chunks = util.filechunkiter(fp, limit=data_len) |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1425 |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1426 def fill(self) -> None: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1427 """Do nothing in non-threading context""" |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1428 |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1429 def __iter__(self) -> FileChunksT: |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1430 for chunk in self._chunks: |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1431 self.report.byte_count += len(chunk) |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1432 self.progress.increment(step=len(chunk)) |
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1433 yield chunk |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1434 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1435 |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1436 class _ThreadSafeFileChunker(_FileChunker): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1437 """yield the chunk that constitute a file |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1438 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1439 Make sure you call the "fill" function in the main thread to read the |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1440 right data at the right time. |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1441 """ |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1442 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1443 def __init__( |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1444 self, |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1445 fp: bundle2mod.unbundlepart, |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1446 data_len: int, |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1447 progress: scmutil.progress, |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1448 report: V2Report, |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1449 mark_used: Optional[Callable[[int], None]] = None, |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1450 ): |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1451 super().__init__(fp, data_len, progress, report) |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1452 self._fp = fp |
52922
0af8965b668a
stream-clone-v2: use a Queue implementation without a stdlib Condition object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52921
diff
changeset
|
1453 self._queue = _Queue() |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1454 self._mark_used = mark_used |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1455 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1456 def fill(self) -> None: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1457 """fill the file chunker queue with data read from the stream |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1458 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1459 This is meant to be called from the thread parsing information (and |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1460 consuming the stream data). |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1461 """ |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1462 try: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1463 for chunk in super().__iter__(): |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1464 offset = self._fp.tell() |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1465 self._queue.put((chunk, offset)) |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1466 finally: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1467 self._queue.put(None) |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1468 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1469 def __iter__(self) -> FileChunksT: |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1470 """Iterate over all the file chunk |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1471 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1472 This is meant to be called from the writer threads. |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1473 """ |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1474 while (info := self._queue.get()) is not None: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1475 chunk, offset = info |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1476 if self._mark_used is not None: |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1477 self._mark_used(offset) |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1478 yield chunk |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1479 |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1480 |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1481 def _v2_parse_files( |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1482 repo, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1483 fp: bundle2mod.unbundlepart, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1484 file_count: int, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1485 progress: scmutil.progress, |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1486 report: V2Report, |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1487 file_chunker: Type[_FileChunker] = _FileChunker, |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1488 mark_used: Optional[Callable[[int], None]] = None, |
52909
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1489 ) -> Iterator[FileInfoT]: |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1490 """do the "stream-parsing" part of stream v2 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1491 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1492 The parsed information are yield result for consumption by the "writer" |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1493 """ |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1494 progress.update(0) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1495 for i in range(file_count): |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1496 src = util.readexactly(fp, 1) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1497 namelen = util.uvarintdecodestream(fp) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1498 datalen = util.uvarintdecodestream(fp) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1499 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1500 name = util.readexactly(fp, namelen) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1501 |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1502 if repo.ui.debugflag: |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1503 repo.ui.debug( |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1504 b'adding [%s] %s (%s)\n' % (src, name, util.bytecount(datalen)) |
3ee343dd3abf
stream-clone-v2: extract the stream parsing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52703
diff
changeset
|
1505 ) |
52920
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1506 chunks = file_chunker( |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1507 fp, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1508 datalen, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1509 progress, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1510 report, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1511 mark_used=mark_used, |
aee193b1c784
stream-clone-v2: introduce a way to limit memory usage of the threaded version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52917
diff
changeset
|
1512 ) |
52911
307c4a0b91a0
stream-clone-v2: turn the file chunking function into a class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52910
diff
changeset
|
1513 yield (src, name, iter(chunks)) |
52912
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1514 # make sure we read all the chunk before moving to the next file |
7f848cfc4286
stream-clone-v2: use dedicated threads to write the data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52911
diff
changeset
|
1515 chunks.fill() |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1516 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1517 |
52910
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1518 def _write_files(vfsmap, info: Iterable[FileInfoT]): |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1519 """write files from parsed data""" |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1520 for src, name, data in info: |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1521 vfs = vfsmap[src] |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1522 with vfs(name, b'w') as ofp: |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1523 for chunk in data: |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1524 ofp.write(chunk) |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1525 |
70306aefa52b
stream-clone-v2: extract the file writing code in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52909
diff
changeset
|
1526 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1527 def consumev3(repo, fp) -> None: |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1528 """Apply the contents from a version 3 streaming clone. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1529 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1530 Data is read from an object that only needs to provide a ``read(size)`` |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1531 method. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1532 """ |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1533 with repo.lock(): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1534 start = util.timer() |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1535 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1536 entrycount = util.uvarintdecodestream(fp) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1537 repo.ui.status(_(b'%d entries to transfer\n') % (entrycount)) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1538 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1539 progress = repo.ui.makeprogress( |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1540 _(b'clone'), |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1541 total=entrycount, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1542 unit=_(b'entries'), |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1543 ) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1544 progress.update(0) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1545 bytes_transferred = 0 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1546 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1547 vfsmap = _makemap(repo) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1548 # we keep repo.vfs out of the on purpose, there are too many dangers |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1549 # there (eg: .hg/hgrc), |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1550 # |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1551 # this assert is duplicated (from _makemap) as authors might think this |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1552 # is fine, while this is really not fine. |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1553 if repo.vfs in vfsmap.values(): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1554 raise error.ProgrammingError( |
52696
10e7adbffa8c
streamclone: unbyteify string args to builtin Error classes
Matt Harbison <matt_harbison@yahoo.com>
parents:
52695
diff
changeset
|
1555 'repo.vfs must not be added to vfsmap for security reasons' |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1556 ) |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
1557 total_file_count = 0 |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1558 with repo.transaction(b'clone'): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1559 ctxs = (vfs.backgroundclosing(repo.ui) for vfs in vfsmap.values()) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1560 with nested(*ctxs): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1561 for i in range(entrycount): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1562 filecount = util.uvarintdecodestream(fp) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1563 if filecount == 0: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1564 if repo.ui.debugflag: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1565 repo.ui.debug(b'entry with no files [%d]\n' % (i)) |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
1566 total_file_count += filecount |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1567 for i in range(filecount): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1568 src = util.readexactly(fp, 1) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1569 vfs = vfsmap[src] |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1570 namelen = util.uvarintdecodestream(fp) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1571 datalen = util.uvarintdecodestream(fp) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1572 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1573 name = util.readexactly(fp, namelen) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1574 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1575 if repo.ui.debugflag: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1576 msg = b'adding [%s] %s (%s)\n' |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1577 msg %= (src, name, util.bytecount(datalen)) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1578 repo.ui.debug(msg) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1579 bytes_transferred += datalen |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1580 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1581 with vfs(name, b'w') as ofp: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1582 for chunk in util.filechunkiter(fp, limit=datalen): |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1583 ofp.write(chunk) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1584 progress.increment(step=1) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1585 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1586 # force @filecache properties to be reloaded from |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1587 # streamclone-ed file at next access |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1588 repo.invalidate(clearfilecache=True) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1589 |
52701
6feb3b3029b5
stream: consistently close progress before reporting time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52700
diff
changeset
|
1590 progress.complete() |
52702
ca17d31624ac
stream: report number of file written then information is available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52701
diff
changeset
|
1591 _report_transferred(repo, start, total_file_count, bytes_transferred) |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1592 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1593 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1594 def applybundlev2( |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1595 repo, fp, filecount: int, filesize: int, requirements: Iterable[bytes] |
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1596 ) -> None: |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
1597 from . import localrepo |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
1598 |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1599 missingreqs = [r for r in requirements if r not in repo.supported] |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1600 if missingreqs: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1601 raise error.Abort( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43085
diff
changeset
|
1602 _(b'unable to apply stream clone: unsupported format: %s') |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1603 % b', '.join(sorted(missingreqs)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1604 ) |
35756
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1605 |
cfdccd560b66
streamclone: define first iteration of version 2 of stream format
Boris Feld <boris.feld@octobus.net>
parents:
35491
diff
changeset
|
1606 consumev2(repo, fp, filecount, filesize) |
35804
2d3e486d09d0
streamclone: move requirement update into consumev2
Boris Feld <boris.feld@octobus.net>
parents:
35803
diff
changeset
|
1607 |
48596
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
1608 repo.requirements = new_stream_clone_requirements( |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
1609 repo.requirements, |
739f2ca3aa3f
stream-clone: factor computation of new clone requirement out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47878
diff
changeset
|
1610 requirements, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1611 ) |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38783
diff
changeset
|
1612 repo.svfs.options = localrepo.resolvestorevfsoptions( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1613 repo.ui, repo.requirements, repo.features |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42813
diff
changeset
|
1614 ) |
45106
a03c177a4679
scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
43117
diff
changeset
|
1615 scmutil.writereporequirements(repo) |
48693
de3ac3d2c60b
stream-clone: allow to change persistent-nodemap format during stream clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48681
diff
changeset
|
1616 nodemap.post_stream_cleanup(repo) |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1617 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1618 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1619 def applybundlev3(repo, fp, requirements: Iterable[bytes]) -> None: |
50703
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1620 from . import localrepo |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1621 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1622 missingreqs = [r for r in requirements if r not in repo.supported] |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1623 if missingreqs: |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1624 msg = _(b'unable to apply stream clone: unsupported format: %s') |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1625 msg %= b', '.join(sorted(missingreqs)) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1626 raise error.Abort(msg) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1627 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1628 consumev3(repo, fp) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1629 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1630 repo.requirements = new_stream_clone_requirements( |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1631 repo.requirements, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1632 requirements, |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1633 ) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1634 repo.svfs.options = localrepo.resolvestorevfsoptions( |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1635 repo.ui, repo.requirements, repo.features |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1636 ) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1637 scmutil.writereporequirements(repo) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1638 nodemap.post_stream_cleanup(repo) |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1639 |
0452af304808
stream-clone: add a v3 version of the protocol
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50663
diff
changeset
|
1640 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1641 def _copy_files(src_vfs_map, dst_vfs_map, entries, progress) -> bool: |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1642 hardlink = [True] |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1643 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1644 def copy_used(): |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1645 hardlink[0] = False |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1646 progress.topic = _(b'copying') |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1647 |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1648 for k, path, optional in entries: |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1649 src_vfs = src_vfs_map[k] |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1650 dst_vfs = dst_vfs_map[k] |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1651 src_path = src_vfs.join(path) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1652 dst_path = dst_vfs.join(path) |
47871
132525ead0db
clone: properly create target directories during local clone (issue6581)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47788
diff
changeset
|
1653 # We cannot use dirname and makedirs of dst_vfs here because the store |
132525ead0db
clone: properly create target directories during local clone (issue6581)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47788
diff
changeset
|
1654 # encoding confuses them. See issue 6581 for details. |
132525ead0db
clone: properly create target directories during local clone (issue6581)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47788
diff
changeset
|
1655 dirname = os.path.dirname(dst_path) |
132525ead0db
clone: properly create target directories during local clone (issue6581)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47788
diff
changeset
|
1656 if not os.path.exists(dirname): |
132525ead0db
clone: properly create target directories during local clone (issue6581)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47788
diff
changeset
|
1657 util.makedirs(dirname) |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1658 dst_vfs.register_file(path) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1659 # XXX we could use the #nb_bytes argument. |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1660 try: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1661 util.copyfile( |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1662 src_path, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1663 dst_path, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1664 hardlink=hardlink[0], |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1665 no_hardlink_cb=copy_used, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1666 check_fs_hardlink=False, |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1667 ) |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1668 except FileNotFoundError: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1669 if not optional: |
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1670 raise |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1671 progress.increment() |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1672 return hardlink[0] |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1673 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1674 |
52695
f5471af96a52
typing: add trivial type annotations to `mercurial/streamclone.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
52691
diff
changeset
|
1675 def local_copy(src_repo, dest_repo) -> None: |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1676 """copy all content from one local repository to another |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1677 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1678 This is useful for local clone""" |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1679 src_store_requirements = { |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1680 r |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1681 for r in src_repo.requirements |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1682 if r not in requirementsmod.WORKING_DIR_REQUIREMENTS |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1683 } |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1684 dest_store_requirements = { |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1685 r |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1686 for r in dest_repo.requirements |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1687 if r not in requirementsmod.WORKING_DIR_REQUIREMENTS |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1688 } |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1689 assert src_store_requirements == dest_store_requirements |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1690 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1691 with dest_repo.lock(): |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1692 with src_repo.lock(): |
47448
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1693 # bookmark is not integrated to the streaming as it might use the |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1694 # `repo.vfs` and they are too many sentitive data accessible |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1695 # through `repo.vfs` to expose it to streaming clone. |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1696 src_book_vfs = bookmarks.bookmarksvfs(src_repo) |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1697 srcbookmarks = src_book_vfs.join(b'bookmarks') |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1698 bm_count = 0 |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1699 if os.path.exists(srcbookmarks): |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1700 bm_count = 1 |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1701 |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1702 entries = _entries_walk( |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1703 src_repo, |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1704 includes=None, |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1705 excludes=None, |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1706 includeobsmarkers=True, |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1707 ) |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1708 entries = list(entries) |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1709 src_vfs_map = _makemap(src_repo) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1710 dest_vfs_map = _makemap(dest_repo) |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1711 total_files = sum(len(e[1].files()) for e in entries) + bm_count |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1712 progress = src_repo.ui.makeprogress( |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1713 topic=_(b'linking'), |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1714 total=total_files, |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1715 unit=_(b'files'), |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1716 ) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1717 # copy files |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1718 # |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1719 # We could copy the full file while the source repository is locked |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1720 # and the other one without the lock. However, in the linking case, |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1721 # this would also requires checks that nobody is appending any data |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1722 # to the files while we do the clone, so this is not done yet. We |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1723 # could do this blindly when copying files. |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1724 files = [ |
52359
3f0cf7bb3086
stream: preserve volatile cache early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52358
diff
changeset
|
1725 (vfs_key, f.unencoded_path, f.optional) |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1726 for vfs_key, e in entries |
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1727 for f in e.files() |
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1728 ] |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1729 hardlink = _copy_files(src_vfs_map, dest_vfs_map, files, progress) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1730 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1731 # copy bookmarks over |
47448
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1732 if bm_count: |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1733 dst_book_vfs = bookmarks.bookmarksvfs(dest_repo) |
d370256636fe
clone: also report the bookmark file as copied
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47447
diff
changeset
|
1734 dstbookmarks = dst_book_vfs.join(b'bookmarks') |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1735 util.copyfile(srcbookmarks, dstbookmarks) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1736 progress.complete() |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1737 if hardlink: |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1738 msg = b'linked %d files\n' |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1739 else: |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1740 msg = b'copied %d files\n' |
50630
f2ae815ae34c
local-clone: perform the hardlink/copy based from _entries_walk returns
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50627
diff
changeset
|
1741 src_repo.ui.debug(msg % total_files) |
47447
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1742 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1743 with dest_repo.transaction(b"localclone") as tr: |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1744 dest_repo.store.write(tr) |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1745 |
377d8fc20e34
clone: reuse the stream clone logic for local clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47444
diff
changeset
|
1746 # clean up transaction file as they do not make sense |
50288
d89eecf9605e
undo-files: no longer pass the `repo` to `cleanup_undo_files`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50286
diff
changeset
|
1747 transaction.cleanup_undo_files(dest_repo.ui.warn, dest_repo.vfs_map) |